21 changed files with 204 additions and 113 deletions
-
8ChangeLog
-
4TODO
-
2include/http/request/parser.h
-
2include/http/response/writer.h
-
9include/http/worker.h
-
6include/server.h
-
4src/Makefile.am
-
3src/http/request/parser.c
-
4src/http/request/parser/parse.c
-
8src/http/request/parser/read.c
-
3src/http/response/writer.c
-
30src/http/response/writer/write.c
-
55src/http/worker.c
-
59src/http/worker/process.c
-
12src/http/worker/write.c
-
4src/server.c
-
3src/server/close_conn.c
-
3src/server/handle_accept.c
-
4src/server/read.c
-
86src/server/run.c
-
8src/testserver.c
@ -1,2 +1,6 @@ |
|||
VERY BIG TODO: |
|||
- give a contructor a way to fail, so that no object will be created at all |
|||
|
|||
- right now i will use long polling ajax calls when feedback from to the client |
|||
is needed. In the long term this should be changed to websockets (ws). But |
|||
right now ws specification is not final anyway. :) |
|||
@ -1,13 +1,20 @@ |
|||
#ifndef __HTTP_WORKER_H__ |
|||
#define __HTTP_WORKER_H__ |
|||
|
|||
#include <sys/types.h> |
|||
|
|||
#include "class.h" |
|||
#include "http/request/parser.h" |
|||
#include "http/response/writer.h" |
|||
|
|||
CLASS(HttpWorker) { |
|||
HttpRequestParser parser; |
|||
HttpRequestParser parser; |
|||
HttpResponseWriter writer; |
|||
}; |
|||
|
|||
size_t httpWorkerProcess(HttpWorker, int); |
|||
size_t httpWorkerWrite(HttpWorker, int); |
|||
|
|||
#endif // __HTTP_WORKER_H__ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,55 @@ |
|||
#include <stdarg.h> |
|||
|
|||
#include "class.h" |
|||
#include "http/worker.h" |
|||
#include "http/request/parser.h" |
|||
#include "http/response/writer.h" |
|||
|
|||
#include "interface/class.h" |
|||
#include "interface/stream_reader.h" |
|||
#include "interface/stream_writer.h" |
|||
|
|||
static |
|||
void |
|||
ctor(void * _this, va_list * params) |
|||
{ |
|||
HttpWorker this = _this; |
|||
|
|||
this->parser = new(HttpRequestParser); |
|||
this->writer = new(HttpResponseWriter); |
|||
} |
|||
|
|||
static |
|||
void |
|||
dtor(void * _this) |
|||
{ |
|||
HttpWorker this = _this; |
|||
|
|||
delete(&this->parser); |
|||
delete(&this->writer); |
|||
} |
|||
|
|||
static |
|||
void |
|||
_clone(void * _this, void * _base) |
|||
{ |
|||
/** |
|||
* TODO: this actually simply creates a new worker |
|||
* and ignores the base. Think about this. |
|||
*/ |
|||
va_list foo; |
|||
|
|||
ctor(_this, &foo); |
|||
} |
|||
|
|||
INIT_IFACE(Class, ctor, dtor, _clone); |
|||
INIT_IFACE(StreamReader, (fptr_streamReaderRead)httpWorkerProcess); |
|||
INIT_IFACE(StreamWriter, (fptr_streamWriterWrite)httpWorkerWrite); |
|||
CREATE_CLASS( |
|||
HttpWorker, |
|||
NULL, |
|||
IFACE(Class), |
|||
IFACE(StreamReader), |
|||
IFACE(StreamWriter)); |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,59 @@ |
|||
#include "class.h" |
|||
#include "interface/class.h" |
|||
|
|||
#include "http/worker.h" |
|||
#include "http/request/parser.h" |
|||
|
|||
size_t |
|||
httpWorkerProcess(HttpWorker this, int fd) |
|||
{ |
|||
size_t size; |
|||
|
|||
if (0 < (size = httpRequestParserRead(this->parser, fd))) { |
|||
int i; |
|||
HttpMessageQueue reqq = this->parser->request_queue; |
|||
HttpMessageQueue respq = this->writer->response_queue; |
|||
|
|||
for (i=0; i<reqq->nmsgs; i++) { |
|||
/** |
|||
* @TODO: for now simply remove request and send not found. |
|||
* Make this sane. |
|||
*/ |
|||
HttpRequest request = (HttpRequest)(reqq->msgs[i]); |
|||
HttpMessage response = NULL; |
|||
|
|||
if (0 == strcmp("GET", request->method) && |
|||
0 == strcmp("/me/", request->uri)) { |
|||
response = (HttpMessage)httpResponseMe(); |
|||
} |
|||
else if (0 == strcmp("GET", request->method) && |
|||
0 == strcmp("/image/", request->uri)) { |
|||
response = (HttpMessage)httpResponseImage(); |
|||
} |
|||
else { |
|||
response = (HttpMessage)httpResponse404(); |
|||
} |
|||
|
|||
if (httpMessageHasKeepAlive(reqq->msgs[i])) { |
|||
httpHeaderAdd( |
|||
&(response->header), |
|||
new(HttpHeader, "Connection", "Keep-Alive")); |
|||
} |
|||
else { |
|||
httpHeaderAdd( |
|||
&(response->header), |
|||
new(HttpHeader, "Connection", "Close")); |
|||
} |
|||
|
|||
respq->msgs[(respq->nmsgs)++] = response; |
|||
response = NULL; |
|||
delete(&(reqq->msgs[i])); |
|||
} |
|||
|
|||
reqq->nmsgs = 0; |
|||
} |
|||
|
|||
return size; |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,12 @@ |
|||
#include <sys/types.h> |
|||
|
|||
#include "http/worker.h" |
|||
#include "http/response/writer.h" |
|||
|
|||
size_t |
|||
httpWorkerWrite(HttpWorker this, int fd) |
|||
{ |
|||
return httpResponseWriterWrite(this->writer, fd); |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue