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;
// $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;
$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'])) {
$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([
'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');
'timeout' => $timeout,
'accept_content' => $accept_content,
'cookiejar' => $cookiejar
- ],
- $redirects
+ ]
);
}