X-Git-Url: https://git.m6w6.name/?p=m6w6%2Fext-http;a=blobdiff_plain;f=http_request_api.c;h=b3f7150e62fa240a74aed4ad122afb22e8662b20;hp=5bc0f8fb3ae9a28537812402b9f0c29c6fbfcf46;hb=3e696a1c24d6ffc382567876eafa2a5bd9b8afa7;hpb=77b24e0e5f85b64a168a4ea4ce83db9339b1f31b diff --git a/http_request_api.c b/http_request_api.c index 5bc0f8f..b3f7150 100644 --- a/http_request_api.c +++ b/http_request_api.c @@ -18,6 +18,18 @@ #ifdef HAVE_CONFIG_H # include "config.h" #endif +#include "php.h" + +#include "php_http.h" +#include "php_http_std_defs.h" +#include "php_http_api.h" +#include "php_http_request_api.h" +#include "php_http_url_api.h" +#ifdef ZEND_ENGINE_2 +# include "php_http_request_object.h" +#endif + +#include "phpstr/phpstr.h" #ifdef PHP_WIN32 # include @@ -25,21 +37,12 @@ #include -#include "phpstr/phpstr.h" - -#include "php.h" -#include "php_http.h" -#include "php_http_std_defs.h" -#include "php_http_api.h" -#include "php_http_request_api.h" -#include "php_http_url_api.h" +ZEND_EXTERN_MODULE_GLOBALS(http); #ifndef HTTP_CURL_USE_ZEND_MM # define HTTP_CURL_USE_ZEND_MM 0 #endif -ZEND_EXTERN_MODULE_GLOBALS(http) - #if LIBCURL_VERSION_NUM < 0x070c00 # define curl_easy_strerror(code) HTTP_G(request).error #endif @@ -154,7 +157,6 @@ void *_http_request_data_copy(int type, void *data TSRMLS_DC) case COPY_STRING: { char *new_str = estrdup(data); - //fprintf(stderr, "COPY STRING: %p (%s)\n", new_str, new_str); zend_llist_add_element(&HTTP_G(request).copies.strings, &new_str); return new_str; } @@ -182,7 +184,6 @@ void *_http_request_data_copy(int type, void *data TSRMLS_DC) /* {{{ void http_request_data_free_string(char **) */ void _http_request_data_free_string(void *string) { - //fprintf(stderr, "FREE STRING %p (%s)\n", *((char **)string), *((char **)string)); efree(*((char **)string)); } /* }}} */ @@ -357,6 +358,7 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char /* progress callback */ if (zoption = http_curl_getopt(options, "onprogress", 0)) { + HTTP_CURL_OPT(NOPROGRESS, 0); HTTP_CURL_OPT(PROGRESSFUNCTION, http_curl_progress_callback); HTTP_CURL_OPT(PROGRESSDATA, http_curl_callback_data(zoption)); } else { @@ -412,10 +414,10 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char #endif /* compress, empty string enables deflate and gzip */ - if (zoption = http_curl_getopt(options, "compress", IS_BOOL)) { - if (Z_LVAL_P(zoption)) { - HTTP_CURL_OPT(ENCODING, http_request_data_copy(COPY_STRING, "")); - } + if ((zoption = http_curl_getopt(options, "compress", IS_BOOL)) && Z_LVAL_P(zoption)) { + HTTP_CURL_OPT(ENCODING, ""); + } else { + HTTP_CURL_OPT(ENCODING, 0); } /* redirects, defaults to 0 */ @@ -432,13 +434,15 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char /* referer */ if (zoption = http_curl_getopt(options, "referer", IS_STRING)) { HTTP_CURL_OPT(REFERER, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption))); + } else { + HTTP_CURL_OPT(REFERER, NULL); } /* useragent, default "PECL::HTTP/version (PHP/version)" */ if (zoption = http_curl_getopt(options, "useragent", IS_STRING)) { HTTP_CURL_OPT(USERAGENT, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption))); } else { - HTTP_CURL_OPT(USERAGENT, http_request_data_copy(COPY_STRING, "PECL::HTTP/" HTTP_PEXT_VERSION " (PHP/" PHP_VERSION ")")); + HTTP_CURL_OPT(USERAGENT, "PECL::HTTP/" HTTP_PEXT_VERSION " (PHP/" PHP_VERSION ")"); } /* additional headers, array('name' => 'value') */ @@ -491,41 +495,67 @@ PHP_HTTP_API STATUS _http_request_init(CURL *ch, http_request_method meth, char HTTP_CURL_OPT(COOKIE, http_request_data_copy(COPY_STRING, qstr->data)); } phpstr_free(qstr); + } else { + HTTP_CURL_OPT(COOKIE, NULL); + } + + /* session cookies */ + if (zoption = http_curl_getopt(options, "cookiesession", IS_BOOL)) { + if (Z_LVAL_P(zoption)) { + /* accept cookies for this session */ + HTTP_CURL_OPT(COOKIEFILE, ""); + } else { + /* reset session cookies */ + HTTP_CURL_OPT(COOKIESESSION, 1); + } + } else { + HTTP_CURL_OPT(COOKIEFILE, NULL); } - /* cookiestore */ - if (zoption = http_curl_getopt(options, "cookiestore", IS_STRING)) { + /* cookiestore, read initial cookies from that file and store cookies back into that file */ + if ((zoption = http_curl_getopt(options, "cookiestore", IS_STRING)) && Z_STRLEN_P(zoption)) { HTTP_CURL_OPT(COOKIEFILE, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption))); HTTP_CURL_OPT(COOKIEJAR, http_request_data_copy(COPY_STRING, Z_STRVAL_P(zoption))); + } else { + HTTP_CURL_OPT(COOKIEFILE, NULL); + HTTP_CURL_OPT(COOKIEJAR, NULL); } /* resume */ if (zoption = http_curl_getopt(options, "resume", IS_LONG)) { range_req = 1; HTTP_CURL_OPT(RESUME_FROM, Z_LVAL_P(zoption)); + } else { + HTTP_CURL_OPT(RESUME_FROM, 0); } /* maxfilesize */ if (zoption = http_curl_getopt(options, "maxfilesize", IS_LONG)) { HTTP_CURL_OPT(MAXFILESIZE, Z_LVAL_P(zoption)); + } else { + HTTP_CURL_OPT(MAXFILESIZE, 0); } /* 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)); + } else { + HTTP_CURL_OPT(TIMEVALUE, 0); } - /* timeout */ + /* timeout, defaults to 3 */ if (zoption = http_curl_getopt(options, "timeout", IS_LONG)) { HTTP_CURL_OPT(TIMEOUT, Z_LVAL_P(zoption)); + } else { + HTTP_CURL_OPT(TIMEOUT, 3); } - /* connecttimeout, defaults to 1 */ + /* connecttimeout, defaults to 3 */ if (zoption = http_curl_getopt(options, "connecttimeout", IS_LONG)) { HTTP_CURL_OPT(CONNECTTIMEOUT, Z_LVAL_P(zoption)); } else { - HTTP_CURL_OPT(CONNECTTIMEOUT, 1); + HTTP_CURL_OPT(CONNECTTIMEOUT, 3); } /* ssl */ @@ -864,7 +894,6 @@ static size_t http_curl_write_callback(char *buf, size_t len, size_t n, void *s) /* {{{ static size_t http_curl_read_callback(void *, size_t, size_t, void *) */ static size_t http_curl_read_callback(void *data, size_t len, size_t n, void *s) { - static char *offset = NULL, *original = NULL; HTTP_CURL_CALLBACK_DATA(s, http_request_body *, body); if (body->type != HTTP_REQUEST_BODY_UPLOADFILE) { @@ -895,6 +924,10 @@ static int http_curl_progress_callback(void *data, double dltotal, double dlnow, params_pass[2] = ¶ms_local[2]; params_pass[3] = ¶ms_local[3]; + INIT_PZVAL(params_pass[0]); + INIT_PZVAL(params_pass[1]); + INIT_PZVAL(params_pass[2]); + INIT_PZVAL(params_pass[3]); ZVAL_DOUBLE(params_pass[0], dltotal); ZVAL_DOUBLE(params_pass[1], dlnow); ZVAL_DOUBLE(params_pass[2], ultotal); @@ -904,6 +937,7 @@ static int http_curl_progress_callback(void *data, double dltotal, double dlnow, } /* }}} */ +/* {{{ static int http_curl_debug_callback(CURL *, curl_infotype, char *, size_t, void *) */ static int http_curl_debug_callback(CURL *ch, curl_infotype type, char *string, size_t length, void *data) { zval *params_pass[2], params_local[2], retval; @@ -912,13 +946,28 @@ static int http_curl_debug_callback(CURL *ch, curl_infotype type, char *string, params_pass[0] = ¶ms_local[0]; params_pass[1] = ¶ms_local[1]; + INIT_PZVAL(&retval); + INIT_PZVAL(params_pass[0]); + INIT_PZVAL(params_pass[1]); ZVAL_LONG(params_pass[0], type); - ZVAL_STRINGL(params_pass[1], string, length, 1); + ZVAL_STRINGL(params_pass[1], string, length, 0); - call_user_function(EG(function_table), NULL, func, &retval, 2, params_pass TSRMLS_CC); +#ifdef ZEND_ENGINE_2 + /* ensure we can call private HttpRequest::debugWrapper() */ + { + void *sc = EG(scope); + EG(scope) = http_request_object_ce; +#endif + call_user_function(EG(function_table), NULL, func, &retval, 2, params_pass TSRMLS_CC); +#ifdef ZEND_ENGINE_2 + EG(scope) = sc; + } +#endif return 0; } +/* }}} */ + /* {{{ static inline zval *http_curl_getopt(HashTable *, char *, size_t, int) */ static inline zval *_http_curl_getopt_ex(HashTable *options, char *key, size_t keylen, int type TSRMLS_DC) { @@ -936,7 +985,7 @@ static inline zval *_http_curl_getopt_ex(HashTable *options, char *key, size_t k case IS_DOUBLE: convert_to_double_ex(zoption); break; case IS_STRING: convert_to_string_ex(zoption); break; case IS_ARRAY: convert_to_array_ex(zoption); break; - case IS_OBJECT: convert_to_object_ex(zoption); break; + case IS_OBJECT: convert_to_object_ex(zoption); break; default: break; }