X-Git-Url: https://git.m6w6.name/?a=blobdiff_plain;f=php_http_request.c;h=90b0f31079019fe5cda31bdef0110ef7f492e297;hb=34c5e92d16dbd185ca792bd889d9e6d27cdaac80;hp=1df601fb6c4817012342967440d116f0b51f0138;hpb=d3485e3b28336153dca690e872ffe1ddc60fedd2;p=m6w6%2Fext-http diff --git a/php_http_request.c b/php_http_request.c index 1df601f..90b0f31 100644 --- a/php_http_request.c +++ b/php_http_request.c @@ -14,6 +14,29 @@ #include "php_http.h" +#include + +#if defined(ZTS) && defined(PHP_HTTP_HAVE_SSL) +# ifdef PHP_WIN32 +# define PHP_HTTP_NEED_OPENSSL_TSL +# include +# else /* !PHP_WIN32 */ +# if defined(PHP_HTTP_HAVE_OPENSSL) +# define PHP_HTTP_NEED_OPENSSL_TSL +# include +# elif defined(PHP_HTTP_HAVE_GNUTLS) +# define PHP_HTTP_NEED_GNUTLS_TSL +# include +# else +# warning \ + "libcurl was compiled with SSL support, but configure could not determine which" \ + "library was used; thus no SSL crypto locking callbacks will be set, which may " \ + "cause random crashes on SSL requests" +# endif /* PHP_HTTP_HAVE_OPENSSL || PHP_HTTP_HAVE_GNUTLS */ +# endif /* PHP_WIN32 */ +#endif /* ZTS && PHP_HTTP_HAVE_SSL */ + + #ifdef PHP_HTTP_NEED_OPENSSL_TSL static MUTEX_T *php_http_openssl_tsl = NULL; @@ -574,7 +597,7 @@ PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTa /* redirects, defaults to 0 */ if ((zoption = php_http_request_option(request, options, ZEND_STRS("redirect"), IS_LONG))) { PHP_HTTP_CURL_OPT(CURLOPT_FOLLOWLOCATION, Z_LVAL_P(zoption) ? 1L : 0L); - PHP_HTTP_CURL_OPT(CURLOPT_MAXREDIRS, Z_LVAL_P(zoption)); + PHP_HTTP_CURL_OPT(CURLOPT_MAXREDIRS, request->_cache.redirects = Z_LVAL_P(zoption)); if ((zoption = php_http_request_option(request, options, ZEND_STRS("unrestrictedauth"), IS_BOOL))) { PHP_HTTP_CURL_OPT(CURLOPT_UNRESTRICTED_AUTH, Z_LVAL_P(zoption)); } @@ -585,6 +608,8 @@ PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTa PHP_HTTP_CURL_OPT(CURLOPT_POST301, Z_BVAL_P(zoption) ? 1L : 0L); #endif } + } else { + request->_cache.redirects = 0; } /* retries, defaults to 0 */ @@ -623,7 +648,7 @@ PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTa else if ((zoption = php_http_request_option(request, options, ZEND_STRS("range"), IS_ARRAY)) && zend_hash_num_elements(Z_ARRVAL_P(zoption))) { HashPosition pos1, pos2; zval **rr, **rb, **re; - php_http_buffer rs; + php_http_buffer_t rs; php_http_buffer_init(&rs); FOREACH_VAL(pos1, zoption, rr) { @@ -670,7 +695,7 @@ PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTa php_http_array_hashkey_t header_key = php_http_array_hashkey_init(0); zval **header_val; HashPosition pos; - php_http_buffer header; + php_http_buffer_t header; php_http_buffer_init(&header); FOREACH_KEYVAL(pos, zoption, header_key, header_val) { @@ -694,7 +719,7 @@ PHP_HTTP_API STATUS php_http_request_prepare(php_http_request_t *request, HashTa /* etag */ if ((zoption = php_http_request_option(request, options, ZEND_STRS("etag"), IS_STRING)) && Z_STRLEN_P(zoption)) { zend_bool is_quoted = !((Z_STRVAL_P(zoption)[0] != '"') || (Z_STRVAL_P(zoption)[Z_STRLEN_P(zoption)-1] != '"')); - php_http_buffer header; + php_http_buffer_t header; php_http_buffer_init(&header); php_http_buffer_appendf(&header, is_quoted?"%s: %s":"%s: \"%s\"", range_req?"If-Match":"If-None-Match", Z_STRVAL_P(zoption)); @@ -996,7 +1021,7 @@ static int php_http_curl_raw_callback(CURL *ch, curl_infotype type, char *data, case CURLINFO_HEADER_OUT: case CURLINFO_DATA_OUT: php_http_buffer_append(request->parser.buf, data, length); - if (PHP_HTTP_MESSAGE_PARSER_STATE_FAILURE == php_http_message_parser_parse(request->parser.ctx, request->parser.buf, 0, &request->parser.msg)) { + if (PHP_HTTP_MESSAGE_PARSER_STATE_FAILURE == php_http_message_parser_parse(request->parser.ctx, request->parser.buf, request->_cache.redirects?PHP_HTTP_MESSAGE_PARSER_EMPTY_REDIRECTS:0, &request->parser.msg)) { return -1; } break; @@ -2077,9 +2102,8 @@ PHP_METHOD(HttpRequest, getResponseBody) { if (SUCCESS == zend_parse_parameters_none()) { zval *message = zend_read_property(php_http_request_class_entry, getThis(), ZEND_STRL("responseMessage"), 0 TSRMLS_CC); - zval *body = zend_read_property(php_http_message_class_entry, message, ZEND_STRL("body"), 0 TSRMLS_CC); - RETURN_ZVAL(body, 1, 0); + RETURN_OBJVAL(((php_http_message_object_t *)zend_object_store_get_object(message TSRMLS_CC))->body, 1); } RETURN_FALSE; }