X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;ds=sidebyside;f=http_functions.c;h=c094e640a56d11c918ed9e4d3156492a1286f78f;hb=68dc6489387c3f5429fc7a85d2a02c2ad2957c44;hp=34a8e7181f23f0e799f5c2c9cb5c0a1694badadf;hpb=e83a7438dc70ed96630887246a1d3aefcf155b1c;p=m6w6%2Fext-http diff --git a/http_functions.c b/http_functions.c index 34a8e71..c094e64 100644 --- a/http_functions.c +++ b/http_functions.c @@ -15,33 +15,30 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif -#include "php.h" -#include "zend_operators.h" +#define HTTP_WANT_CURL +#include "php_http.h" #include "SAPI.h" #include "php_ini.h" #include "ext/standard/info.h" #include "ext/standard/php_string.h" +#include "zend_operators.h" + #if defined(HAVE_PHP_SESSION) && !defined(COMPILE_DL_SESSION) # include "ext/session/php_session.h" #endif -#include "php_http.h" -#include "php_http_std_defs.h" #include "php_http_api.h" -#include "php_http_request_api.h" #include "php_http_cache_api.h" -#include "php_http_request_method_api.h" -#include "php_http_request_api.h" #include "php_http_date_api.h" +#include "php_http_encoding_api.h" #include "php_http_headers_api.h" #include "php_http_message_api.h" +#include "php_http_request_api.h" +#include "php_http_request_method_api.h" #include "php_http_send_api.h" #include "php_http_url_api.h" -#include "php_http_encoding_api.h" - -#include "phpstr/phpstr.h" ZEND_EXTERN_MODULE_GLOBALS(http) @@ -108,7 +105,7 @@ PHP_FUNCTION(http_build_uri) #define HTTP_DO_NEGOTIATE(type, supported, rs_array) \ { \ HashTable *result; \ - if (result = http_negotiate_ ##type(supported)) { \ + if ((result = http_negotiate_ ##type(supported))) { \ char *key; \ uint key_len; \ ulong idx; \ @@ -137,9 +134,10 @@ PHP_FUNCTION(http_build_uri) } \ \ if (rs_array) { \ + HashPosition pos; \ zval **value; \ \ - FOREACH_VAL(supported, value) { \ + FOREACH_VAL(pos, supported, value) { \ convert_to_string_ex(value); \ add_assoc_double(rs_array, Z_STRVAL_PP(value), 1.0); \ } \ @@ -250,6 +248,44 @@ PHP_FUNCTION(http_negotiate_charset) } /* }}} */ +/* {{{ proto string http_negotiate_ctype(array supported[, array &result]) + * + * This function negotiates the clients preferred content type based on its + * Accept HTTP header. The qualifier is recognized and content types + * without qualifier are rated highest. + * + * Expects an array as parameter cotaining the supported content types as values. + * If the optional second parameter is supplied, it will be filled with an + * array containing the negotiation results. + * + * Returns the negotiated content type or the default content type + * (i.e. first array entry) if none match. + * + * Example: + *
+ * 
+ * 
+ */ +PHP_FUNCTION(http_negotiate_content_type) +{ + zval *supported, *rs_array = NULL; + + if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|z", &supported, &rs_array)) { + RETURN_FALSE; + } + + if (rs_array) { + zval_dtor(rs_array); + array_init(rs_array); + } + + HTTP_DO_NEGOTIATE(content_type, supported, rs_array); +} +/* }}} */ + /* {{{ proto bool http_send_status(int status) * * Send HTTP status code. @@ -438,13 +474,15 @@ PHP_FUNCTION(http_cache_last_modified) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|l", &last_modified) != SUCCESS) { RETURN_FALSE; } + + HTTP_CHECK_HEADERS_SENT(RETURN_FALSE); t = (long) time(NULL); /* 0 or omitted */ if (!last_modified) { /* does the client have? (att: caching "forever") */ - if (zlm = http_get_server_var("HTTP_IF_MODIFIED_SINCE")) { + if ((zlm = http_get_server_var("HTTP_IF_MODIFIED_SINCE"))) { last_modified = send_modified = http_parse_date(Z_STRVAL_P(zlm)); /* send current time */ } else { @@ -485,6 +523,8 @@ PHP_FUNCTION(http_cache_etag) if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "|s", &etag, &etag_len) != SUCCESS) { RETURN_FALSE; } + + HTTP_CHECK_HEADERS_SENT(RETURN_FALSE); RETURN_SUCCESS(http_cache_etag(etag, etag_len, HTTP_DEFAULT_CACHECONTROL, lenof(HTTP_DEFAULT_CACHECONTROL))); } @@ -812,7 +852,7 @@ PHP_FUNCTION(http_parse_message) RETURN_NULL(); } - if (msg = http_message_parse(message, message_len)) { + if ((msg = http_message_parse(message, message_len))) { object_init(return_value); http_message_tostruct_recursive(msg, return_value); http_message_free(&msg); @@ -1259,12 +1299,12 @@ PHP_FUNCTION(http_request_method_register) { char *method; int method_len; - unsigned long existing; + ulong existing; if (SUCCESS != zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &method, &method_len)) { RETURN_FALSE; } - if (existing = http_request_method_exists(1, 0, method)) { + if ((existing = http_request_method_exists(1, 0, method))) { RETURN_LONG((long) existing); } @@ -1296,7 +1336,7 @@ PHP_FUNCTION(http_request_method_unregister) if (is_numeric_string(Z_STRVAL_P(method), Z_STRLEN_P(method), NULL, NULL, 1)) { convert_to_long(method); } else { - unsigned long mn; + ulong mn; if (!(mn = http_request_method_exists(1, 0, Z_STRVAL_P(method)))) { RETURN_FALSE; } @@ -1364,7 +1404,7 @@ PHP_FUNCTION(http_request_method_name) RETURN_FALSE; } - RETURN_STRING(estrdup(http_request_method_name((unsigned long) method)), 0); + RETURN_STRING(estrdup(http_request_method_name((ulong) method)), 0); } } /* }}} */ @@ -1381,21 +1421,17 @@ PHP_FUNCTION(http_build_query) int prefix_len = 0, arg_sep_len = strlen(arg_sep); phpstr *formstr; - if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z|ss", &formdata, &prefix, &prefix_len, &arg_sep, &arg_sep_len) != SUCCESS) { - RETURN_FALSE; - } - - if (Z_TYPE_P(formdata) != IS_ARRAY && Z_TYPE_P(formdata) != IS_OBJECT) { - http_error(HE_WARNING, HTTP_E_INVALID_PARAM, "Parameter 1 expected to be Array or Object. Incorrect value given."); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a|ss", &formdata, &prefix, &prefix_len, &arg_sep, &arg_sep_len) != SUCCESS) { RETURN_FALSE; } if (!arg_sep_len) { arg_sep = HTTP_URL_ARGSEP; + arg_sep_len = lenof(HTTP_URL_ARGSEP); } formstr = phpstr_new(); - if (SUCCESS != http_urlencode_hash_implementation_ex(HASH_OF(formdata), formstr, arg_sep, prefix, prefix_len, NULL, 0, NULL, 0, (Z_TYPE_P(formdata) == IS_OBJECT ? formdata : NULL))) { + if (SUCCESS != http_urlencode_hash_recursive(HASH_OF(formdata), formstr, arg_sep, arg_sep_len, prefix, prefix_len)) { phpstr_free(&formstr); RETURN_FALSE; } @@ -1610,8 +1646,6 @@ PHP_FUNCTION(http_uncompress) * and SSL requests can be issued *
  • HTTP_SUPPORT_ENCODINGS: whether ext/http was linked against zlib, * and compressed HTTP responses can be decoded - *
  • HTTP_SUPPORT_MHASHETAGS: whether ext/http was linked against libmhash, - * and ETags can be generated with the available mhash algorithms *
  • HTTP_SUPPORT_MAGICMIME: whether ext/http was linked against libmagic, * and the HttpResponse::guessContentType() method is usable *