Commit 1c5d6099f584fc1b510a69e70d9027c64d727c46
1 parent
f678adca
add missing header_get to repo and build header hash only from lowercase letters…
… now as it seems header identifier should be case insensitive
Showing
3 changed files
with
52 additions
and
2 deletions
| 1 | +2012-02-09 11:32:28 +0100 Georg Hopp | ||
| 2 | + | ||
| 3 | + * add missing header_get to repo and build header hash only from lowercase letters now as it seems header identifier should be case insensitive (HEAD, master) | ||
| 4 | + | ||
| 1 | 2012-02-09 09:34:21 +0100 Georg Hopp | 5 | 2012-02-09 09:34:21 +0100 Georg Hopp |
| 2 | 6 | ||
| 3 | - * access to headers via hash, read body (actually only with content-length header should also look for content-encoding) (HEAD, master) | 7 | + * access to headers via hash, read body (actually only with content-length header should also look for content-encoding) |
| 4 | 8 | ||
| 5 | 2012-02-08 16:51:49 +0100 Georg Hopp | 9 | 2012-02-08 16:51:49 +0100 Georg Hopp |
| 6 | 10 |
src/http/request/header_get.c
0 → 100644
| 1 | +#include <stdlib.h> | ||
| 2 | +#include <ctype.h> | ||
| 3 | + | ||
| 4 | +#include "http/request.h" | ||
| 5 | + | ||
| 6 | +static | ||
| 7 | +inline | ||
| 8 | +unsigned long | ||
| 9 | +sdbm(const unsigned char * str) | ||
| 10 | +{ | ||
| 11 | + unsigned long hash = 0; | ||
| 12 | + int c; | ||
| 13 | + | ||
| 14 | + while ((c = tolower(*str++))) | ||
| 15 | + hash = c + (hash << 6) + (hash << 16) - hash; | ||
| 16 | + | ||
| 17 | + return hash; | ||
| 18 | +} | ||
| 19 | + | ||
| 20 | +static | ||
| 21 | +inline | ||
| 22 | +int | ||
| 23 | +comp (const void * _a, const void * _b) | ||
| 24 | +{ | ||
| 25 | + unsigned long a = *(unsigned long *)_a; | ||
| 26 | + const struct HttpRequestHeader * b = _b; | ||
| 27 | + return (a < b->hash)? -1 : (a > b->hash)? 1 : 0; | ||
| 28 | +} | ||
| 29 | + | ||
| 30 | +char * | ||
| 31 | +httpRequestHeaderGet(HttpRequest this, const char * name) | ||
| 32 | +{ | ||
| 33 | + unsigned long hash = sdbm((unsigned char *)name); | ||
| 34 | + struct HttpRequestHeader * header; | ||
| 35 | + | ||
| 36 | + header = bsearch( | ||
| 37 | + &hash, | ||
| 38 | + this->header, | ||
| 39 | + this->nheader, | ||
| 40 | + sizeof(struct HttpRequestHeader), | ||
| 41 | + comp); | ||
| 42 | + | ||
| 43 | + return (NULL != header)? header->value : NULL; | ||
| 44 | +} | ||
| 45 | + | ||
| 46 | +// vim: set ts=4 sw=4: |
| @@ -150,7 +150,7 @@ sdbm(unsigned char * str) | @@ -150,7 +150,7 @@ sdbm(unsigned char * str) | ||
| 150 | unsigned long hash = 0; | 150 | unsigned long hash = 0; |
| 151 | int c; | 151 | int c; |
| 152 | 152 | ||
| 153 | - while ((c = *str++)) | 153 | + while ((c = tolower(*str++))) |
| 154 | hash = c + (hash << 6) + (hash << 16) - hash; | 154 | hash = c + (hash << 6) + (hash << 16) - hash; |
| 155 | 155 | ||
| 156 | return hash; | 156 | return hash; |
Please
register
or
login
to post a comment