X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_functions.c;h=90350e2d23dec09c880fec6048522a0200ba5806;hp=3ec05777fc273bbdacb68533fa97545a2403547c;hb=376bdc3230e8f6d2b8f167d4534e1dc8d0e0fc68;hpb=8d25696948ed61d50c417275222117f43069ddd1 diff --git a/http_functions.c b/http_functions.c index 3ec0577..90350e2 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; \ @@ -251,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. @@ -447,7 +482,7 @@ PHP_FUNCTION(http_cache_last_modified) /* 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 { @@ -817,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); @@ -939,6 +974,24 @@ PHP_FUNCTION(http_match_request_header) /* {{{ HAVE_CURL */ #ifdef HTTP_HAVE_CURL +#define RETURN_RESPONSE_OR_BODY(response) \ + { \ + zval **bodyonly; \ + \ + /* check if only the body should be returned */ \ + if (options && (SUCCESS == zend_hash_find(Z_ARRVAL_P(options), "bodyonly", sizeof("bodyonly"), (void **) &bodyonly)) && zval_is_true(*bodyonly)) { \ + http_message *msg = http_message_parse(PHPSTR_VAL(&response), PHPSTR_LEN(&response)); \ + \ + if (msg) { \ + RETVAL_STRINGL(PHPSTR_VAL(&msg->body), PHPSTR_LEN(&msg->body), 1); \ + http_message_free(&msg); \ + return; \ + } \ + } else { \ + RETURN_PHPSTR_VAL(&response); \ + } \ + } + /* {{{ proto string http_get(string url[, array options[, array &info]]) * * Performs an HTTP GET request on the supplied url. @@ -1028,11 +1081,10 @@ PHP_FUNCTION(http_get) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_get(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(&response); - } else { - phpstr_dtor(&response); - RETURN_FALSE; + RETURN_RESPONSE_OR_BODY(response); } + phpstr_dtor(&response); + RETURN_FALSE; } /* }}} */ @@ -1062,11 +1114,10 @@ PHP_FUNCTION(http_head) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_head(URL, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(&response); - } else { - phpstr_dtor(&response); - RETURN_FALSE; + RETURN_RESPONSE_OR_BODY(response); } + phpstr_dtor(&response); + RETURN_FALSE; } /* }}} */ @@ -1102,11 +1153,10 @@ PHP_FUNCTION(http_post_data) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETVAL_PHPSTR_VAL(&response); - } else { - phpstr_dtor(&response); - RETVAL_FALSE; + RETURN_RESPONSE_OR_BODY(response); } + phpstr_dtor(&response); + RETVAL_FALSE; } /* }}} */ @@ -1142,12 +1192,12 @@ PHP_FUNCTION(http_post_fields) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_post(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETVAL_PHPSTR_VAL(&response); - } else { - phpstr_dtor(&response); - RETVAL_FALSE; + http_request_body_dtor(&body); + RETURN_RESPONSE_OR_BODY(response); } http_request_body_dtor(&body); + phpstr_dtor(&response); + RETURN_FALSE; } /* }}} */ @@ -1193,12 +1243,12 @@ PHP_FUNCTION(http_put_file) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETVAL_PHPSTR_VAL(&response); - } else { - phpstr_dtor(&response); - RETVAL_FALSE; + http_request_body_dtor(&body); + RETURN_RESPONSE_OR_BODY(response); } http_request_body_dtor(&body); + phpstr_dtor(&response); + RETURN_FALSE; } /* }}} */ @@ -1242,11 +1292,10 @@ PHP_FUNCTION(http_put_stream) phpstr_init_ex(&response, HTTP_CURLBUF_SIZE, 0); if (SUCCESS == http_put(URL, &body, options ? Z_ARRVAL_P(options) : NULL, info ? Z_ARRVAL_P(info) : NULL, &response)) { - RETURN_PHPSTR_VAL(&response); - } else { - phpstr_dtor(&response); - RETURN_NULL(); + RETURN_RESPONSE_OR_BODY(response); } + phpstr_dtor(&response); + RETURN_FALSE; } /* }}} */ #endif /* HTTP_HAVE_CURL */ @@ -1269,7 +1318,7 @@ PHP_FUNCTION(http_request_method_register) 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); } @@ -1611,8 +1660,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 *