diff --git a/composer.json b/composer.json index 637a66ab..6299cd08 100644 --- a/composer.json +++ b/composer.json @@ -34,7 +34,8 @@ "theorchard/monolog-cascade": "^0.4", "endroid/qrcode": "^1.7", "mikehaertl/phpwkhtmltopdf": "^2.2", - "doctrine/migrations": "^1.4" + "doctrine/migrations": "^1.4", + "http-interop/http-middleware": "^0.4" }, "require-dev": { "phpunit/phpunit": "^5.7 || ^6.0", diff --git a/config/autoload/url-shortener.global.php b/config/autoload/url-shortener.global.php index f17d192d..82c8acd6 100644 --- a/config/autoload/url-shortener.global.php +++ b/config/autoload/url-shortener.global.php @@ -10,6 +10,7 @@ return [ 'hostname' => Common\env('SHORTENED_URL_HOSTNAME'), ], 'shortcode_chars' => Common\env('SHORTCODE_CHARS', UrlShortener::DEFAULT_CHARS), + 'validate_url' => true, ], ]; diff --git a/module/CLI/src/Install/Plugin/UrlShortenerConfigCustomizerPlugin.php b/module/CLI/src/Install/Plugin/UrlShortenerConfigCustomizerPlugin.php index ac9c32e9..886749e0 100644 --- a/module/CLI/src/Install/Plugin/UrlShortenerConfigCustomizerPlugin.php +++ b/module/CLI/src/Install/Plugin/UrlShortenerConfigCustomizerPlugin.php @@ -42,7 +42,14 @@ class UrlShortenerConfigCustomizerPlugin extends AbstractConfigCustomizerPlugin 'Character set for generated short codes (leave empty to autogenerate one)', null, true - ) ?: str_shuffle(UrlShortener::DEFAULT_CHARS) + ) ?: str_shuffle(UrlShortener::DEFAULT_CHARS), + 'VALIDATE_URL' => $this->questionHelper->ask( + $input, + $output, + new ConfirmationQuestion( + 'Do you want to validate long urls by 200 HTTP status code on response (Y/n):' + ) + ) ]); } } diff --git a/module/CLI/src/Model/CustomizableAppConfig.php b/module/CLI/src/Model/CustomizableAppConfig.php index 03836e0f..34f3674c 100644 --- a/module/CLI/src/Model/CustomizableAppConfig.php +++ b/module/CLI/src/Model/CustomizableAppConfig.php @@ -189,6 +189,7 @@ final class CustomizableAppConfig implements ArraySerializableInterface 'SCHEMA' => $urlShortener['domain']['schema'], 'HOSTNAME' => $urlShortener['domain']['hostname'], 'CHARS' => $urlShortener['shortcode_chars'], + 'VALIDATE_URL' => $urlShortener['validate_url'], ]); } } @@ -240,6 +241,7 @@ final class CustomizableAppConfig implements ArraySerializableInterface 'hostname' => $this->urlShortener['HOSTNAME'], ], 'shortcode_chars' => $this->urlShortener['CHARS'], + 'validate_url' => $this->urlShortener['VALIDATE_URL'] ], ]; diff --git a/module/CLI/test/Install/Plugin/UrlShortenerConfigCustomizerPluginTest.php b/module/CLI/test/Install/Plugin/UrlShortenerConfigCustomizerPluginTest.php index 85eaf681..7d535397 100644 --- a/module/CLI/test/Install/Plugin/UrlShortenerConfigCustomizerPluginTest.php +++ b/module/CLI/test/Install/Plugin/UrlShortenerConfigCustomizerPluginTest.php @@ -45,8 +45,9 @@ class UrlShortenerConfigCustomizerPluginTest extends TestCase 'SCHEMA' => 'something', 'HOSTNAME' => 'something', 'CHARS' => 'something', + 'VALIDATE_URL' => 'something', ], $config->getUrlShortener()); - $askSecret->shouldHaveBeenCalledTimes(3); + $askSecret->shouldHaveBeenCalledTimes(4); } /** @@ -64,6 +65,7 @@ class UrlShortenerConfigCustomizerPluginTest extends TestCase 'SCHEMA' => 'bar', 'HOSTNAME' => 'bar', 'CHARS' => 'bar', + 'VALIDATE_URL' => 'bar', ]); $this->plugin->process(new ArrayInput([]), new NullOutput(), $config); @@ -72,8 +74,9 @@ class UrlShortenerConfigCustomizerPluginTest extends TestCase 'SCHEMA' => 'foo', 'HOSTNAME' => 'foo', 'CHARS' => 'foo', + 'VALIDATE_URL' => false, ], $config->getUrlShortener()); - $ask->shouldHaveBeenCalledTimes(4); + $ask->shouldHaveBeenCalledTimes(5); } /** @@ -89,6 +92,7 @@ class UrlShortenerConfigCustomizerPluginTest extends TestCase 'SCHEMA' => 'foo', 'HOSTNAME' => 'foo', 'CHARS' => 'foo', + 'VALIDATE_URL' => 'foo', ]); $this->plugin->process(new ArrayInput([]), new NullOutput(), $config); @@ -97,6 +101,7 @@ class UrlShortenerConfigCustomizerPluginTest extends TestCase 'SCHEMA' => 'foo', 'HOSTNAME' => 'foo', 'CHARS' => 'foo', + 'VALIDATE_URL' => 'foo', ], $config->getUrlShortener()); $ask->shouldHaveBeenCalledTimes(1); } diff --git a/module/Common/test/Factory/CacheFactoryTest.php b/module/Common/test/Factory/CacheFactoryTest.php index 9a095ad6..58542426 100644 --- a/module/Common/test/Factory/CacheFactoryTest.php +++ b/module/Common/test/Factory/CacheFactoryTest.php @@ -73,7 +73,7 @@ class CacheFactoryTest extends TestCase */ public function filesystemCacheAdaptersReadDirOption() { - $dir = sys_get_temp_dir(); + $dir = realpath(sys_get_temp_dir()); /** @var FilesystemCache $instance */ $instance = $this->factory->__invoke($this->createSM(FilesystemCache::class, ['dir' => $dir]), ''); $this->assertInstanceOf(FilesystemCache::class, $instance); diff --git a/module/Core/src/Service/UrlShortener.php b/module/Core/src/Service/UrlShortener.php index 9d6927bf..b6008276 100644 --- a/module/Core/src/Service/UrlShortener.php +++ b/module/Core/src/Service/UrlShortener.php @@ -36,26 +36,39 @@ class UrlShortener implements UrlShortenerInterface * @var Cache */ private $cache; + /** + * @var bool + */ + private $urlValidationEnabled; /** * UrlShortener constructor. * @param ClientInterface $httpClient * @param EntityManagerInterface $em * @param Cache $cache + * @param bool $urlValidationEnabled * @param string $chars * - * @Inject({"httpClient", "em", Cache::class, "config.url_shortener.shortcode_chars"}) + * @Inject({ + * "httpClient", + * "em", + * Cache::class, + * "config.url_shortener.validate_url", + * "config.url_shortener.shortcode_chars" + * }) */ public function __construct( ClientInterface $httpClient, EntityManagerInterface $em, Cache $cache, + $urlValidationEnabled, $chars = self::DEFAULT_CHARS ) { $this->httpClient = $httpClient; $this->em = $em; $this->chars = empty($chars) ? self::DEFAULT_CHARS : $chars; $this->cache = $cache; + $this->urlValidationEnabled = $urlValidationEnabled; } /** @@ -77,8 +90,11 @@ class UrlShortener implements UrlShortenerInterface return $shortUrl->getShortCode(); } - // Check that the URL exists - $this->checkUrlExists($url); + // Check if the validation of url is enabled in the config + if (true === $this->urlValidationEnabled) { + // Check that the URL exists + $this->checkUrlExists($url); + } // Transactionally insert the short url, then generate the short code and finally update the short code try { diff --git a/module/Core/test/Service/UrlShortenerTest.php b/module/Core/test/Service/UrlShortenerTest.php index 5d39deb4..494a45f6 100644 --- a/module/Core/test/Service/UrlShortenerTest.php +++ b/module/Core/test/Service/UrlShortenerTest.php @@ -58,7 +58,21 @@ class UrlShortenerTest extends TestCase $this->cache = new ArrayCache(); - $this->urlShortener = new UrlShortener($this->httpClient->reveal(), $this->em->reveal(), $this->cache); + $this->setUrlShortener(false); + } + + /** + * @param bool $urlValidationEnabled + */ + public function setUrlShortener($urlValidationEnabled) + { + $this->urlShortener = new UrlShortener( + $this->httpClient->reveal(), + $this->em->reveal(), + $this->cache, + $urlValidationEnabled, + UrlShortener::DEFAULT_CHARS + ); } /** @@ -93,6 +107,8 @@ class UrlShortenerTest extends TestCase */ public function exceptionIsThrownWhenUrlDoesNotExist() { + $this->setUrlShortener(true); + $this->httpClient->request(Argument::cetera())->willThrow( new ClientException('', $this->prophesize(Request::class)->reveal()) );