use Friendica\Core\Logger;
use Friendica\Network\HTTPException\InternalServerErrorException;
+use Friendica\Util\Network;
/**
* A content class for Curl call results
* @param string $url optional URL
*
* @return CurlResult a CURL with error response
+ * @throws InternalServerErrorException
*/
public static function createErrorCurl($url = '')
{
$this->errorNumber = $errorNumber;
$this->error = $error;
- Logger::log($url . ': ' . $this->returnCode . " " . $result, LOGGER_DATA);
+ Logger::log($url . ': ' . $this->returnCode . " " . $result, Logger::DATA);
$this->parseBodyHeader($result);
$this->checkSuccess();
{
$this->isSuccess = ($this->returnCode >= 200 && $this->returnCode <= 299) || $this->errorNumber == 0;
+ // Everything higher or equal 400 is not a success
+ if ($this->returnCode >= 400) {
+ $this->isSuccess = false;
+ }
+
if (!$this->isSuccess) {
- Logger::log('error: ' . $this->url . ': ' . $this->returnCode . ' - ' . $this->error, LOGGER_INFO);
- Logger::log('debug: ' . print_r($this->info, true), LOGGER_DATA);
+ Logger::log('error: ' . $this->url . ': ' . $this->returnCode . ' - ' . $this->error, Logger::INFO);
+ Logger::log('debug: ' . print_r($this->info, true), Logger::DATA);
}
if (!$this->isSuccess && $this->errorNumber == CURLE_OPERATION_TIMEDOUT) {
}
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'];
+ $redirect_parts = parse_url(defaults($this->info, 'redirect_url', ''));
+ if (empty($redirect_parts)) {
+ $redirect_parts = [];
}
- $matches = [];
-
if (preg_match('/(Location:|URI:)(.*?)\n/i', $this->header, $matches)) {
- $this->redirectUrl = trim(array_pop($matches));
+ $redirect_parts2 = parse_url(trim(array_pop($matches)));
+ if (!empty($redirect_parts2)) {
+ $redirect_parts = array_merge($redirect_parts, $redirect_parts2);
+ }
}
- if (strpos($this->redirectUrl, '/') === 0) {
- $this->redirectUrl = $old_location_info["scheme"] . "://" . $old_location_info["host"] . $this->redirectUrl;
+
+ $parts = parse_url(defaults($this->info, 'url', ''));
+ if (empty($parts)) {
+ $parts = [];
}
- $old_location_query = @parse_url($this->url, PHP_URL_QUERY);
- if ($old_location_query != '') {
- $this->redirectUrl .= '?' . $old_location_query;
+ /// @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->isRedirectUrl = filter_var($this->redirectUrl, FILTER_VALIDATE_URL) !== false;
+ $this->redirectUrl = Network::unparseURL($redirect_parts);
+
+ $this->isRedirectUrl = true;
} else {
$this->isRedirectUrl = false;
}