Browse Source

add cookie request parsing and fix post (form vars) parsing. User new parsed cookies within worker/process

master
Georg Hopp 14 years ago
parent
commit
e7553ea218
  1. 38
      src/http/parser/header.c
  2. 1
      src/http/parser/post_vars.c
  3. 21
      src/http/worker/process.c

38
src/http/parser/header.c

@ -29,7 +29,9 @@
#include "http/header.h" #include "http/header.h"
#include "http/parser.h" #include "http/parser.h"
#include "http/message.h" #include "http/message.h"
#include "http/request.h"
#include "hash.h" #include "hash.h"
#include "hash_value.h"
#define MAX(x,y) ((x) > (y) ? (x) : (y)) #define MAX(x,y) ((x) > (y) ? (x) : (y))
@ -67,6 +69,42 @@ httpParserHeader(
current->dbody = 0; current->dbody = 0;
} }
if (0 == strncasecmp("cookie", name, nname-1)) {
HttpRequest request = (HttpRequest)this->current;
char * pair = value;
size_t togo = lend - value;
while(NULL != pair && 0 < togo) {
char * key = pair;
char * eqsign;
char * val;
size_t nval;
for (; *key == ' ' && key < lend; key++, togo--);
eqsign = memchr(key, '=', togo);
if (NULL == eqsign) {
break;
}
togo -= (eqsign - key);
pair = memchr(eqsign, ';', togo);
if (NULL == pair) {
pair = (char *)lend;
}
nval = pair-eqsign-1;
val = (0 != nval)? eqsign+1 : NULL;
hashAdd(request->cookies,
new(HashValue, key, eqsign-key, val, nval));
togo -= (pair - eqsign);
pair++;
}
}
hashAdd(current->header, hashAdd(current->header,
new(HttpHeader, name, nname, value, lend - value)); new(HttpHeader, name, nname, value, lend - value));
} }

1
src/http/parser/post_vars.c

@ -43,6 +43,7 @@ httpParserPostVars(HttpParser this)
new(HashValue, key, eqsign-key, value, nvalue)); new(HashValue, key, eqsign-key, value, nvalue));
togo -= (pair - eqsign); togo -= (pair - eqsign);
pair++;
} }
} }

21
src/http/worker/process.c

@ -64,25 +64,20 @@ httpWorkerProcess(HttpWorker this, Stream st)
HttpMessage rmessage = reqq->msgs[i]; HttpMessage rmessage = reqq->msgs[i];
HttpRequest request = (HttpRequest)(reqq->msgs[i]); HttpRequest request = (HttpRequest)(reqq->msgs[i]);
HttpMessage response = NULL; HttpMessage response = NULL;
HttpHeader cookie = hashGet(
rmessage->header,
CSTRA("cookie"));
if (NULL == this->session && NULL != cookie) {
int i;
for (i=0; i<cookie->cvalue; i++) {
char * sidstr = strstr(cookie->value[i], "sid");
/**
* \todo store the cookie count in the request to make a simple
* check possible to prevent this lookup if no cookies exists
* at all
*/
if (NULL == this->session) {
HashValue sidstr = hashGet(request->cookies, CSTRA("sid"));
if (NULL != sidstr) { if (NULL != sidstr) {
unsigned long sid; unsigned long sid;
sidstr = strchr(sidstr, '=')+1;
sid = strtoul(sidstr, NULL, 10);
sid = strtoul((char*)(sidstr->value), NULL, 10);
this->session = sessionGet(this->sroot, sid); this->session = sessionGet(this->sroot, sid);
break;
}
} }
} }

Loading…
Cancel
Save