X-Git-Url: https://git.mxchange.org/?a=blobdiff_plain;f=src%2FNetwork%2FHTTPRequest.php;h=c37db4c9a06a7aa5abe6a14e98076853c63f4001;hb=16f5965fd444a4f5d28906623a5ceba5e41cc138;hp=e0400b6b9426a1edf5f0c99f9f44682f8d415f87;hpb=1a42f35a3cd857e53504e811569be306072139a2;p=friendica.git diff --git a/src/Network/HTTPRequest.php b/src/Network/HTTPRequest.php index e0400b6b94..c37db4c9a0 100644 --- a/src/Network/HTTPRequest.php +++ b/src/Network/HTTPRequest.php @@ -30,6 +30,7 @@ use Friendica\Util\Network; use Friendica\Util\Profiler; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; +use GuzzleHttp\Exception\TransferException; use Psr\Http\Message\RequestInterface; use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\UriInterface; @@ -101,11 +102,17 @@ class HTTPRequest implements IHTTPRequest // $curlOptions[CURLOPT_MAXREDIRS] = 5; if (!empty($opts['accept_content'])) { - $curlOptions[CURLOPT_HTTPHEADER][] = ['Accept: ' . $opts['accept_content']]; + if (empty($curlOptions[CURLOPT_HTTPHEADER])) { + $curlOptions[CURLOPT_HTTPHEADER] = []; + } + array_push($curlOptions[CURLOPT_HTTPHEADER], 'Accept: ' . $opts['accept_content']); } if (!empty($opts['header'])) { - $curlOptions[CURLOPT_HTTPHEADER][] = $opts['header']; + if (empty($curlOptions[CURLOPT_HTTPHEADER])) { + $curlOptions[CURLOPT_HTTPHEADER] = []; + } + $curlOptions[CURLOPT_HTTPHEADER] = array_merge($opts['header'], $curlOptions[CURLOPT_HTTPHEADER]); } $curlOptions[CURLOPT_RETURNTRANSFER] = true; @@ -123,7 +130,10 @@ class HTTPRequest implements IHTTPRequest $curlOptions[CURLOPT_ENCODING] = ''; if (!empty($opts['headers'])) { - $curlOptions[CURLOPT_HTTPHEADER][] = $opts['headers']; + if (empty($curlOptions[CURLOPT_HTTPHEADER])) { + $curlOptions[CURLOPT_HTTPHEADER] = []; + } + $curlOptions[CURLOPT_HTTPHEADER] = array_merge($opts['headers'], $curlOptions[CURLOPT_HTTPHEADER]); } if (!empty($opts['nobody'])) { @@ -169,12 +179,21 @@ class HTTPRequest implements IHTTPRequest $curlOptions[CURLOPT_BINARYTRANSFER] = 1; } + $logger = $this->logger; + $onRedirect = function( RequestInterface $request, ResponseInterface $response, UriInterface $uri - ) { - $this->logger->notice('Curl redirect.', ['url' => $request->getUri(), 'to' => $uri]); + ) use ($logger) { + $logger->notice('Curl redirect.', ['url' => $request->getUri(), 'to' => $uri]); + }; + + $onHeaders = function (ResponseInterface $response) use ($opts) { + if (!empty($opts['content_length']) && + $response->getHeaderLine('Content-Length') > $opts['content_length']) { + throw new TransferException('The file is too big!'); + } }; $client = new Client([ @@ -185,17 +204,20 @@ class HTTPRequest implements IHTTPRequest 'strict' => true, 'referer' => true, ], + 'on_headers' => $onHeaders, + 'sink' => tempnam(get_temppath(), 'guzzle'), 'curl' => $curlOptions ]); try { $response = $client->get($url); return new GuzzleResponse($response, $url); - } catch (RequestException $exception) { - if ($exception->hasResponse()) { - return new GuzzleResponse($exception->getResponse(), $url, $exception->getCode(), $exception->getMessage()); + } catch (TransferException $exception) { + if ($exception instanceof RequestException && + $exception->hasResponse()) { + return new GuzzleResponse($exception->getResponse(), $url, $exception->getCode(), ''); } else { - return new CurlResult($url, '', ['http_code' => $exception->getCode()], $exception->getCode(), $exception->getMessage()); + return new CurlResult($url, '', ['http_code' => $exception->getCode()], $exception->getCode(), ''); } } finally { $this->profiler->saveTimestamp($stamp1, 'network');