From 586c7fb29a0f7ab0cbc87cc427ff94c8dc7925a4 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 24 Nov 2018 00:27:00 +0000 Subject: [PATCH 1/2] Fixing redirection problems with parameters --- src/Network/CurlResult.php | 31 +++++++++++++------------------ 1 file changed, 13 insertions(+), 18 deletions(-) diff --git a/src/Network/CurlResult.php b/src/Network/CurlResult.php index dd98853ae..b92c0bc45 100644 --- a/src/Network/CurlResult.php +++ b/src/Network/CurlResult.php @@ -4,6 +4,7 @@ namespace Friendica\Network; use Friendica\Core\Logger; use Friendica\Network\HTTPException\InternalServerErrorException; +use Friendica\Util\Network; /** * A content class for Curl call results @@ -159,29 +160,23 @@ class CurlResult } if ($this->returnCode == 301 || $this->returnCode == 302 || $this->returnCode == 303 || $this->returnCode== 307) { - $new_location_info = (!array_key_exists('redirect_url', $this->info) ? '' : @parse_url($this->info['redirect_url'])); - $old_location_info = (!array_key_exists('url', $this->info) ? '' : @parse_url($this->info['url'])); - - $this->redirectUrl = $new_location_info; - - if (empty($new_location_info['path']) && !empty($new_location_info['host'])) { - $this->redirectUrl = $new_location_info['scheme'] . '://' . $new_location_info['host'] . $old_location_info['path']; - } - - $matches = []; - + $redirect_parts = parse_url($this->info['redirect_url']); if (preg_match('/(Location:|URI:)(.*?)\n/i', $this->header, $matches)) { - $this->redirectUrl = trim(array_pop($matches)); + $redirect_parts = array_merge($redirect_parts, parse_url(trim(array_pop($matches)))); } - if (strpos($this->redirectUrl, '/') === 0) { - $this->redirectUrl = $old_location_info["scheme"] . "://" . $old_location_info["host"] . $this->redirectUrl; - } - $old_location_query = @parse_url($this->url, PHP_URL_QUERY); - if ($old_location_query != '') { - $this->redirectUrl .= '?' . $old_location_query; + $parts = parse_url($this->info['url']); + + if (empty($redirect_parts['scheme']) && !empty($parts['scheme'])) { + $redirect_parts['scheme'] = $parts['scheme']; } + if (empty($redirect_parts['host']) && !empty($parts['host'])) { + $redirect_parts['host'] = $parts['host']; + } + + $this->redirectUrl = Network::unparseURL($redirect_parts); + $this->isRedirectUrl = filter_var($this->redirectUrl, FILTER_VALIDATE_URL) !== false; } else { $this->isRedirectUrl = false; From 167ff0eb7124212d6d3ef9fc7902cf482a268c01 Mon Sep 17 00:00:00 2001 From: Michael Date: Sat, 24 Nov 2018 09:01:10 +0000 Subject: [PATCH 2/2] Making the tests happy --- src/Network/CurlResult.php | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/src/Network/CurlResult.php b/src/Network/CurlResult.php index b92c0bc45..b2587799d 100644 --- a/src/Network/CurlResult.php +++ b/src/Network/CurlResult.php @@ -160,19 +160,19 @@ class CurlResult } if ($this->returnCode == 301 || $this->returnCode == 302 || $this->returnCode == 303 || $this->returnCode== 307) { - $redirect_parts = parse_url($this->info['redirect_url']); + $redirect_parts = parse_url(defaults($this->info, 'redirect_url', '')); if (preg_match('/(Location:|URI:)(.*?)\n/i', $this->header, $matches)) { $redirect_parts = array_merge($redirect_parts, parse_url(trim(array_pop($matches)))); } - $parts = parse_url($this->info['url']); + $parts = parse_url(defaults($this->info, 'url', '')); - if (empty($redirect_parts['scheme']) && !empty($parts['scheme'])) { - $redirect_parts['scheme'] = $parts['scheme']; - } - - if (empty($redirect_parts['host']) && !empty($parts['host'])) { - $redirect_parts['host'] = $parts['host']; + /// @todo Checking the corresponding RFC which parts of a redirect can be ommitted. + $components = ['scheme', 'host', 'path', 'query', 'fragment']; + foreach ($components as $component) { + if (empty($redirect_parts[$component]) && !empty($parts[$component])) { + $redirect_parts[$component] = $parts[$component]; + } } $this->redirectUrl = Network::unparseURL($redirect_parts);