X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_api.c;h=b9931c81dd35ca74611b01281021632ea7e5e396;hp=865790908423cf28792996286602b15b75f21349;hb=121eac188fc0c1cabe3ea571a72867d3fd6b1b3f;hpb=c4bf0a26f53d88dc8724d96e599a3867113da2be diff --git a/http_request_api.c b/http_request_api.c index 8657909..b9931c8 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -21,6 +21,9 @@ #include "php_http_api.h" #include "php_http_request_api.h" #include "php_http_url_api.h" +#ifdef HTTP_HAVE_PERSISTENT_HANDLES +# include "php_http_persistent_handle_api.h" +#endif #ifdef ZEND_ENGINE_2 # include "php_http_request_object.h" @@ -109,6 +112,12 @@ PHP_MINIT_FUNCTION(http_request) return FAILURE; } +#ifdef HTTP_HAVE_PERSISTENT_HANDLES + if (SUCCESS != http_persistent_handle_provide("http_request", curl_easy_init, curl_easy_cleanup)) { + return FAILURE; + } +#endif + HTTP_LONG_CONSTANT("HTTP_AUTH_BASIC", CURLAUTH_BASIC); HTTP_LONG_CONSTANT("HTTP_AUTH_DIGEST", CURLAUTH_DIGEST); HTTP_LONG_CONSTANT("HTTP_AUTH_NTLM", CURLAUTH_NTLM); @@ -176,10 +185,18 @@ static int http_curl_dummy_callback(char *data, size_t n, size_t l, void *s) { r static curlioerr http_curl_ioctl_callback(CURL *, curliocmd, void *); /* }}} */ +#ifdef HTTP_HAVE_PERSISTENT_HANDLES +# define HTTP_CURL_HANDLE_CTOR(ch) (SUCCESS == http_persistent_handle_acquire("http_request", &(ch))) +# define HTTP_CURL_HANDLE_DTOR(chp) http_persistent_handle_release("http_request", (chp)) +#else +# define HTTP_CURL_HANDLE_CTOR(ch) ((ch) = curl_easy_init()) +# define HTTP_CURL_HANDLE_DTOR(chp) curl_easy_cleanup(*(chp)); *(chp) = NULL +#endif + /* {{{ CURL *http_curl_init(http_request *) */ PHP_HTTP_API CURL * _http_curl_init_ex(CURL *ch, http_request *request) { - if (ch || (ch = curl_easy_init())) { + if (ch || HTTP_CURL_HANDLE_CTOR(ch)) { #if defined(ZTS) curl_easy_setopt(ch, CURLOPT_NOSIGNAL, 1L); #endif @@ -214,13 +231,12 @@ PHP_HTTP_API CURL * _http_curl_init_ex(CURL *ch, http_request *request) PHP_HTTP_API void _http_curl_free(CURL **ch) { if (*ch) { - /* avoid nasty segfaults with already cleaned up callbacks */ curl_easy_setopt(*ch, CURLOPT_NOPROGRESS, 1L); curl_easy_setopt(*ch, CURLOPT_PROGRESSFUNCTION, NULL); curl_easy_setopt(*ch, CURLOPT_VERBOSE, 0L); curl_easy_setopt(*ch, CURLOPT_DEBUGFUNCTION, NULL); - curl_easy_cleanup(*ch); - *ch = NULL; + + HTTP_CURL_HANDLE_DTOR(ch); } } /* }}} */ @@ -639,14 +655,14 @@ PHP_HTTP_API STATUS _http_request_prepare(http_request *request, HashTable *opti FOREACH_KEYVAL(pos, zoption, header_key, header_val) { if (header_key.type == HASH_KEY_IS_STRING) { - char header[1024] = {0}; + char header[1024]; ZVAL_ADDREF(*header_val); convert_to_string_ex(header_val); if (!strcasecmp(header_key.str, "range")) { range_req = 1; } - snprintf(header, lenof(header), "%s: %s", header_key.str, Z_STRVAL_PP(header_val)); + snprintf(header, sizeof(header), "%s: %s", header_key.str, Z_STRVAL_PP(header_val)); request->_cache.headers = curl_slist_append(request->_cache.headers, header); zval_ptr_dtor(header_val); } @@ -654,12 +670,12 @@ PHP_HTTP_API STATUS _http_request_prepare(http_request *request, HashTable *opti } /* etag */ if ((zoption = http_request_option(request, options, "etag", IS_STRING)) && Z_STRLEN_P(zoption)) { - char match_header[1024] = {0}, *quoted_etag = NULL; + char match_header[1024], *quoted_etag = NULL; if ((Z_STRVAL_P(zoption)[0] != '"') || (Z_STRVAL_P(zoption)[Z_STRLEN_P(zoption)-1] != '"')) { spprintf("ed_etag, 0, "\"%s\"", Z_STRVAL_P(zoption)); } - snprintf(match_header, lenof(match_header), "%s: %s", range_req?"If-Match":"If-None-Match", quoted_etag?quoted_etag:Z_STRVAL_P(zoption)); + snprintf(match_header, sizeof(match_header), "%s: %s", range_req?"If-Match":"If-None-Match", quoted_etag?quoted_etag:Z_STRVAL_P(zoption)); request->_cache.headers = curl_slist_append(request->_cache.headers, match_header); STR_FREE(quoted_etag); } @@ -986,7 +1002,7 @@ static int http_curl_raw_callback(CURL *ch, curl_infotype type, char *data, size break; } -#if 1 +#if 0 fprintf(stderr, "DEBUG: %3d (%5zu) %.*s%s", type, length, length, data, data[length-1]=='\n'?"":"\n"); #endif