Browse Source
moved request parser to generic parser. This is now able to create either a request or a response message dependent on the initial message line (version first or last). TODO change constructor of response to use a len parameter for the reason
master
moved request parser to generic parser. This is now able to create either a request or a response message dependent on the initial message line (version first or last). TODO change constructor of response to use a len parameter for the reason
master
15 changed files with 293 additions and 177 deletions
-
41include/http/parser.h
-
7include/http/worker.h
-
16include/utils/http.h
-
36src/Makefile.am
-
21src/http/message/has_keep_alive.c
-
9src/http/message/has_valid_version.c
-
30src/http/parser.c
-
36src/http/parser/body.c
-
61src/http/parser/header.c
-
34src/http/parser/new_message.c
-
77src/http/parser/parse.c
-
23src/http/request.c
-
13src/http/worker.c
-
9src/http/worker/process.c
-
57src/utils/http.c
@ -0,0 +1,16 @@ |
|||
#ifndef __UTILS_HTTP_H__ |
|||
#define __UTILS_HTTP_H__ |
|||
|
|||
#include <sys/types.h> |
|||
|
|||
#include "http/message.h" |
|||
|
|||
char isHttpVersion(const char *, size_t); |
|||
HttpMessage httpGetMessage( |
|||
const char *, size_t, |
|||
const char *, size_t, |
|||
const char *, size_t); |
|||
|
|||
#endif // __UTILS_HTTP_H__ |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,34 @@ |
|||
#include "http/parser.h" |
|||
|
|||
#include "utils/http.h" |
|||
|
|||
void |
|||
httpParserNewMessage( |
|||
HttpParser this, |
|||
const char * line, |
|||
const char * lend) |
|||
{ |
|||
const char * part1, * part2, * part3; |
|||
size_t len1, len2, len3; |
|||
|
|||
part1 = line; |
|||
part2 = memchr(line, ' ', lend - line); |
|||
|
|||
if (NULL == part2) return; |
|||
|
|||
len1 = part2 - part1; |
|||
for (; *part2 == ' ' && *part2 != 0; part2++); |
|||
|
|||
part3 = memchr(part2, ' ', lend - part2); |
|||
|
|||
if (NULL == part3) return; |
|||
|
|||
len2 = part3 - part2; |
|||
for (; *part3 == ' ' && *part3 != 0; part3++); |
|||
|
|||
len3 = lend - part3; |
|||
|
|||
this->current = httpGetMessage(part1, len1, part2, len2, part3, len3); |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
@ -0,0 +1,57 @@ |
|||
#include <stdlib.h> |
|||
#include <sys/types.h> |
|||
#include <string.h> |
|||
|
|||
#include "http/message.h" |
|||
#include "http/request.h" |
|||
#include "http/response.h" |
|||
|
|||
#include "interface/class.h" |
|||
|
|||
#ifndef TRUE |
|||
#define TRUE 1 |
|||
#endif |
|||
|
|||
#ifndef FALSE |
|||
#define FALSE 0 |
|||
#endif |
|||
|
|||
char |
|||
isHttpVersion(const char * str, size_t len) |
|||
{ |
|||
if (NULL == str) |
|||
return FALSE; |
|||
|
|||
if (8 > len) |
|||
return FALSE; |
|||
|
|||
if (0 != memcmp("HTTP/", str, sizeof("HTTP/")-1)) |
|||
return FALSE; |
|||
|
|||
return TRUE; |
|||
} |
|||
|
|||
HttpMessage |
|||
httpGetMessage( |
|||
const char * part1, size_t len1, |
|||
const char * part2, size_t len2, |
|||
const char * part3, size_t len3) |
|||
{ |
|||
if (isHttpVersion(part1, len1)) { |
|||
return new(HttpResponse, |
|||
part1, len1, |
|||
strtoul(part2, NULL, 10), |
|||
part3, len3); |
|||
} |
|||
|
|||
if (isHttpVersion(part3, len3)) { |
|||
return new(HttpRequest, |
|||
part1, len1, |
|||
part2, len2, |
|||
part3, len3); |
|||
} |
|||
|
|||
return NULL; |
|||
} |
|||
|
|||
// vim: set ts=4 sw=4: |
|||
Write
Preview
Loading…
Cancel
Save
Reference in new issue