X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_api.c;h=b2da719eae325f4d87975739530a02a805b5b6ae;hp=8b195f80a644647d6e3f0048f0a538208628a385;hb=5c5ddf9042732a05100245844fe2fb70bfe6d495;hpb=bb1f32fd5d06b9b9ace6517c177b0fe58c9ff57c diff --git a/http_request_api.c b/http_request_api.c index 8b195f8..b2da719 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -56,7 +56,7 @@ static inline zend_bool http_ssl_init(void); static inline void http_ssl_cleanup(void); #endif -STATUS _http_request_global_init(INIT_FUNC_ARGS) +PHP_MINIT_FUNCTION(http_request) { if (CURLE_OK != curl_global_init(CURL_GLOBAL_ALL)) { return FAILURE; @@ -76,12 +76,13 @@ STATUS _http_request_global_init(INIT_FUNC_ARGS) return SUCCESS; } -void _http_request_global_cleanup(TSRMLS_D) +PHP_MSHUTDOWN_FUNCTION(http_request) { curl_global_cleanup(); #ifdef HTTP_NEED_SSL http_ssl_cleanup(); #endif + return SUCCESS; } #ifndef HAVE_CURL_EASY_STRERROR @@ -275,12 +276,14 @@ PHP_HTTP_API STATUS _http_request_body_fill(http_request_body *body, HashTable * /* file data */ FOREACH_HASH_VAL(files, data) { - CURLcode err; zval **file, **type, **name; - if ( SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "name", sizeof("name"), (void **) &name) && - SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &type) && - SUCCESS == zend_hash_find(Z_ARRVAL_PP(data), "file", sizeof("file"), (void **) &file)) { - err = curl_formadd(&http_post_data[0], &http_post_data[1], + + if ( SUCCESS != zend_hash_find(Z_ARRVAL_PP(data), "name", sizeof("name"), (void **) &name) || + SUCCESS != zend_hash_find(Z_ARRVAL_PP(data), "type", sizeof("type"), (void **) &type) || + SUCCESS != zend_hash_find(Z_ARRVAL_PP(data), "file", sizeof("file"), (void **) &file)) { + http_error(HE_NOTICE, HTTP_E_INVALID_PARAM, "Post file array entry misses either 'name', 'type' or 'file' entry"); + } else { + CURLcode err = curl_formadd(&http_post_data[0], &http_post_data[1], CURLFORM_COPYNAME, Z_STRVAL_PP(name), CURLFORM_FILE, Z_STRVAL_PP(file), CURLFORM_CONTENTTYPE, Z_STRVAL_PP(type), @@ -291,8 +294,6 @@ PHP_HTTP_API STATUS _http_request_body_fill(http_request_body *body, HashTable * curl_formfree(http_post_data[0]); return FAILURE; } - } else { - http_error(HE_NOTICE, HTTP_E_INVALID_PARAM, "Post file array entry misses either 'name', 'type' or 'file' entry"); } } @@ -433,9 +434,13 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char } #endif - /* compress, empty string enables deflate and gzip */ + /* compress, empty string enables all supported if libcurl was build with zlib support */ if ((zoption = http_curl_getopt(options, "compress", IS_BOOL)) && Z_LVAL_P(zoption)) { +#ifdef HTTP_HAVE_ZLIB + HTTP_CURL_OPT(ENCODING, "gzip;q=1.0, deflate;q=0.5, *;q=0"); +#else HTTP_CURL_OPT(ENCODING, ""); +#endif } /* redirects, defaults to 0 */ @@ -537,8 +542,16 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char /* lastmodified */ if (zoption = http_curl_getopt(options, "lastmodified", IS_LONG)) { - HTTP_CURL_OPT(TIMECONDITION, range_req ? CURL_TIMECOND_IFUNMODSINCE : CURL_TIMECOND_IFMODSINCE); - HTTP_CURL_OPT(TIMEVALUE, Z_LVAL_P(zoption)); + if (Z_LVAL_P(zoption)) { + if (Z_LVAL_P(zoption) > 0) { + HTTP_CURL_OPT(TIMEVALUE, Z_LVAL_P(zoption)); + } else { + HTTP_CURL_OPT(TIMEVALUE, time(NULL) + Z_LVAL_P(zoption)); + } + HTTP_CURL_OPT(TIMECONDITION, range_req ? CURL_TIMECOND_IFUNMODSINCE : CURL_TIMECOND_IFMODSINCE); + } else { + HTTP_CURL_OPT(TIMECONDITION, CURL_TIMECOND_NONE); + } } /* timeout, defaults to 0 */ @@ -739,14 +752,9 @@ PHP_HTTP_API void _http_request_info(CURL *ch, HashTable *info TSRMLS_DC) PHP_HTTP_API STATUS _http_request_ex(CURL *ch, http_request_method meth, char *url, http_request_body *body, HashTable *options, HashTable *info, phpstr *response TSRMLS_DC) { STATUS status; - zend_bool clean_curl; + zend_bool clean_curl = !ch; - if ((clean_curl = (!ch))) { - if (!(ch = curl_easy_init())) { - http_error(HE_WARNING, HTTP_E_REQUEST, "Could not initialize curl."); - return FAILURE; - } - } + HTTP_CHECK_CURL_INIT(ch, curl_easy_init(), return FAILURE); status = ((SUCCESS == http_request_init(ch, meth, url, body, options)) && (SUCCESS == http_request_exec(ch, info, response, NULL))) ? SUCCESS : FAILURE; @@ -944,6 +952,7 @@ static inline void _http_curl_defaults(CURL *ch) HTTP_CURL_OPT(COOKIEJAR, NULL); HTTP_CURL_OPT(RESUME_FROM, 0); HTTP_CURL_OPT(MAXFILESIZE, 0); + HTTP_CURL_OPT(TIMECONDITION, 0); HTTP_CURL_OPT(TIMEVALUE, 0); HTTP_CURL_OPT(TIMEOUT, 0); HTTP_CURL_OPT(CONNECTTIMEOUT, 3); @@ -975,6 +984,15 @@ static inline void _http_curl_defaults(CURL *ch) #endif /* HTTP_HAVE_CURL */ +zend_bool _http_request_supports_ssl(void) +{ +#ifdef HTTP_NEED_SSL + return (zend_bool) 1; +#else + return (zend_bool) 0; +#endif +} + /* * Local variables: * tab-width: 4