]> git.mxchange.org Git - friendica.git/blobdiff - src/Network/HTTPRequest.php
Revert "Use last entry for Content-Type"
[friendica.git] / src / Network / HTTPRequest.php
index 798b0cdea8ab4472f1f6359b71e088ad2fad451a..c37db4c9a06a7aa5abe6a14e98076853c63f4001 100644 (file)
@@ -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 GuzzleResponse(null, $url, $exception->getCode(), $exception->getMessage());
+                               return new CurlResult($url, '', ['http_code' => $exception->getCode()], $exception->getCode(), '');
                        }
                } finally {
                        $this->profiler->saveTimestamp($stamp1, 'network');