Commit f678adcae4b89de9558cfd023e3bc678853bee9d
1 parent
ca023b99
access to headers via hash, read body (actually only with content-length header …
…should also look for content-encoding)
Showing
6 changed files
with
101 additions
and
8 deletions
| 1 | +2012-02-09 09:34:21 +0100 Georg Hopp | ||
| 2 | + | ||
| 3 | + * access to headers via hash, read body (actually only with content-length header should also look for content-encoding) (HEAD, master) | ||
| 4 | + | ||
| 5 | +2012-02-08 16:51:49 +0100 Georg Hopp | ||
| 6 | + | ||
| 7 | + * fix handling of remote close - i should have another eye on this...there still seems to be something wrong. | ||
| 8 | + | ||
| 9 | +2012-02-08 15:04:52 +0100 Georg Hopp | ||
| 10 | + | ||
| 11 | + * fixed some warnings | ||
| 12 | + | ||
| 13 | +2012-02-08 13:12:59 +0100 Georg Hopp | ||
| 14 | + | ||
| 15 | + * changed documentation | ||
| 16 | + | ||
| 17 | +2012-02-08 13:05:23 +0100 Georg Hopp | ||
| 18 | + | ||
| 19 | + * added first generated documentation | ||
| 20 | + | ||
| 21 | +2012-02-08 12:14:44 +0100 Georg Hopp | ||
| 22 | + | ||
| 23 | + * oops commit...forgot to add request_queue.c | ||
| 24 | + | ||
| 1 | 2012-02-08 11:52:30 +0100 Georg Hopp | 25 | 2012-02-08 11:52:30 +0100 Georg Hopp |
| 2 | 26 | ||
| 3 | - * found the file handle lost...made a first workaround and added an todo. (HEAD, master) | 27 | + * found the file handle lost...made a first workaround and added an todo. |
| 4 | 28 | ||
| 5 | 2012-02-08 10:21:04 +0100 Georg Hopp | 29 | 2012-02-08 10:21:04 +0100 Georg Hopp |
| 6 | 30 |
| @@ -8,15 +8,20 @@ CLASS(HttpRequest) { | @@ -8,15 +8,20 @@ CLASS(HttpRequest) { | ||
| 8 | char * uri; | 8 | char * uri; |
| 9 | char * method; | 9 | char * method; |
| 10 | 10 | ||
| 11 | - struct { | ||
| 12 | - char * name; | ||
| 13 | - char * value; | 11 | + struct HttpRequestHeader { |
| 12 | + unsigned long hash; | ||
| 13 | + char * name; | ||
| 14 | + char * value; | ||
| 14 | } header[128]; | 15 | } header[128]; |
| 16 | + int nheader; | ||
| 15 | 17 | ||
| 16 | char * body; | 18 | char * body; |
| 17 | - char done; | 19 | + int nbody; |
| 18 | }; | 20 | }; |
| 19 | 21 | ||
| 22 | +char * | ||
| 23 | +httpRequestHeaderGet(HttpRequest this, const char * name); | ||
| 24 | + | ||
| 20 | #endif /* __HTTP_REQUEST_H__ */ | 25 | #endif /* __HTTP_REQUEST_H__ */ |
| 21 | 26 | ||
| 22 | // vim: set ts=4 sw=4: | 27 | // vim: set ts=4 sw=4: |
| @@ -5,7 +5,7 @@ CLASS = class.c interface.c interface/class.c | @@ -5,7 +5,7 @@ CLASS = class.c interface.c interface/class.c | ||
| 5 | SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c | 5 | SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c |
| 6 | SERVER = server.c server/run.c server/close_conn.c | 6 | SERVER = server.c server/run.c server/close_conn.c |
| 7 | LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c | 7 | LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c |
| 8 | -HTTP = interface/stream_reader.c http/request_parser.c http/request.c http/request_queue.c | 8 | +HTTP = interface/stream_reader.c http/request_parser.c http/request.c http/request_queue.c http/request/header_get.c |
| 9 | 9 | ||
| 10 | AM_CFLAGS = -Wall -I ../include/ | 10 | AM_CFLAGS = -Wall -I ../include/ |
| 11 | 11 |
| @@ -129,6 +129,43 @@ httpRequestSkip(char ** data) | @@ -129,6 +129,43 @@ httpRequestSkip(char ** data) | ||
| 129 | for (; 0 != **data && ! isalpha(**data); (*data)++); | 129 | for (; 0 != **data && ! isalpha(**data); (*data)++); |
| 130 | } | 130 | } |
| 131 | 131 | ||
| 132 | +/** | ||
| 133 | + * SDBM hashing algorithm: | ||
| 134 | + * | ||
| 135 | + * this algorithm was created for sdbm (a public-domain reimplementation of | ||
| 136 | + * ndbm) database library. it was found to do well in scrambling bits, | ||
| 137 | + * causing better distribution of the keys and fewer splits. it also happens | ||
| 138 | + * to be a good general hashing function with good distribution. the actual | ||
| 139 | + * function is hash(i) = hash(i - 1) * 65599 + str[i]; what is included below | ||
| 140 | + * is the faster version used in gawk. [there is even a faster, duff-device | ||
| 141 | + * version] the magic constant 65599 was picked out of thin air while | ||
| 142 | + * experimenting with different constants, and turns out to be a prime. this | ||
| 143 | + * is one of the algorithms used in berkeley db (see sleepycat) and elsewhere. | ||
| 144 | + */ | ||
| 145 | +static | ||
| 146 | +inline | ||
| 147 | +unsigned long | ||
| 148 | +sdbm(unsigned char * str) | ||
| 149 | +{ | ||
| 150 | + unsigned long hash = 0; | ||
| 151 | + int c; | ||
| 152 | + | ||
| 153 | + while ((c = *str++)) | ||
| 154 | + hash = c + (hash << 6) + (hash << 16) - hash; | ||
| 155 | + | ||
| 156 | + return hash; | ||
| 157 | +} | ||
| 158 | + | ||
| 159 | +static | ||
| 160 | +inline | ||
| 161 | +int | ||
| 162 | +comp (const void * _a, const void * _b) | ||
| 163 | +{ | ||
| 164 | + const struct HttpRequestHeader * a = _a; | ||
| 165 | + const struct HttpRequestHeader * b = _b; | ||
| 166 | + return (a->hash < b->hash)? -1 : (a->hash > b->hash)? 1 : 0; | ||
| 167 | +} | ||
| 168 | + | ||
| 132 | static | 169 | static |
| 133 | void | 170 | void |
| 134 | httpRequestParserParse(HttpRequestParser this) | 171 | httpRequestParserParse(HttpRequestParser this) |
| @@ -207,21 +244,43 @@ httpRequestParserParse(HttpRequestParser this) | @@ -207,21 +244,43 @@ httpRequestParserParse(HttpRequestParser this) | ||
| 207 | *delim = 0; | 244 | *delim = 0; |
| 208 | (request->header)[header_idx].name = malloc(strlen(line) + 1); | 245 | (request->header)[header_idx].name = malloc(strlen(line) + 1); |
| 209 | strcpy((request->header)[header_idx].name, line); | 246 | strcpy((request->header)[header_idx].name, line); |
| 247 | + (request->header)[header_idx].hash = sdbm((unsigned char *)line); | ||
| 210 | 248 | ||
| 211 | line = delim + 1; | 249 | line = delim + 1; |
| 212 | for (; *line == ' ' && *line != 0; line++); | 250 | for (; *line == ' ' && *line != 0; line++); |
| 213 | 251 | ||
| 214 | (request->header)[header_idx].value = malloc(strlen(line) + 1); | 252 | (request->header)[header_idx].value = malloc(strlen(line) + 1); |
| 215 | strcpy((request->header)[header_idx].value, line); | 253 | strcpy((request->header)[header_idx].value, line); |
| 254 | + | ||
| 255 | + header_idx++; | ||
| 256 | + request->nheader++; | ||
| 216 | } | 257 | } |
| 217 | 258 | ||
| 218 | - header_idx++; | ||
| 219 | break; | 259 | break; |
| 220 | 260 | ||
| 221 | case HTTP_REQUEST_HEADERS_DONE: | 261 | case HTTP_REQUEST_HEADERS_DONE: |
| 222 | /** | 262 | /** |
| 223 | * @TODO: here comes the body handling | 263 | * @TODO: here comes the body handling |
| 224 | */ | 264 | */ |
| 265 | + qsort( | ||
| 266 | + request->header, | ||
| 267 | + request->nheader, | ||
| 268 | + sizeof(struct HttpRequestHeader), | ||
| 269 | + comp); | ||
| 270 | + | ||
| 271 | + { | ||
| 272 | + char * bodylen; | ||
| 273 | + | ||
| 274 | + bodylen = httpRequestHeaderGet(request, "Content-Length"); | ||
| 275 | + | ||
| 276 | + if (NULL != bodylen) { | ||
| 277 | + request->nbody = atoi(bodylen); | ||
| 278 | + request->body = calloc(1, request->nbody + 1); | ||
| 279 | + memcpy(request->body, data, request->nbody); | ||
| 280 | + data += request->nbody; | ||
| 281 | + } | ||
| 282 | + } | ||
| 283 | + | ||
| 225 | this->state = HTTP_REQUEST_DONE; | 284 | this->state = HTTP_REQUEST_DONE; |
| 226 | break; | 285 | break; |
| 227 | 286 |
| @@ -80,6 +80,11 @@ serverRun(Server this) | @@ -80,6 +80,11 @@ serverRun(Server this) | ||
| 80 | for (j=0; j<queue->nrequests; j++) { | 80 | for (j=0; j<queue->nrequests; j++) { |
| 81 | HttpRequest request = queue->requests[j]; | 81 | HttpRequest request = queue->requests[j]; |
| 82 | 82 | ||
| 83 | + if (NULL != request->body) { | ||
| 84 | + puts("==REQUEST BODY=="); | ||
| 85 | + puts(request->body); | ||
| 86 | + } | ||
| 87 | + | ||
| 83 | /** | 88 | /** |
| 84 | * @TODO: for now simply remove request and send not found. | 89 | * @TODO: for now simply remove request and send not found. |
| 85 | * Make this sane. | 90 | * Make this sane. |
| @@ -13,7 +13,7 @@ | @@ -13,7 +13,7 @@ | ||
| 13 | int | 13 | int |
| 14 | main() | 14 | main() |
| 15 | { | 15 | { |
| 16 | - Logger logger = new(LoggerStderr, LOGGER_INFO); | 16 | + Logger logger = new(LoggerStderr, LOGGER_ERR); |
| 17 | HttpRequestParser parser = new(HttpRequestParser); | 17 | HttpRequestParser parser = new(HttpRequestParser); |
| 18 | Server server = new(Server, logger, parser, 11212, SOMAXCONN); | 18 | Server server = new(Server, logger, parser, 11212, SOMAXCONN); |
| 19 | //Server server = new(Server, logger, parser, 11212, 20); | 19 | //Server server = new(Server, logger, parser, 11212, 20); |
Please
register
or
login
to post a comment