Commit e7553ea2187eaab0ae20b2188df060f49b46f394

Authored by Georg Hopp
1 parent 1fb86288

add cookie request parsing and fix post (form vars) parsing. User new parsed coo…

…kies within worker/process
@@ -29,7 +29,9 @@ @@ -29,7 +29,9 @@
29 #include "http/header.h" 29 #include "http/header.h"
30 #include "http/parser.h" 30 #include "http/parser.h"
31 #include "http/message.h" 31 #include "http/message.h"
  32 +#include "http/request.h"
32 #include "hash.h" 33 #include "hash.h"
  34 +#include "hash_value.h"
33 35
34 #define MAX(x,y) ((x) > (y) ? (x) : (y)) 36 #define MAX(x,y) ((x) > (y) ? (x) : (y))
35 37
@@ -67,6 +69,42 @@ httpParserHeader( @@ -67,6 +69,42 @@ httpParserHeader(
67 current->dbody = 0; 69 current->dbody = 0;
68 } 70 }
69 71
  72 + if (0 == strncasecmp("cookie", name, nname-1)) {
  73 + HttpRequest request = (HttpRequest)this->current;
  74 + char * pair = value;
  75 + size_t togo = lend - value;
  76 +
  77 + while(NULL != pair && 0 < togo) {
  78 + char * key = pair;
  79 + char * eqsign;
  80 + char * val;
  81 + size_t nval;
  82 +
  83 + for (; *key == ' ' && key < lend; key++, togo--);
  84 + eqsign = memchr(key, '=', togo);
  85 +
  86 + if (NULL == eqsign) {
  87 + break;
  88 + }
  89 +
  90 + togo -= (eqsign - key);
  91 + pair = memchr(eqsign, ';', togo);
  92 +
  93 + if (NULL == pair) {
  94 + pair = (char *)lend;
  95 + }
  96 +
  97 + nval = pair-eqsign-1;
  98 + val = (0 != nval)? eqsign+1 : NULL;
  99 +
  100 + hashAdd(request->cookies,
  101 + new(HashValue, key, eqsign-key, val, nval));
  102 +
  103 + togo -= (pair - eqsign);
  104 + pair++;
  105 + }
  106 + }
  107 +
70 hashAdd(current->header, 108 hashAdd(current->header,
71 new(HttpHeader, name, nname, value, lend - value)); 109 new(HttpHeader, name, nname, value, lend - value));
72 } 110 }
@@ -43,6 +43,7 @@ httpParserPostVars(HttpParser this) @@ -43,6 +43,7 @@ httpParserPostVars(HttpParser this)
43 new(HashValue, key, eqsign-key, value, nvalue)); 43 new(HashValue, key, eqsign-key, value, nvalue));
44 44
45 togo -= (pair - eqsign); 45 togo -= (pair - eqsign);
  46 + pair++;
46 } 47 }
47 } 48 }
48 49
@@ -64,25 +64,20 @@ httpWorkerProcess(HttpWorker this, Stream st) @@ -64,25 +64,20 @@ httpWorkerProcess(HttpWorker this, Stream st)
64 HttpMessage rmessage = reqq->msgs[i]; 64 HttpMessage rmessage = reqq->msgs[i];
65 HttpRequest request = (HttpRequest)(reqq->msgs[i]); 65 HttpRequest request = (HttpRequest)(reqq->msgs[i]);
66 HttpMessage response = NULL; 66 HttpMessage response = NULL;
67 - HttpHeader cookie = hashGet(  
68 - rmessage->header,  
69 - CSTRA("cookie"));  
70 67
71 - if (NULL == this->session && NULL != cookie) {  
72 - int i; 68 + /**
  69 + * \todo store the cookie count in the request to make a simple
  70 + * check possible to prevent this lookup if no cookies exists
  71 + * at all
  72 + */
  73 + if (NULL == this->session) {
  74 + HashValue sidstr = hashGet(request->cookies, CSTRA("sid"));
73 75
74 - for (i=0; i<cookie->cvalue; i++) {  
75 - char * sidstr = strstr(cookie->value[i], "sid"); 76 + if (NULL != sidstr) {
  77 + unsigned long sid;
76 78
77 - if (NULL != sidstr) {  
78 - unsigned long sid;  
79 -  
80 - sidstr = strchr(sidstr, '=')+1;  
81 - sid = strtoul(sidstr, NULL, 10);  
82 -  
83 - this->session = sessionGet(this->sroot, sid);  
84 - break;  
85 - } 79 + sid = strtoul((char*)(sidstr->value), NULL, 10);
  80 + this->session = sessionGet(this->sroot, sid);
86 } 81 }
87 } 82 }
88 83
Please register or login to post a comment