Browse Source

started filling out a request object with the parser

master
Georg Hopp 14 years ago
parent
commit
0a9bca482e
  1. 2
      src/Makefile.am
  2. 25
      src/http/request.c
  3. 77
      src/http/request_parser.c

2
src/Makefile.am

@ -5,7 +5,7 @@ CLASS = class.c interface.c interface/class.c
SOCKET = socket.c socket/accept.c socket/connect.c socket/listen.c
SERVER = server.c server/run.c server/close_conn.c
LOGGER = logger.c logger/stderr.c logger/syslog.c interface/logger.c
HTTP = interface/stream_reader.c http/request_parser.c
HTTP = interface/stream_reader.c http/request_parser.c http/request.c
AM_CFLAGS = -Wall -I ../include/

25
src/http/request.c

@ -1,7 +1,9 @@
#include <stdlib.h>
#include <stdarg.h>
#include "class.h"
#include "http/request.h"
#include "interface/class.h"
static
void
@ -12,25 +14,30 @@ _free(void ** data)
}
}
static
void
ctor(void * _this, va_list * params) {}
static
void
dtor(void * _this)
{
int i;
HttpRequest this = _this;
int i;
_free(&(this->http_version));
_free(&(this->uri));
_free(&(this->method));
_free((void **)&(this->http_version));
_free((void **)&(this->uri));
_free((void **)&(this->method));
for (i=0; i<128; i++) {
_free(&((this->header)[i].name));
_free(&((this->header)[i].value));
_free((void **)&((this->header)[i].name));
_free((void **)&((this->header)[i].value));
}
_free(&(this->body));
_free((void **)&(this->body));
}
INIT_IFACE(Class, NULL, dtor, NULL);
CREATE_CLASS(HttpRequest, IFACE(Class));
INIT_IFACE(Class, ctor, dtor, NULL);
CREATE_CLASS(HttpRequest, NULL, IFACE(Class));
// vim: set ts=4 sw=4:

77
src/http/request_parser.c

@ -10,7 +10,7 @@
#include "http/request_parser.h"
#include "interface/class.h"
#include "interface/stream_reader.h"
//#include "http/request.h"
#include "http/request.h"
//#include "http/request_queue.h"
static
@ -122,27 +122,25 @@ inline
void
httpRequestSkip(char ** data)
{
for (; 0 != **data && ! isalpha(**data); *data++);
for (; 0 != **data && ! isalpha(**data); (*data)++);
}
static
void
httpRequestParserParse(HttpRequestParser this)
{
//static HttpRequest request = NULL;
static HttpRequest request = NULL;
char * data = this->buffer;
char * line;
int cont = 1;
//if(NULL == HttpRequest) {
// request = new(HttpRequest);
//}
static int header_idx;
while(cont) {
switch(this->state) {
case HTTP_REQUEST_GARBAGE:
puts("==skip garbage==");
httpRequestSkip(&data);
request = new(HttpRequest);
this->state = HTTP_REQUEST_START;
break;
@ -153,8 +151,43 @@ httpRequestParserParse(HttpRequestParser this)
cont = 0;
break;
}
{
char * delim = strchr(line, ' ');
if (NULL != delim) {
*delim = 0;
request->method = malloc(strlen(line) + 1);
strcpy(request->method, line);
line = delim + 1;
for (; *line == ' ' && *line != 0; line++);
if (0 != *line) {
delim = strchr(line, ' ');
if (NULL != delim) {
*delim = 0;
request->uri = malloc(strlen(line) + 1);
strcpy(request->uri, line);
line = delim + 1;
for (; *line == ' ' && *line != 0; line++);
if (0 != *line) {
request->http_version = malloc(strlen(line) + 1);
strcpy(request->http_version, line);
}
}
}
}
}
printf("%s\n", line);
printf("method: %s\n", request->method);
printf("uri: %s\n", request->uri);
printf("version: %s\n", request->http_version);
header_idx = 0;
this->state = HTTP_REQUEST_REQEUST_LINE_DONE;
break;
@ -170,11 +203,36 @@ httpRequestParserParse(HttpRequestParser this)
break;
}
printf("%s\n", line);
{
char * delim = strchr(line, ':');
*delim = 0;
(request->header)[header_idx].name = malloc(strlen(line) + 1);
strcpy((request->header)[header_idx].name, line);
line = delim + 1;
for (; *line == ' ' && *line != 0; line++);
(request->header)[header_idx].value = malloc(strlen(line) + 1);
strcpy((request->header)[header_idx].value, line);
}
header_idx++;
break;
case HTTP_REQUEST_HEADERS_DONE:
puts("==headers done==");
{
int i;
for (i=0; i<header_idx; i++) {
printf("header-name: %s\n", (request->header)[i].name);
printf("header-value: %s\n", (request->header)[i].value);
}
}
printf("%s\n", line);
this->state = HTTP_REQUEST_DONE;
break;
@ -191,6 +249,7 @@ httpRequestParserParse(HttpRequestParser this)
cont = 0;
}
delete(&request);
this->state = HTTP_REQUEST_GARBAGE;
break;

Loading…
Cancel
Save