X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_headers_api.c;h=0952ffbe32c0162b42aba7774408f86447549998;hp=c4d23c8a17824d1d172d88a033f74f4769dbf106;hb=32e91737086db53bb1fd9ed9f79d693c43ec459f;hpb=a0bca521b491711e43aef74fe19c23a8eb4d0777 diff --git a/http_headers_api.c b/http_headers_api.c index c4d23c8..0952ffb 100644 --- a/http_headers_api.c +++ b/http_headers_api.c @@ -6,7 +6,7 @@ | modification, are permitted provided that the conditions mentioned | | in the accompanying LICENSE file are met. | +--------------------------------------------------------------------+ - | Copyright (c) 2004-2005, Michael Wallner | + | Copyright (c) 2004-2006, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -15,20 +15,14 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include "php.h" -#include "ext/standard/php_string.h" +#include "php_http.h" + #include "ext/standard/url.h" +#include "ext/standard/php_string.h" -#include "php_http.h" -#include "php_http_std_defs.h" #include "php_http_api.h" #include "php_http_headers_api.h" -#include "php_http_info_api.h" - -#include - -ZEND_EXTERN_MODULE_GLOBALS(http); #ifndef HTTP_DBG_NEG # define HTTP_DBG_NEG 0 @@ -86,7 +80,7 @@ char *_http_negotiate_language_func(const char *test, double *quality, HashTable FOREACH_HASH_VAL(pos, supported, value) { int len = dash_test - test; #if HTTP_DBG_NEG - fprintf(stderr, "strncascmp('%s', '%s', %d)\n", Z_STRVAL_PP(value), test, len); + fprintf(stderr, "strncasecmp('%s', '%s', %d)\n", Z_STRVAL_PP(value), test, len); #endif if ( (!strncasecmp(Z_STRVAL_PP(value), test, len)) && ( (Z_STRVAL_PP(value)[len] == '\0') || @@ -153,8 +147,9 @@ PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *support array_init(&array); FOREACH_HASH_VAL(pos, Z_ARRVAL(ex_arr), entry) { + int ident_len; double quality; - char *selected, *identifier; + char *selected, *identifier, *freeme; const char *separator; #if HTTP_DBG_NEG @@ -164,13 +159,22 @@ PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *support if ((separator = strchr(Z_STRVAL_PP(entry), ';'))) { const char *ptr = separator; - while (*++ptr && !isdigit(*ptr)); + while (*++ptr && !isdigit(*ptr) && '.' != *ptr); quality = atof(ptr); - identifier = estrndup(Z_STRVAL_PP(entry), separator - Z_STRVAL_PP(entry)); + identifier = estrndup(Z_STRVAL_PP(entry), ident_len = separator - Z_STRVAL_PP(entry)); } else { quality = 1000.0 - i++; - identifier = estrndup(Z_STRVAL_PP(entry), Z_STRLEN_PP(entry)); + identifier = estrndup(Z_STRVAL_PP(entry), ident_len = Z_STRLEN_PP(entry)); + } + freeme = identifier; + + while (isspace(*identifier)) { + ++identifier; + --ident_len; + } + while (ident_len && isspace(identifier[ident_len - 1])) { + identifier[--ident_len] = '\0'; } if ((selected = neg(identifier, &quality, supported TSRMLS_CC))) { @@ -180,7 +184,7 @@ PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *support } } - efree(identifier); + efree(freeme); } result = Z_ARRVAL(array); @@ -351,10 +355,9 @@ PHP_HTTP_API STATUS _http_parse_headers_ex(const char *header, HashTable *header header_len = strlen(header) + 1; } line = header; - - while (header_len >= (size_t) (line - begin)) { + + if (header_len) do { int value_len = 0; - /* note: valgrind may choke on that -- should be safe though */ switch (*line++) { case ':': @@ -366,7 +369,7 @@ PHP_HTTP_API STATUS _http_parse_headers_ex(const char *header, HashTable *header case 0: --value_len; /* we don't have CR so value length is one char less */ case '\n': - if ((!(*line - 1)) || ((*line != ' ') && (*line != '\t'))) { + if ((!*(line - 1)) || ((*line != ' ') && (*line != '\t'))) { http_info i; /* response/request line */ @@ -423,7 +426,8 @@ PHP_HTTP_API STATUS _http_parse_headers_ex(const char *header, HashTable *header } break; } - } + } while (header_len > (size_t) (line - begin)); + return SUCCESS; } /* }}} */