From 0fba746fe27ecdba40793fd1213c561a1c78d7b4 Mon Sep 17 00:00:00 2001 From: Georg Hopp Date: Mon, 13 Feb 2012 09:39:21 +0100 Subject: [PATCH] first working version of content delivery from file....very crude... @TODO: rewrite complete response handline. --- assets/waldschrat.jpg | Bin 0 -> 79689 bytes include/http/message.h | 8 +- include/http/request.h | 2 - include/http/response/writer.h | 2 +- src/Makefile.am | 4 +- src/http/message.c | 4 +- .../{request => message}/has_keep_alive.c | 3 +- src/http/request/parser/get_body.c | 4 +- src/http/response/404.c | 8 +- src/http/response/to_string.c | 2 +- src/http/response/writer/write.c | 100 +++++++++++------ src/server/run.c | 101 ++++++++++++++++-- 12 files changed, 177 insertions(+), 61 deletions(-) create mode 100644 assets/waldschrat.jpg rename src/http/{request => message}/has_keep_alive.c (83%) diff --git a/assets/waldschrat.jpg b/assets/waldschrat.jpg new file mode 100644 index 0000000000000000000000000000000000000000..880d0147ff0acf9b6309522a2065e143ba519d17 GIT binary patch literal 79689 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%0DP}gr$O1Mt~cI!v+ZZYQ;6 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

