X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_headers_api.c;h=0be9b2c018c763b2a6ad002d780ba64ce696174a;hp=63c46abad58a8d23f2a9004ee568e9f7227062cd;hb=86508dbae5f9296485820e654f07af59be55003f;hpb=ffc893b125c6cc9b385a68a357b08ba2cc4e91f6 diff --git a/http_headers_api.c b/http_headers_api.c index 63c46ab..0be9b2c 100644 --- a/http_headers_api.c +++ b/http_headers_api.c @@ -1,16 +1,13 @@ /* - +----------------------------------------------------------------------+ - | PECL :: http | - +----------------------------------------------------------------------+ - | This source file is subject to version 3.0 of the PHP license, that | - | is bundled with this package in the file LICENSE, and is available | - | through the world-wide-web at http://www.php.net/license/3_0.txt. | - | If you did not receive a copy of the PHP license and are unable to | - | obtain it through the world-wide-web, please send a note to | - | license@php.net so we can mail you a copy immediately. | - +----------------------------------------------------------------------+ - | Copyright (c) 2004-2005 Michael Wallner | - +----------------------------------------------------------------------+ + +--------------------------------------------------------------------+ + | PECL :: http | + +--------------------------------------------------------------------+ + | Redistribution and use in source and binary forms, with or without | + | modification, are permitted provided that the conditions mentioned | + | in the accompanying LICENSE file are met. | + +--------------------------------------------------------------------+ + | Copyright (c) 2004-2005, Michael Wallner | + +--------------------------------------------------------------------+ */ /* $Id$ */ @@ -37,6 +34,18 @@ ZEND_EXTERN_MODULE_GLOBALS(http); # define HTTP_DBG_NEG 0 #endif +/* {{{ */ +PHP_MINIT_FUNCTION(http_headers) +{ + HTTP_LONG_CONSTANT("HTTP_REDIRECT", HTTP_REDIRECT); + HTTP_LONG_CONSTANT("HTTP_REDIRECT_PERM", HTTP_REDIRECT_PERM); + HTTP_LONG_CONSTANT("HTTP_REDIRECT_POST", HTTP_REDIRECT_POST); + HTTP_LONG_CONSTANT("HTTP_REDIRECT_TEMP", HTTP_REDIRECT_TEMP); + + return SUCCESS; +} +/* }}} */ + /* {{{ static int http_sort_q(const void *, const void *) */ static int http_sort_q(const void *a, const void *b TSRMLS_DC) { @@ -60,9 +69,10 @@ static int http_sort_q(const void *a, const void *b TSRMLS_DC) char *_http_negotiate_language_func(const char *test, double *quality, HashTable *supported TSRMLS_DC) { zval **value; + HashPosition pos; const char *dash_test; - FOREACH_HASH_VAL(supported, value) { + FOREACH_HASH_VAL(pos, supported, value) { #if HTTP_DBG_NEG fprintf(stderr, "strcasecmp('%s', '%s')\n", Z_STRVAL_PP(value), test); #endif @@ -73,7 +83,7 @@ char *_http_negotiate_language_func(const char *test, double *quality, HashTable /* no distinct match found, so try primaries */ if (dash_test = strchr(test, '-')) { - FOREACH_HASH_VAL(supported, value) { + 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); @@ -81,7 +91,7 @@ char *_http_negotiate_language_func(const char *test, double *quality, HashTable if ( (!strncasecmp(Z_STRVAL_PP(value), test, len)) && ( (Z_STRVAL_PP(value)[len] == '\0') || (Z_STRVAL_PP(value)[len] == '-'))) { - *quality /= 2; + *quality *= .9; return Z_STRVAL_PP(value); } } @@ -91,12 +101,13 @@ char *_http_negotiate_language_func(const char *test, double *quality, HashTable } /* }}} */ -/* {{{ char *http_negotiate_charset_func */ -char *_http_negotiate_charset_func(const char *test, double *quality, HashTable *supported TSRMLS_DC) +/* {{{ char *http_negotiate_default_func */ +char *_http_negotiate_default_func(const char *test, double *quality, HashTable *supported TSRMLS_DC) { zval **value; + HashPosition pos; - FOREACH_HASH_VAL(supported, value) { + FOREACH_HASH_VAL(pos, supported, value) { #if HTTP_DBG_NEG fprintf(stderr, "strcasecmp('%s', '%s')\n", Z_STRVAL_PP(value), test); #endif @@ -135,12 +146,13 @@ PHP_HTTP_API HashTable *_http_negotiate_q(const char *header, HashTable *support 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(Z_ARRVAL(ex_arr), entry) { + FOREACH_HASH_VAL(pos, Z_ARRVAL(ex_arr), entry) { double quality; char *selected, *identifier; const char *separator; @@ -422,11 +434,12 @@ PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool pre char *key = NULL; ulong idx = 0; zval array, **hsv; + HashPosition pos; Z_ARRVAL(array) = headers; if (SUCCESS == zend_hash_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void **) &hsv)) { - FOREACH_KEY(*hsv, key, idx) { + FOREACH_KEY(pos, *hsv, key, idx) { if (key && !strncmp(key, "HTTP_", 5)) { zval **header; @@ -435,7 +448,7 @@ PHP_HTTP_API void _http_get_request_headers_ex(HashTable *headers, zend_bool pre key = pretty_key(key, strlen(key), 1, 1); } - zend_hash_get_current_data(Z_ARRVAL_PP(hsv), (void **) &header); + zend_hash_get_current_data_ex(Z_ARRVAL_PP(hsv), (void **) &header, &pos); add_assoc_stringl(&array, key, Z_STRVAL_PP(header), Z_STRLEN_PP(header), 1); key = NULL; } @@ -451,16 +464,17 @@ PHP_HTTP_API zend_bool _http_match_request_header_ex(const char *header, const c ulong idx; zend_bool result = 0; HashTable headers; + HashPosition pos; name = pretty_key(estrdup(header), strlen(header), 1, 1); zend_hash_init(&headers, 0, NULL, ZVAL_PTR_DTOR, 0); http_get_request_headers_ex(&headers, 1); - FOREACH_HASH_KEY(&headers, key, idx) { + FOREACH_HASH_KEY(pos, &headers, key, idx) { if (key && (!strcmp(key, name))) { zval **data; - if (SUCCESS == zend_hash_get_current_data(&headers, (void **) &data)) { + if (SUCCESS == zend_hash_get_current_data_ex(&headers, (void **) &data, &pos)) { result = (match_case ? strcmp(Z_STRVAL_PP(data), value) : strcasecmp(Z_STRVAL_PP(data), value)) ? 0 : 1; } break;