+ http_request *r;
+
+ if (request) {
+ r = request;
+ } else {
+ r = emalloc_rel(sizeof(http_request));
+ }
+ memset(r, 0, sizeof(http_request));
+
+ r->ch = ch;
+ r->url = (url) ? http_absolute_url(url) : NULL;
+ r->meth = (meth > 0) ? meth : HTTP_GET;
+
+ phpstr_init(&r->conv.request);
+ phpstr_init_ex(&r->conv.response, HTTP_CURLBUF_SIZE, 0);
+ phpstr_init(&r->_cache.cookies);
+ zend_hash_init(&r->_cache.options, 0, NULL, ZVAL_PTR_DTOR, 0);
+
+ TSRMLS_SET_CTX(r->tsrm_ls);
+
+ return r;
+}
+/* }}} */
+
+/* {{{ void http_request_dtor(http_request *) */
+PHP_HTTP_API void _http_request_dtor(http_request *request)
+{
+ TSRMLS_FETCH_FROM_CTX(request->tsrm_ls);
+
+ http_curl_free(&request->ch);
+ http_request_reset(request);
+
+ phpstr_dtor(&request->_cache.cookies);
+ zend_hash_destroy(&request->_cache.options);
+ if (request->_cache.headers) {
+ curl_slist_free_all(request->_cache.headers);
+ request->_cache.headers = NULL;
+ }
+ if (request->_progress_callback) {
+ zval_ptr_dtor(&request->_progress_callback);
+ request->_progress_callback = NULL;
+ }
+}
+/* }}} */
+
+/* {{{ void http_request_free(http_request **) */
+PHP_HTTP_API void _http_request_free(http_request **request)
+{
+ if (*request) {
+ TSRMLS_FETCH_FROM_CTX((*request)->tsrm_ls);
+ http_request_body_free(&(*request)->body);
+ http_request_dtor(*request);
+ efree(*request);
+ *request = NULL;
+ }
+}
+/* }}} */
+
+/* {{{ void http_request_reset(http_request *) */
+PHP_HTTP_API void _http_request_reset(http_request *request)
+{
+ TSRMLS_FETCH_FROM_CTX(request->tsrm_ls);
+ STR_SET(request->url, NULL);
+ request->conv.last_type = 0;
+ phpstr_dtor(&request->conv.request);
+ phpstr_dtor(&request->conv.response);
+ http_request_body_dtor(request->body);
+
+ if (request->ch) {
+ http_request_defaults(request);
+ }
+}
+/* }}} */
+
+/* {{{ void http_request_defaults(http_request *) */
+PHP_HTTP_API void _http_request_defaults(http_request *request)
+{
+ if (request->ch) {
+ HTTP_CURL_OPT(CURLOPT_PROGRESSFUNCTION, NULL);
+ HTTP_CURL_OPT(CURLOPT_URL, NULL);
+ HTTP_CURL_OPT(CURLOPT_NOPROGRESS, 1);
+ HTTP_CURL_OPT(CURLOPT_PROXY, NULL);
+ HTTP_CURL_OPT(CURLOPT_PROXYPORT, 0);
+ HTTP_CURL_OPT(CURLOPT_PROXYUSERPWD, NULL);
+ HTTP_CURL_OPT(CURLOPT_PROXYAUTH, 0);
+ HTTP_CURL_OPT(CURLOPT_INTERFACE, NULL);
+ HTTP_CURL_OPT(CURLOPT_PORT, 0);
+ HTTP_CURL_OPT(CURLOPT_USERPWD, NULL);
+ HTTP_CURL_OPT(CURLOPT_HTTPAUTH, 0);
+ HTTP_CURL_OPT(CURLOPT_ENCODING, NULL);
+ HTTP_CURL_OPT(CURLOPT_FOLLOWLOCATION, 0);
+ HTTP_CURL_OPT(CURLOPT_UNRESTRICTED_AUTH, 0);
+ HTTP_CURL_OPT(CURLOPT_REFERER, NULL);
+ HTTP_CURL_OPT(CURLOPT_USERAGENT, "PECL::HTTP/" PHP_EXT_HTTP_VERSION " (PHP/" PHP_VERSION ")");
+ HTTP_CURL_OPT(CURLOPT_HTTPHEADER, NULL);
+ HTTP_CURL_OPT(CURLOPT_COOKIE, NULL);
+#if LIBCURL_VERSION_NUM >= 0x070e01
+ HTTP_CURL_OPT(CURLOPT_COOKIELIST, NULL);
+#endif
+ HTTP_CURL_OPT(CURLOPT_COOKIEFILE, NULL);
+ HTTP_CURL_OPT(CURLOPT_COOKIEJAR, NULL);
+ HTTP_CURL_OPT(CURLOPT_RESUME_FROM, 0);
+ HTTP_CURL_OPT(CURLOPT_MAXFILESIZE, 0);
+ HTTP_CURL_OPT(CURLOPT_TIMECONDITION, 0);
+ HTTP_CURL_OPT(CURLOPT_TIMEVALUE, 0);
+ HTTP_CURL_OPT(CURLOPT_TIMEOUT, 0);
+ HTTP_CURL_OPT(CURLOPT_CONNECTTIMEOUT, 3);
+ HTTP_CURL_OPT(CURLOPT_SSLCERT, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLCERTTYPE, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLCERTPASSWD, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLKEY, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLKEYTYPE, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLKEYPASSWD, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLENGINE, NULL);
+ HTTP_CURL_OPT(CURLOPT_SSLVERSION, 0);
+ HTTP_CURL_OPT(CURLOPT_SSL_VERIFYPEER, 0);
+ HTTP_CURL_OPT(CURLOPT_SSL_VERIFYHOST, 0);
+ HTTP_CURL_OPT(CURLOPT_SSL_CIPHER_LIST, NULL);
+ HTTP_CURL_OPT(CURLOPT_CAINFO, NULL);
+ HTTP_CURL_OPT(CURLOPT_CAPATH, NULL);
+ HTTP_CURL_OPT(CURLOPT_RANDOM_FILE, NULL);
+ HTTP_CURL_OPT(CURLOPT_EGDSOCKET, NULL);
+ HTTP_CURL_OPT(CURLOPT_POSTFIELDS, NULL);
+ HTTP_CURL_OPT(CURLOPT_POSTFIELDSIZE, 0);
+ HTTP_CURL_OPT(CURLOPT_HTTPPOST, NULL);
+ HTTP_CURL_OPT(CURLOPT_IOCTLDATA, NULL);
+ HTTP_CURL_OPT(CURLOPT_READDATA, NULL);
+ HTTP_CURL_OPT(CURLOPT_INFILESIZE, 0);
+ HTTP_CURL_OPT(CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_NONE);
+ HTTP_CURL_OPT(CURLOPT_CUSTOMREQUEST, NULL);
+ HTTP_CURL_OPT(CURLOPT_NOBODY, 0);
+ HTTP_CURL_OPT(CURLOPT_POST, 0);
+ HTTP_CURL_OPT(CURLOPT_UPLOAD, 0);
+ HTTP_CURL_OPT(CURLOPT_HTTPGET, 1);
+ }
+}
+/* }}} */
+
+PHP_HTTP_API void _http_request_set_progress_callback(http_request *request, zval *cb)
+{
+ TSRMLS_FETCH_FROM_CTX(request->tsrm_ls);
+
+ if (request->_progress_callback) {
+ zval_ptr_dtor(&request->_progress_callback);
+ }
+ if ((request->_progress_callback = cb)) {
+ ZVAL_ADDREF(cb);
+ HTTP_CURL_OPT(CURLOPT_NOPROGRESS, 0);
+ HTTP_CURL_OPT(CURLOPT_PROGRESSDATA, request);
+ HTTP_CURL_OPT(CURLOPT_PROGRESSFUNCTION, http_curl_progress_callback);
+ } else {
+ HTTP_CURL_OPT(CURLOPT_NOPROGRESS, 1);
+ HTTP_CURL_OPT(CURLOPT_PROGRESSDATA, NULL);
+ HTTP_CURL_OPT(CURLOPT_PROGRESSFUNCTION, NULL);