X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_headers_api.c;h=3091b63b227ef1f692fb23f02a79e86d43bbaa8a;hp=42e7dcd7d9fd361d6cc42aa1e224cbb4aec3b39d;hb=refs%2Fheads%2Fv1.7.x;hpb=4a8fc95fc8796d7e1f2394c63345fa9def53e821 diff --git a/http_headers_api.c b/http_headers_api.c index 42e7dcd..3091b63 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-2007, Michael Wallner | + | Copyright (c) 2004-2010, Michael Wallner | +--------------------------------------------------------------------+ */ @@ -107,55 +107,45 @@ char *_http_negotiate_default_func(const char *test, double *quality, HashTable } /* }}} */ -/* {{{ HashTable *http_negotiate_q(const char *, HashTable *, negotiate_func_t) */ -PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *supported, negotiate_func_t neg TSRMLS_DC) +/* {{{ HashTable *http_negotiate_z(zval *, HashTable *, negotiate_func_t) */ +PHP_HTTP_API HashTable *_http_negotiate_z(zval *value, HashTable *supported, negotiate_func_t neg TSRMLS_DC) { - zval *accept; + zval *accept = http_zsep(IS_STRING, value); HashTable *result = NULL; - -#if HTTP_DBG_NEG - fprintf(stderr, "Reading header %s: ", header); -#endif - if (!(accept = http_get_server_var(header, 1))) { - return NULL; - } -#if HTTP_DBG_NEG - fprintf(stderr, "%s\n", Z_STRVAL_P(accept)); -#endif - + if (Z_STRLEN_P(accept)) { zval ex_arr, ex_del; - + INIT_PZVAL(&ex_del); INIT_PZVAL(&ex_arr); ZVAL_STRINGL(&ex_del, ",", 1, 0); array_init(&ex_arr); - + php_explode(&ex_del, accept, &ex_arr, INT_MAX); - + if (zend_hash_num_elements(Z_ARRVAL(ex_arr)) > 0) { int i = 0; HashPosition pos; zval **entry, array; - + INIT_PZVAL(&array); array_init(&array); - + FOREACH_HASH_VAL(pos, Z_ARRVAL(ex_arr), entry) { int ident_len; double quality; char *selected, *identifier, *freeme; const char *separator; - + #if HTTP_DBG_NEG fprintf(stderr, "Checking %s\n", Z_STRVAL_PP(entry)); #endif - + if ((separator = strchr(Z_STRVAL_PP(entry), ';'))) { const char *ptr = separator; - + while (*++ptr && !HTTP_IS_CTYPE(digit, *ptr) && '.' != *ptr); - + quality = zend_strtod(ptr, NULL); identifier = estrndup(Z_STRVAL_PP(entry), ident_len = separator - Z_STRVAL_PP(entry)); } else { @@ -163,7 +153,7 @@ PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *support identifier = estrndup(Z_STRVAL_PP(entry), ident_len = Z_STRLEN_PP(entry)); } freeme = identifier; - + while (HTTP_IS_CTYPE(space, *identifier)) { ++identifier; --ident_len; @@ -171,28 +161,49 @@ PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *support while (ident_len && HTTP_IS_CTYPE(space, identifier[ident_len - 1])) { identifier[--ident_len] = '\0'; } - + if ((selected = neg(identifier, &quality, supported TSRMLS_CC))) { /* don't overwrite previously set with higher quality */ if (!zend_hash_exists(Z_ARRVAL(array), selected, strlen(selected) + 1)) { add_assoc_double(&array, selected, quality); } } - + efree(freeme); } - + result = Z_ARRVAL(array); zend_hash_sort(result, zend_qsort, http_sort_q, 0 TSRMLS_CC); } - + zval_dtor(&ex_arr); } - + + zval_ptr_dtor(&accept); + return result; } /* }}} */ +/* {{{ HashTable *http_negotiate_q(const char *, HashTable *, negotiate_func_t) */ +PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *supported, negotiate_func_t neg TSRMLS_DC) +{ + zval *accept; + +#if HTTP_DBG_NEG + fprintf(stderr, "Reading header %s: ", header); +#endif + if (!(accept = http_get_server_var(header, 1))) { + return NULL; + } +#if HTTP_DBG_NEG + fprintf(stderr, "%s\n", Z_STRVAL_P(accept)); +#endif + + return http_negotiate_z(accept, supported, neg); +} +/* }}} */ + /* {{{ http_range_status http_get_request_ranges(HashTable *ranges, size_t) */ PHP_HTTP_API http_range_status _http_get_request_ranges(HashTable *ranges, size_t length TSRMLS_DC) {