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: |
VERY BIG TODO: |
||||
- give a contructor a way to fail, so that no object will be created at all |
- 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__ |
#ifndef __HTTP_WORKER_H__ |
||||
#define __HTTP_WORKER_H__ |
#define __HTTP_WORKER_H__ |
||||
|
|
||||
|
#include <sys/types.h> |
||||
|
|
||||
#include "class.h" |
#include "class.h" |
||||
#include "http/request/parser.h" |
#include "http/request/parser.h" |
||||
|
#include "http/response/writer.h" |
||||
|
|
||||
CLASS(HttpWorker) { |
CLASS(HttpWorker) { |
||||
HttpRequestParser parser; |
|
||||
|
HttpRequestParser parser; |
||||
|
HttpResponseWriter writer; |
||||
}; |
}; |
||||
|
|
||||
|
size_t httpWorkerProcess(HttpWorker, int); |
||||
|
size_t httpWorkerWrite(HttpWorker, int); |
||||
|
|
||||
#endif // __HTTP_WORKER_H__ |
#endif // __HTTP_WORKER_H__ |
||||
|
|
||||
// vim: set ts=4 sw=4: |
// 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