1!A6-b$IroZ9ZX*6N1C%ImD9 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 Vpt!)@j%b@P+<86yXfGi@|Jj)}-faK? literal 0 HcmV?d00001 diff --git a/include/http/message.h b/include/http/message.h index 8b3459d..fa89b34 100644 --- a/include/http/message.h +++ b/include/http/message.h @@ -16,13 +16,13 @@ CLASS(HttpMessage) { HttpHeader header; HttpMessageType type; - union { - char * buffer; - int handle; - } body; + int handle; + char * body; int nbody; }; +char httpMessageHasKeepAlive(HttpMessage); + #endif // __HTTP_MESSAGE__ // vim: set ts=4 sw=4: diff --git a/include/http/request.h b/include/http/request.h index 79c346d..a0472ab 100644 --- a/include/http/request.h +++ b/include/http/request.h @@ -11,8 +11,6 @@ CLASS(HttpRequest) { char * uri; }; -char httpRequestHasKeepAlive(HttpRequest); - #endif /* __HTTP_REQUEST_H__ */ // vim: set ts=4 sw=4: diff --git a/include/http/response/writer.h b/include/http/response/writer.h index 31aa3d5..cfec228 100644 --- a/include/http/response/writer.h +++ b/include/http/response/writer.h @@ -27,7 +27,7 @@ CLASS(HttpResponseWriter) { HttpResponseState state; }; -size_t httpResponseWriterWrite(HttpResponseWriter, int); +HttpResponse httpResponseWriterWrite(HttpResponseWriter, int); #endif // __HTTP_RESPONSE_WRITER_H__ diff --git a/src/Makefile.am b/src/Makefile.am index 17b90e7..0275541 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -7,8 +7,8 @@ CLASS = class.c interface.c SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c SERVER = server.c server/run.c server/close_conn.c LOGGER = logger.c logger/stderr.c logger/syslog.c -MSG = http/message.c http/message/queue.c -REQ = http/request.c http/request/has_keep_alive.c +MSG = http/message.c http/message/queue.c http/message/has_keep_alive.c +REQ = http/request.c RESP = http/response.c http/response/404.c http/response/size_get.c \ http/response/to_string.c WRITER = http/response/writer.c http/response/writer/write.c diff --git a/src/http/message.c b/src/http/message.c index 5f4f1f3..c9a76a9 100644 --- a/src/http/message.c +++ b/src/http/message.c @@ -43,11 +43,11 @@ dtor(void * _this) switch (this->type) { case HTTP_MESSAGE_BUFFERED: - _free((void **)&((this->body).buffer)); + _free((void **)&(this->body)); break; case HTTP_MESSAGE_PIPED: - close((this->body).handle); + if (2 < this->handle) close(this->handle); break; default: diff --git a/src/http/request/has_keep_alive.c b/src/http/message/has_keep_alive.c similarity index 83% rename from src/http/request/has_keep_alive.c rename to src/http/message/has_keep_alive.c index e34f852..eb53474 100644 --- a/src/http/request/has_keep_alive.c +++ b/src/http/message/has_keep_alive.c @@ -7,9 +7,8 @@ char -httpRequestHasKeepAlive(HttpRequest request) +httpMessageHasKeepAlive(HttpMessage message) { - HttpMessage message = (HttpMessage)request; char * header; char * header_ptr; diff --git a/src/http/request/parser/get_body.c b/src/http/request/parser/get_body.c index 81fc8da..71d5b31 100644 --- a/src/http/request/parser/get_body.c +++ b/src/http/request/parser/get_body.c @@ -26,8 +26,8 @@ httpRequestParserGetBody(HttpRequestParser this) } if (REMAINS(this) >= message->nbody) { - (message->body).buffer = calloc(1, message->nbody + 1); - memcpy((message->body).buffer, + message->body = calloc(1, message->nbody + 1); + memcpy(message->body, this->cur_data, message->nbody); this->cur_data += message->nbody; diff --git a/src/http/response/404.c b/src/http/response/404.c index ed4e457..f59df29 100644 --- a/src/http/response/404.c +++ b/src/http/response/404.c @@ -37,10 +37,10 @@ httpResponse404() httpHeaderAdd(&(message->header), new(HttpHeader, "Server", "testserver")); - message->type = HTTP_MESSAGE_BUFFERED; - message->nbody = sizeof(RESP_DATA) - 1; - (message->body).buffer = calloc(1, sizeof(RESP_DATA)); - strcpy((message->body).buffer, RESP_DATA); + message->type = HTTP_MESSAGE_BUFFERED; + message->nbody = sizeof(RESP_DATA) - 1; + message->body = calloc(1, sizeof(RESP_DATA)); + strcpy(message->body, RESP_DATA); sprintf(buffer, "%d", message->nbody); httpHeaderAdd(&(message->header), diff --git a/src/http/response/to_string.c b/src/http/response/to_string.c index 770c18f..2f4571d 100644 --- a/src/http/response/to_string.c +++ b/src/http/response/to_string.c @@ -49,7 +49,7 @@ httpResponseToString(HttpResponse response, char * _string) *string++ = '\n'; if (HTTP_MESSAGE_BUFFERED == message->type) { - memcpy(string, (message->body).buffer, message->nbody); + memcpy(string, message->body, message->nbody); } return string; diff --git a/src/http/response/writer/write.c b/src/http/response/writer/write.c index a3dda7e..bf4fd8d 100644 --- a/src/http/response/writer/write.c +++ b/src/http/response/writer/write.c @@ -1,26 +1,31 @@ +#include #include #include #include #include +#include +#include #include "class.h" #include "interface/class.h" #include "http/response.h" #include "http/response/writer.h" -size_t +HttpResponse httpResponseWriterWrite(HttpResponseWriter this, int fd) { HttpMessageQueue respq = this->response_queue; int cont = 1; - size_t written = 0; + HttpResponse retval = NULL; while (cont) { switch (this->state) { case HTTP_RESPONSE_NO: if (NULL == this->cur_response && 0 < respq->nmsgs) { - this->cur_response = (HttpResponse)respq->msgs[0]; - memmove(respq->msgs, &(respq->msgs[1]), --respq->nmsgs); + retval = this->cur_response = (HttpResponse)respq->msgs[0]; + memmove(respq->msgs, + &(respq->msgs[1]), + sizeof(void*) * (--respq->nmsgs + 1)); this->state = HTTP_RESPONSE_START; } else { @@ -29,51 +34,86 @@ httpResponseWriterWrite(HttpResponseWriter this, int fd) break; case HTTP_RESPONSE_START: - if (NULL == this->buffer) { - this->nbuffer = httpResponseSizeGet(this->cur_response); - this->buffer = calloc(1, this->nbuffer); - httpResponseToString(this->cur_response, this->buffer); + if (HTTP_MESSAGE_PIPED == + ((HttpMessage)(this->cur_response))->type) { + struct stat st; + HttpMessage message = (HttpMessage)this->cur_response; + char buffer[200]; + + message->handle = + open("./assets/waldschrat.jpg", O_RDONLY); + fstat(message->handle, &st); + message->nbody = st.st_size; + + sprintf(buffer, "%d", message->nbody); + httpHeaderAdd(&(message->header), + new(HttpHeader, "Content-Length", buffer)); + } + + this->state = HTTP_RESPONSE_PIPE; + break; + + case HTTP_RESPONSE_PIPE: { - written = write(fd, this->buffer, this->nbuffer); + HttpMessage message = (HttpMessage)(this->cur_response); + size_t headsize = httpResponseSizeGet(this->cur_response); + + this->buffer = malloc(headsize + message->nbody); + httpResponseToString(this->cur_response, this->buffer); + this->rpipe = headsize; - if (-1 == written) { - free (this->buffer); - this->buffer = NULL; - return written; + if (HTTP_MESSAGE_PIPED == message->type && + 0 != message->handle) { + char * data = &(this->buffer[headsize]); + size_t togo = message->nbody; + + size_t rsize = read(message->handle, data, togo); + + while (rsize < togo) { + data += rsize; + togo -= rsize; + rsize = read(message->handle, data, togo); + } + + this->wpipe = 0; + this->rpipe += message->nbody; + close(message->handle); + message->handle = 0; } - if (written == this->nbuffer) { - if (HTTP_MESSAGE_BUFFERED == - ((HttpMessage)(this->cur_response))->type) { + { + char * data = &(this->buffer[this->wpipe]); + size_t written; + + written = write(fd, data, this->rpipe - this->wpipe); + data += written; + this->wpipe += written; + + if (this->rpipe == this->wpipe) { + this->rpipe = 0; + this->wpipe = 0; + free (this->buffer); + this->buffer = NULL; this->state = HTTP_RESPONSE_DONE; } else { - this->state = HTTP_RESPONSE_PIPE; + cont = 0; } } - else { - this->nbuffer -= written; - memmove(this->buffer, this->buffer + written, this->nbuffer); - cont = 0; - } } break; - case HTTP_RESPONSE_PIPE: - break; - case HTTP_RESPONSE_DONE: - free (this->buffer); - this->buffer = NULL; - delete(&(this->cur_response)); - this->state = HTTP_RESPONSE_NO; + this->state = HTTP_RESPONSE_NO; + this->cur_response = NULL; + cont = 0; break; } } - return written; + return retval; } // vim: set ts=4 sw=4: diff --git a/src/server/run.c b/src/server/run.c index c9069c0..17f0173 100644 --- a/src/server/run.c +++ b/src/server/run.c @@ -6,6 +6,9 @@ #include #include #include +#include +#include +#include #include "server.h" #include "socket.h" @@ -114,16 +117,78 @@ serverRun(Server this) * @TODO: for now simply remove request and send not found. * Make this sane. */ - HttpMessage response = (HttpMessage)httpResponse404(); + HttpRequest request = (HttpRequest)(reqq->msgs[j]); + HttpMessage response = NULL; + + if (0 == strcmp("GET", request->method) && + 0 == strcmp("/me/", request->uri)) { + const char foo[] = + "\n" + "\n" + "\n" + "200 - OK" + "

