From 8ad34357d3f4cecf89d2afd130c26ceaf94010d9 Mon Sep 17 00:00:00 2001 From: Alejandro Celaya Date: Thu, 18 Feb 2021 21:27:46 +0100 Subject: [PATCH] Added User-Agent to UrlValidator, so that remote servers don't consider Shlink a bot --- module/Core/src/Util/UrlValidator.php | 4 ++++ module/Core/test/Util/UrlValidatorTest.php | 15 +++++++++++---- 2 files changed, 15 insertions(+), 4 deletions(-) diff --git a/module/Core/src/Util/UrlValidator.php b/module/Core/src/Util/UrlValidator.php index 62c2bea5..23de39ef 100644 --- a/module/Core/src/Util/UrlValidator.php +++ b/module/Core/src/Util/UrlValidator.php @@ -20,6 +20,8 @@ use const Shlinkio\Shlink\Core\TITLE_TAG_VALUE; class UrlValidator implements UrlValidatorInterface, RequestMethodInterface { private const MAX_REDIRECTS = 15; + private const CHROME_USER_AGENT = 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) ' + . 'Chrome/51.0.2704.103 Safari/537.36'; private ClientInterface $httpClient; private UrlShortenerOptions $options; @@ -67,6 +69,8 @@ class UrlValidator implements UrlValidatorInterface, RequestMethodInterface return $this->httpClient->request(self::METHOD_GET, $url, [ RequestOptions::ALLOW_REDIRECTS => ['max' => self::MAX_REDIRECTS], RequestOptions::IDN_CONVERSION => true, + // Making the request with a browser's user agent makes the validation closer to a real user + RequestOptions::HEADERS => ['User-Agent' => self::CHROME_USER_AGENT], ]); } catch (GuzzleException $e) { if ($throwOnError) { diff --git a/module/Core/test/Util/UrlValidatorTest.php b/module/Core/test/Util/UrlValidatorTest.php index 9ef8e94e..25710172 100644 --- a/module/Core/test/Util/UrlValidatorTest.php +++ b/module/Core/test/Util/UrlValidatorTest.php @@ -10,6 +10,7 @@ use GuzzleHttp\Exception\ClientException; use GuzzleHttp\RequestOptions; use Laminas\Diactoros\Response; use Laminas\Diactoros\Stream; +use PHPUnit\Framework\Assert; use PHPUnit\Framework\TestCase; use Prophecy\Argument; use Prophecy\PhpUnit\ProphecyTrait; @@ -52,10 +53,16 @@ class UrlValidatorTest extends TestCase $request = $this->httpClient->request( RequestMethodInterface::METHOD_GET, $expectedUrl, - [ - RequestOptions::ALLOW_REDIRECTS => ['max' => 15], - RequestOptions::IDN_CONVERSION => true, - ], + Argument::that(function (array $options) { + Assert::assertArrayHasKey(RequestOptions::ALLOW_REDIRECTS, $options); + Assert::assertEquals(['max' => 15], $options[RequestOptions::ALLOW_REDIRECTS]); + Assert::assertArrayHasKey(RequestOptions::IDN_CONVERSION, $options); + Assert::assertTrue($options[RequestOptions::IDN_CONVERSION]); + Assert::assertArrayHasKey(RequestOptions::HEADERS, $options); + Assert::assertArrayHasKey('User-Agent', $options[RequestOptions::HEADERS]); + + return true; + }), )->willReturn(new Response()); $this->urlValidator->validateUrl($expectedUrl, null);