summaryrefslogtreecommitdiff
path: root/it_url.class
diff options
context:
space:
mode:
Diffstat (limited to 'it_url.class')
-rw-r--r--it_url.class27
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();