diff options
Diffstat (limited to 'it_url.class')
-rw-r--r-- | it_url.class | 27 |
1 files changed, 8 insertions, 19 deletions
diff --git a/it_url.class b/it_url.class index e7c50c5..53bf949 100644 --- a/it_url.class +++ b/it_url.class @@ -127,16 +127,7 @@ function get($p=null, $timeout=5) else # called statically $url = new it_url($p['url']); - $result = $url->request($p); - - # Handle redirects (supports relative and global) but not for HTTP 201 Created because that can send the Location of the new resource - if ($url->headers['Location'] && $url->result != 201 && preg_match('#^(https?://[^/]*)?(/)?(.*)$#i', $url->headers['Location'], $parts) && ($parts[1] != $url->url)) - { - unset($p['url'], $p['headers']['Host']); - $url->it_url($parts[1] ? $parts[1].$parts[2].$parts[3] : $url->protocol.'://'.$url->realhostname.($parts[2] ? $parts[2].$parts[3] : '/'.dirname($url->path).'/'.$parts[3])); - if (++$url->redir <= 4) /* Avoid infinite redirects */ - return $url->get($p); - } + $result = $url->request($p + ['followlocation' => true]); if (!$result && $p['retries'] > 0 && $url->result < 400) { @@ -179,7 +170,7 @@ static function _default_headers($url, $p) static function curl_opts($p=array()) { - $p += array('totaltimeout' => "999999", 'timeout' => 5); + $p += array('totaltimeout' => "999999", 'timeout' => 5, 'followlocation' => true); $add = []; foreach ($p['headers'] as $header => $value) @@ -213,7 +204,7 @@ static function curl_opts($p=array()) CURLOPT_TIMEOUT => $p['totaltimeout'], CURLOPT_LOW_SPEED_LIMIT => 5, CURLOPT_LOW_SPEED_TIME => $p['timeout'], - CURLOPT_FOLLOWLOCATION => false, + CURLOPT_FOLLOWLOCATION => $p['followlocation'], CURLOPT_HTTPHEADER => $headers, CURLOPT_CUSTOMREQUEST => $p['method'] ?: null, CURLOPT_NOBODY => $p['method'] == 'HEAD', @@ -243,8 +234,7 @@ function request($p=array()) $url->headers = array(); $p['headers'] = (array)$p['headers'] + self::_default_headers($url, $p); - $opts = array(CURLOPT_FOLLOWLOCATION => false, CURLOPT_HEADER => 1) + self::curl_opts($p + array('user' => $this->user, 'pass' => $this->pass)); - + $opts = array(CURLOPT_HEADER => 1) + self::curl_opts($p + array('user' => $this->user, 'pass' => $this->pass, 'followlocation' => false)); $curl = curl_init($url->url); curl_setopt_array($curl, $opts); @@ -253,10 +243,9 @@ function request($p=array()) EDC('curlinfo', curl_getinfo($curl)); if ($got) { - list($url->header, $url->data) = explode("\r\n\r\n", $got, 2); - while (preg_match('#^(HTTP\S+)\s100\sContinue$#', $url->header)) - list($url->header, $url->data) = explode("\r\n\r\n", $url->data, 2); - $url->header .= "\r\n\r\n"; + $headersize = curl_getinfo($curl, CURLINFO_HEADER_SIZE); + $url->header = array_slice(explode("\r\n\r\n", trim(substr($got, 0, $headersize))), -1)[0] . "\r\n\r\n"; + $url->data = substr($got, $headersize); $url->parse_http_header($url->header); @@ -298,7 +287,7 @@ function get_multi($p=null) $url = new it_url; $p['headers'] = (array)$p['headers'] + array_diff_key(self::_default_headers($url, $p), ['Host' => null]); - $opts = array(CURLOPT_FOLLOWLOCATION => true) + self::curl_opts($p); + $opts = self::curl_opts($p); $mh = curl_multi_init(); |