200 - OK

" + "" + ""; + char buffer[200]; + time_t t; + struct tm * tmp; + + response = (HttpMessage)new(HttpResponse, "HTTP/1.1", 200, "OK"); + + httpHeaderAdd(&(response->header), + new(HttpHeader, "Content-Type", "text/html")); + httpHeaderAdd(&(response->header), + new(HttpHeader, "Server", "testserver")); + + response->type = HTTP_MESSAGE_BUFFERED; + response->nbody = sizeof(foo) - 1; + response->body = calloc(1, sizeof(foo)); + strcpy(response->body, foo); + + sprintf(buffer, "%d", response->nbody); + httpHeaderAdd(&(response->header), + new(HttpHeader, "Content-Length", buffer)); + + t = time(NULL); + tmp = localtime(&t); + strftime(buffer, sizeof(buffer), "%a, %d %b %Y %T %Z", tmp); + httpHeaderAdd(&(response->header), + new(HttpHeader, "Date", buffer)); + } + else if (0 == strcmp("GET", request->method) && + 0 == strcmp("/image/", request->uri)) { + char buffer[200]; + time_t t; + struct tm * tmp; + + response = (HttpMessage)new( + HttpResponse, "HTTP/1.1", 200, "OK"); + + httpHeaderAdd(&(response->header), + new(HttpHeader, "Content-Type", "image/jpeg")); + httpHeaderAdd(&(response->header), + new(HttpHeader, "Server", "testserver")); + + response->type = HTTP_MESSAGE_PIPED; + + t = time(NULL); + tmp = localtime(&t); + strftime(buffer, sizeof(buffer), "%a, %d %b %Y %T %Z", tmp); + httpHeaderAdd(&(response->header), + new(HttpHeader, "Date", buffer)); + } + else { + response = (HttpMessage)httpResponse404(); + } - if (httpRequestHasKeepAlive((HttpRequest)reqq->msgs[j])) { - (this->conns)[fd].keep_alive = 1; + if (httpMessageHasKeepAlive(reqq->msgs[j])) { httpHeaderAdd( &(response->header), new(HttpHeader, "Connection", "Keep-Alive")); } else { - (this->conns)[fd].keep_alive = 0; httpHeaderAdd( &(response->header), new(HttpHeader, "Connection", "Close")); @@ -145,18 +210,32 @@ serverRun(Server this) * handle writes */ if (0 != ((this->fds)[i].revents & POLLOUT) && 0 < nwrites) { - int size; + HttpResponseWriter writer = + (HttpResponseWriter)(this->conns)[fd].writer; + HttpMessage message; events--; nwrites--; - size = streamWriterWrite((this->conns)[fd].writer, fd); + message = (HttpMessage)streamWriterWrite(writer, fd); - if ((this->conns)[fd].keep_alive) { - (this->fds)[i].events &= ~POLLOUT; - } - else { - serverCloseConn(this, i); + while (NULL != message) { + if (writer->state == HTTP_RESPONSE_NO) { + if (httpMessageHasKeepAlive(message)) { + delete(&message); + if (0 == writer->response_queue->nmsgs) { + (this->fds)[i].events &= ~POLLOUT; + break; + } + } + else { + delete(&message); + serverCloseConn(this, i); + break; + } + } + + message = (HttpMessage)streamWriterWrite(writer, fd); } } }