- zval *zoption;
- zend_bool range_req = 0;
- php_http_request_storage_t *storage;
-
- TSRMLS_FETCH_FROM_CTX(request->ts);
-
- PHP_HTTP_CHECK_CURL_INIT(request->ch, php_http_curl_init(NULL, request TSRMLS_CC), return FAILURE);
-
- if (!(storage = php_http_request_storage_get(request->ch))) {
- return FAILURE;
- }
- storage->errorbuffer[0] = '\0';
- /* set options */
- if (storage->url) {
- pefree(storage->url, 1);
- }
- storage->url = pestrdup(request->url, 1);
- PHP_HTTP_CURL_OPT(CURLOPT_URL, storage->url);
-
- /* progress callback */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("onprogress"), -1))) {
- php_http_request_set_progress_callback(request, zoption);
- }
-
- /* proxy */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("proxyhost"), IS_STRING))) {
- PHP_HTTP_CURL_OPT(CURLOPT_PROXY, Z_STRVAL_P(zoption));
- /* type */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("proxytype"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_PROXYTYPE, Z_LVAL_P(zoption));
- }
- /* port */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("proxyport"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_PROXYPORT, Z_LVAL_P(zoption));
- }
- /* user:pass */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("proxyauth"), IS_STRING)) && Z_STRLEN_P(zoption)) {
- PHP_HTTP_CURL_OPT(CURLOPT_PROXYUSERPWD, Z_STRVAL_P(zoption));
- }
- /* auth method */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("proxyauthtype"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_PROXYAUTH, Z_LVAL_P(zoption));
- }
- /* tunnel */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("proxytunnel"), IS_BOOL)) && Z_BVAL_P(zoption)) {
- PHP_HTTP_CURL_OPT(CURLOPT_HTTPPROXYTUNNEL, 1L);
- }
- }
-#if PHP_HTTP_CURL_VERSION(7,19,4)
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("noproxy"), IS_STRING))) {
- PHP_HTTP_CURL_OPT(CURLOPT_NOPROXY, Z_STRVAL_P(zoption));
- }
-#endif
-
- /* dns */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("dns_cache_timeout"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_DNS_CACHE_TIMEOUT, Z_LVAL_P(zoption));
- }
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("ipresolve"), IS_LONG)) && Z_LVAL_P(zoption)) {
- PHP_HTTP_CURL_OPT(CURLOPT_IPRESOLVE, Z_LVAL_P(zoption));
- }
-
- /* limits */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("low_speed_limit"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_LOW_SPEED_LIMIT, Z_LVAL_P(zoption));
- }
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("low_speed_time"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_LOW_SPEED_TIME, Z_LVAL_P(zoption));
- }
- /* LSF weirdance
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("max_send_speed"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_MAX_SEND_SPEED_LARGE, (curl_off_t) Z_LVAL_P(zoption));
- }
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("max_recv_speed"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_MAX_RECV_SPEED_LARGE, (curl_off_t) Z_LVAL_P(zoption));
- }
- */
- /* crashes
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("maxconnects"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_MAXCONNECTS, Z_LVAL_P(zoption));
- } */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("fresh_connect"), IS_BOOL)) && Z_BVAL_P(zoption)) {
- PHP_HTTP_CURL_OPT(CURLOPT_FRESH_CONNECT, 1L);
- }
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("forbid_reuse"), IS_BOOL)) && Z_BVAL_P(zoption)) {
- PHP_HTTP_CURL_OPT(CURLOPT_FORBID_REUSE, 1L);
- }
-
- /* outgoing interface */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("interface"), IS_STRING))) {
- PHP_HTTP_CURL_OPT(CURLOPT_INTERFACE, Z_STRVAL_P(zoption));
-
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("portrange"), IS_ARRAY))) {
- zval **prs, **pre;
-
- zend_hash_internal_pointer_reset(Z_ARRVAL_P(zoption));
- if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(zoption), (void *) &prs)) {
- zend_hash_move_forward(Z_ARRVAL_P(zoption));
- if (SUCCESS == zend_hash_get_current_data(Z_ARRVAL_P(zoption), (void *) &pre)) {
- zval *prs_cpy = php_http_zsep(IS_LONG, *prs);
- zval *pre_cpy = php_http_zsep(IS_LONG, *pre);
-
- if (Z_LVAL_P(prs_cpy) && Z_LVAL_P(pre_cpy)) {
- PHP_HTTP_CURL_OPT(CURLOPT_LOCALPORT, MIN(Z_LVAL_P(prs_cpy), Z_LVAL_P(pre_cpy)));
- PHP_HTTP_CURL_OPT(CURLOPT_LOCALPORTRANGE, labs(Z_LVAL_P(prs_cpy)-Z_LVAL_P(pre_cpy))+1L);
- }
- zval_ptr_dtor(&prs_cpy);
- zval_ptr_dtor(&pre_cpy);
- }
- }
- }
- }
-
- /* another port */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("port"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_PORT, Z_LVAL_P(zoption));
- }
-
- /* RFC4007 zone_id */
-#if PHP_HTTP_CURL_VERSION(7,19,0)
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("address_scope"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_ADDRESS_SCOPE, Z_LVAL_P(zoption));
- }
-#endif
-
- /* auth */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("httpauth"), IS_STRING)) && Z_STRLEN_P(zoption)) {
- PHP_HTTP_CURL_OPT(CURLOPT_USERPWD, Z_STRVAL_P(zoption));
- }
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("httpauthtype"), IS_LONG))) {
- PHP_HTTP_CURL_OPT(CURLOPT_HTTPAUTH, Z_LVAL_P(zoption));
- }
-
- /* 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));
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("unrestrictedauth"), IS_BOOL))) {
- PHP_HTTP_CURL_OPT(CURLOPT_UNRESTRICTED_AUTH, Z_LVAL_P(zoption));
- }
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("postredir"), IS_BOOL))) {
-#if PHP_HTTP_CURL_VERSION(7,19,1)
- PHP_HTTP_CURL_OPT(CURLOPT_POSTREDIR, Z_BVAL_P(zoption) ? 1L : 0L);
-#else
- PHP_HTTP_CURL_OPT(CURLOPT_POST301, Z_BVAL_P(zoption) ? 1L : 0L);
-#endif
- }
- }
-
- /* retries, defaults to 0 */
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("retrycount"), IS_LONG))) {
- request->_retry.count = Z_LVAL_P(zoption);
- if ((zoption = php_http_request_option(request, options, ZEND_STRS("retrydelay"), IS_DOUBLE))) {
- request->_retry.delay = Z_DVAL_P(zoption);
- } else {
- request->_retry.delay = 0;
- }