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
-
28src/http/parser.c
-
36src/http/parser/body.c
-
59src/http/parser/header.c
-
34src/http/parser/new_message.c
-
69src/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