X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=http_api.c;h=de1984a46fd6236edb4e4d014891426ea9ffc5c1;hb=1e0730378082dc2ed3309227a5ff7cfc9e4b9e7c;hp=1d3f657dd9b5f5ada83dd5469bb54150aff2d90f;hpb=c565d29e26b3b8be1b24a08bec57081aafc33a58;p=m6w6%2Fext-http diff --git a/http_api.c b/http_api.c index 1d3f657..de1984a 100644 --- a/http_api.c +++ b/http_api.c @@ -137,21 +137,20 @@ PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS switch (st) { case ST_QUOTE: - switch (*c) - { - case '"': - if (*(c-1) != '\\') { - st = ST_ADD; - } else { - memmove(c-1, c, strlen(c)+1); - } - break; - - default: - if (!val) { - val = c; - } - break; + if (*c == '"') { + if (*(c-1) != '\\') { + st = ST_ADD; + } else { + memmove(c-1, c, strlen(c)+1); + } + } else { + if (!val) { + val = c; + } + if (!*c) { + --val; + st = ST_ADD; + } } break; @@ -167,8 +166,11 @@ PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS case ' ': break; - case '\0': case ';': + goto add; + break; + + case '\0': st = ST_ADD; break; @@ -190,6 +192,7 @@ PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS case '.': case '_': case '$': + case '@': if (!key) { key = c; } @@ -212,8 +215,10 @@ PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS break; case '\0': - keylen = c - key; - st = ST_ADD; + if (key) { + keylen = c - key; + st = ST_ADD; + } break; } break; @@ -232,6 +237,7 @@ PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS add: if (val) { vallen = c - val - (*c?1:0); + while (val[vallen-1] == ' ') --vallen; } else { val = ""; vallen = 0; @@ -264,6 +270,7 @@ PHP_HTTP_API STATUS _http_parse_cookie(const char *list, HashTable *items TSRMLS return SUCCESS; failure: + http_error_ex(HE_WARNING, HTTP_E_INVALID_PARAM, "Unexpected character (%c) at pos %tu of %zu", *c, c-s, strlen(s)); efree(s); return FAILURE; }