|
|
@ -3,6 +3,7 @@ |
|
|
#include <stdlib.h> |
|
|
#include <stdlib.h> |
|
|
#include <stdio.h> |
|
|
#include <stdio.h> |
|
|
#include <unistd.h> |
|
|
#include <unistd.h> |
|
|
|
|
|
#include <ctype.h> |
|
|
#include <sys/types.h> |
|
|
#include <sys/types.h> |
|
|
|
|
|
|
|
|
#include "class.h" |
|
|
#include "class.h" |
|
|
@ -14,7 +15,7 @@ |
|
|
|
|
|
|
|
|
static |
|
|
static |
|
|
void |
|
|
void |
|
|
httpRequestParserParse(char * data, size_t * size); |
|
|
|
|
|
|
|
|
httpRequestParserParse(HttpRequestParser); |
|
|
|
|
|
|
|
|
static |
|
|
static |
|
|
void |
|
|
void |
|
|
@ -25,6 +26,7 @@ ctor(void * _this, va_list * params) |
|
|
//this->request_queue = va_arg(*params, HttpRequestQueue); |
|
|
//this->request_queue = va_arg(*params, HttpRequestQueue); |
|
|
|
|
|
|
|
|
this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); |
|
|
this->buffer = malloc(HTTP_REQUEST_PARSER_READ_CHUNK); |
|
|
|
|
|
this->buffer[0] = 0; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
static |
|
|
static |
|
|
@ -78,15 +80,16 @@ get_data(void * _this, int fd) |
|
|
*/ |
|
|
*/ |
|
|
chunks++; |
|
|
chunks++; |
|
|
|
|
|
|
|
|
if (size > remaining) { |
|
|
|
|
|
|
|
|
if (size >= remaining) { |
|
|
this->buffer = |
|
|
this->buffer = |
|
|
realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); |
|
|
realloc(this->buffer, chunks * HTTP_REQUEST_PARSER_READ_CHUNK); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
memcpy(this->buffer + this->buffer_used, buffer, size); |
|
|
memcpy(this->buffer + this->buffer_used, buffer, size); |
|
|
this->buffer_used += size; |
|
|
this->buffer_used += size; |
|
|
|
|
|
this->buffer[this->buffer_used] = 0; |
|
|
|
|
|
|
|
|
httpRequestParserParse(this->buffer, &this->buffer_used); |
|
|
|
|
|
|
|
|
httpRequestParserParse(this); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
return size; |
|
|
return size; |
|
|
@ -97,12 +100,121 @@ INIT_IFACE(StreamReader, get_data); |
|
|
CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); |
|
|
CREATE_CLASS(HttpRequestParser, NULL, IFACE(Class), IFACE(StreamReader)); |
|
|
|
|
|
|
|
|
static |
|
|
static |
|
|
|
|
|
inline |
|
|
|
|
|
int |
|
|
|
|
|
httpRequestLineGet(HttpRequestParser this, char ** line) |
|
|
|
|
|
{ |
|
|
|
|
|
char * line_end = strstr(this->buffer, "\r\n"); |
|
|
|
|
|
|
|
|
|
|
|
if (NULL == line_end) { |
|
|
|
|
|
*line = NULL; |
|
|
|
|
|
return -1; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
*line_end = 0; |
|
|
|
|
|
*line = malloc(strlen(this->buffer) + 1); |
|
|
|
|
|
strcpy(*line, this->buffer); |
|
|
|
|
|
|
|
|
|
|
|
line_end+=2; |
|
|
|
|
|
|
|
|
|
|
|
memmove(this->buffer, |
|
|
|
|
|
line_end, |
|
|
|
|
|
this->buffer_used - (line_end-this->buffer) + 1); |
|
|
|
|
|
|
|
|
|
|
|
this->buffer_used -= line_end-this->buffer; |
|
|
|
|
|
|
|
|
|
|
|
return line_end-this->buffer-2; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static |
|
|
|
|
|
inline |
|
|
void |
|
|
void |
|
|
httpRequestParserParse(char * data, size_t * size) |
|
|
|
|
|
|
|
|
httpRequestSkip(HttpRequestParser this) |
|
|
{ |
|
|
{ |
|
|
data[*size] = 0; |
|
|
|
|
|
printf("%s", data); |
|
|
|
|
|
*size = 0; |
|
|
|
|
|
|
|
|
size_t skip; |
|
|
|
|
|
|
|
|
|
|
|
for (skip = 0; |
|
|
|
|
|
0 != this->buffer[skip] |
|
|
|
|
|
&& ! isalpha(this->buffer[skip]) |
|
|
|
|
|
&& this->buffer_used > skip; |
|
|
|
|
|
skip++); |
|
|
|
|
|
|
|
|
|
|
|
memmove(this->buffer, |
|
|
|
|
|
&this->buffer[skip], |
|
|
|
|
|
this->buffer_used - skip + 1); |
|
|
|
|
|
|
|
|
|
|
|
this->buffer_used -= skip; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static |
|
|
|
|
|
void |
|
|
|
|
|
httpRequestParserParse(HttpRequestParser this) |
|
|
|
|
|
{ |
|
|
|
|
|
//static HttpRequest request = NULL; |
|
|
|
|
|
char * line; |
|
|
|
|
|
int cont = 1; |
|
|
|
|
|
int length; |
|
|
|
|
|
|
|
|
|
|
|
//if(NULL == HttpRequest) { |
|
|
|
|
|
// request = new(HttpRequest); |
|
|
|
|
|
//} |
|
|
|
|
|
|
|
|
|
|
|
while(cont) { |
|
|
|
|
|
switch(this->state) { |
|
|
|
|
|
case HTTP_REQUEST_GARBAGE: |
|
|
|
|
|
puts("==skip garbage=="); |
|
|
|
|
|
httpRequestSkip(this); |
|
|
|
|
|
|
|
|
|
|
|
this->state = HTTP_REQUEST_START; |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case HTTP_REQUEST_START: |
|
|
|
|
|
puts("==request line=="); |
|
|
|
|
|
if (-1 == httpRequestLineGet(this, &line)) { |
|
|
|
|
|
cont = 0; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("%s\n", line); |
|
|
|
|
|
free(line); |
|
|
|
|
|
this->state = HTTP_REQUEST_REQEUST_LINE_DONE; |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case HTTP_REQUEST_REQEUST_LINE_DONE: |
|
|
|
|
|
puts("==read header=="); |
|
|
|
|
|
if (-1 == (length = httpRequestLineGet(this, &line))) { |
|
|
|
|
|
cont = 0; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (0 == length) { |
|
|
|
|
|
free(line); |
|
|
|
|
|
this->state = HTTP_REQUEST_HEADERS_DONE; |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
printf("%s\n", line); |
|
|
|
|
|
free(line); |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case HTTP_REQUEST_HEADERS_DONE: |
|
|
|
|
|
puts("==headers done=="); |
|
|
|
|
|
this->state = HTTP_REQUEST_DONE; |
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
case HTTP_REQUEST_DONE: |
|
|
|
|
|
puts("==request done=="); |
|
|
|
|
|
|
|
|
|
|
|
if (0 == this->buffer_used) { |
|
|
|
|
|
cont = 0; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
default: |
|
|
|
|
|
break; |
|
|
|
|
|
} |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// vim: set ts=4 sw=4: |
|
|
// vim: set ts=4 sw=4: |