shlinkio / shlink

The definitive self-hosted URL shortener
https://shlink.io
MIT License
3.23k stars 259 forks source link

Can't create URL when it contains an Umlaut #540

Closed Starbix closed 4 years ago

Starbix commented 4 years ago

How Shlink is set-up

Summary

Shlink fails to create a URL when it comes across a URL with Umlaut. Eg. éxample.com

Current behavior

An error gets thrown: An error occurred while creating the URL :(

It happens both when a URL is entered which redirects to a URL with Umlaut and when one is entered directly.

Expected behavior

Create a shortened URL.

How to reproduce

Try to create a shlink (?) of a URL including an Umlaut like é

Log


[2019-11-14 19:37:36] Access.NOTICE: Swoole is running at 0.0.0.0:8080, in /etc/shlink {"host":"0.0.0.0","port":8080,"cwd":"/etc/shlink"} []
[2019-11-14 19:37:36] Access.NOTICE: Worker started in /etc/shlink with ID 11 {"cwd":"/etc/shlink","pid":11} []
[2019-11-14 19:37:36] Access.NOTICE: Worker started in /etc/shlink with ID 15 {"cwd":"/etc/shlink","pid":15} []
[2019-11-14 19:38:15] Shlink.WARNING - Provided Invalid URL.

GuzzleHttp\Exception\ConnectException: cURL error 6: Could not resolve host: cédric.laubacher.io (see https://curl.haxx.se/libcurl/c/libcurl-errors.html) in /etc/shlink/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php:200

Stack trace:
#0 /etc/shlink/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(155): GuzzleHttp\Handler\CurlFactory::createRejection(Object(GuzzleHttp\Handler\EasyHandle), Array)
#1 /etc/shlink/vendor/guzzlehttp/guzzle/src/Handler/CurlFactory.php(105): GuzzleHttp\Handler\CurlFactory::finishError(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#2 /etc/shlink/vendor/guzzlehttp/guzzle/src/Handler/CurlHandler.php(43): GuzzleHttp\Handler\CurlFactory::finish(Object(GuzzleHttp\Handler\CurlHandler), Object(GuzzleHttp\Handler\EasyHandle), Object(GuzzleHttp\Handler\CurlFactory))
#3 /etc/shlink/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(28): GuzzleHttp\Handler\CurlHandler->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#4 /etc/shlink/vendor/guzzlehttp/guzzle/src/Handler/Proxy.php(51): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#5 /etc/shlink/vendor/guzzlehttp/guzzle/src/PrepareBodyMiddleware.php(37): GuzzleHttp\Handler\Proxy::GuzzleHttp\Handler\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#6 /etc/shlink/vendor/guzzlehttp/guzzle/src/Middleware.php(29): GuzzleHttp\PrepareBodyMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#7 /etc/shlink/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(70): GuzzleHttp\Middleware::GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Request), Array)
#8 /etc/shlink/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(107): GuzzleHttp\RedirectMiddleware->__invoke(Object(GuzzleHttp\Psr7\Request), Array)
#9 /etc/shlink/vendor/guzzlehttp/guzzle/src/RedirectMiddleware.php(72): GuzzleHttp\RedirectMiddleware->checkRedirect(Object(GuzzleHttp\Psr7\Request), Array, Object(GuzzleHttp\Psr7\Response))
#10 /etc/shlink/vendor/guzzlehttp/promises/src/FulfilledPromise.php(39): GuzzleHttp\RedirectMiddleware->GuzzleHttp\{closure}(Object(GuzzleHttp\Psr7\Response))
#11 /etc/shlink/vendor/guzzlehttp/promises/src/TaskQueue.php(47): GuzzleHttp\Promise\FulfilledPromise::GuzzleHttp\Promise\{closure}()
#12 /etc/shlink/vendor/guzzlehttp/promises/src/Promise.php(246): GuzzleHttp\Promise\TaskQueue->run(true)
#13 /etc/shlink/vendor/guzzlehttp/promises/src/Promise.php(223): GuzzleHttp\Promise\Promise->invokeWaitFn()
#14 /etc/shlink/vendor/guzzlehttp/promises/src/Promise.php(267): GuzzleHttp\Promise\Promise->waitIfPending()
#15 /etc/shlink/vendor/guzzlehttp/promises/src/Promise.php(225): GuzzleHttp\Promise\Promise->invokeWaitList()
#16 /etc/shlink/vendor/guzzlehttp/promises/src/Promise.php(62): GuzzleHttp\Promise\Promise->waitIfPending()
#17 /etc/shlink/vendor/guzzlehttp/guzzle/src/Client.php(131): GuzzleHttp\Promise\Promise->wait()
#18 /etc/shlink/module/Core/src/Service/UrlShortener.php(117): GuzzleHttp\Client->request('GET', 'https://laubach...', Array)
#19 /etc/shlink/module/Core/src/Service/UrlShortener.php(63): Shlinkio\Shlink\Core\Service\UrlShortener->checkUrlExists('https://laubach...')
#20 /etc/shlink/module/Rest/src/Action/ShortUrl/AbstractCreateShortUrlAction.php(60): Shlinkio\Shlink\Core\Service\UrlShortener->urlToShortCode('https://laubach...', Array, Object(Shlinkio\Shlink\Core\Model\ShortUrlMeta))
#21 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/RequestHandlerMiddleware.php(53): Shlinkio\Shlink\Rest\Action\ShortUrl\AbstractCreateShortUrlAction->handle(Object(Zend\Diactoros\ServerRequest))
#22 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Stratigility\Middleware\RequestHandlerMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#23 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#24 /etc/shlink/module/Rest/src/Middleware/ShortUrl/CreateShortUrlContentNegotiationMiddleware.php(32): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#25 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\ShortUrl\CreateShortUrlContentNegotiationMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#26 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#27 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#28 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Route.php(100): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#29 /etc/shlink/vendor/zendframework/zend-expressive-router/src/RouteResult.php(110): Zend\Expressive\Router\Route->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#30 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Middleware/DispatchMiddleware.php(35): Zend\Expressive\Router\RouteResult->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#31 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\DispatchMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#32 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#33 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#34 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#35 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(129): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#36 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): class@anonymous->handle(Object(Zend\Diactoros\ServerRequest))
#37 /etc/shlink/module/Rest/src/Middleware/AuthenticationMiddleware.php(82): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#38 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\AuthenticationMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#39 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#40 /etc/shlink/module/Rest/src/Middleware/BodyParserMiddleware.php(51): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#41 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\BodyParserMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#42 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#43 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Middleware/ImplicitOptionsMiddleware.php(70): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#44 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\ImplicitOptionsMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#45 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#46 /etc/shlink/module/Rest/src/Middleware/CrossDomainMiddleware.php(21): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#47 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\CrossDomainMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#48 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#49 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#50 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(67): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(class@anonymous))
#51 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\Middleware\PathMiddlewareDecorator->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#52 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#53 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Middleware/RouteMiddleware.php(54): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#54 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\RouteMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#55 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#56 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#57 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#58 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(129): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#59 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): class@anonymous->handle(Object(Zend\Diactoros\ServerRequest))
#60 /etc/shlink/module/Rest/src/Middleware/ShortUrl/ShortCodePathMiddleware.php(31): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#61 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\ShortUrl\ShortCodePathMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#62 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#63 /etc/shlink/module/Rest/src/Middleware/PathVersionMiddleware.php(39): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#64 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\PathVersionMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#65 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#66 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#67 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(67): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(class@anonymous))
#68 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\Middleware\PathMiddlewareDecorator->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#69 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#70 /etc/shlink/vendor/shlinkio/shlink-common/src/Middleware/CloseDbConnectionMiddleware.php(28): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#71 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Common\Middleware\CloseDbConnectionMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#72 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#73 /etc/shlink/vendor/zendframework/zend-expressive-helpers/src/ContentLengthMiddleware.php(31): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#74 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Helper\ContentLengthMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#75 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#76 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/ErrorHandler.php(143): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#77 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Stratigility\Middleware\ErrorHandler->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#78 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#79 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#80 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#81 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#82 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\EmptyPipelineHandler))
#83 /etc/shlink/vendor/zendframework/zend-expressive-swoole/src/SwooleRequestHandlerRunner.php(244): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#84 {main}

Next Shlinkio\Shlink\Core\Exception\InvalidUrlException: Provided URL "https://laubacher.io" is not an existing and valid URL in /etc/shlink/module/Core/src/Exception/InvalidUrlException.php:16
Stack trace:
#0 /etc/shlink/module/Core/src/Service/UrlShortener.php(120): Shlinkio\Shlink\Core\Exception\InvalidUrlException::fromUrl('https://laubach...', Object(GuzzleHttp\Exception\ConnectException))
#1 /etc/shlink/module/Core/src/Service/UrlShortener.php(63): Shlinkio\Shlink\Core\Service\UrlShortener->checkUrlExists('https://laubach...')
#2 /etc/shlink/module/Rest/src/Action/ShortUrl/AbstractCreateShortUrlAction.php(60): Shlinkio\Shlink\Core\Service\UrlShortener->urlToShortCode('https://laubach...', Array, Object(Shlinkio\Shlink\Core\Model\ShortUrlMeta))
#3 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/RequestHandlerMiddleware.php(53): Shlinkio\Shlink\Rest\Action\ShortUrl\AbstractCreateShortUrlAction->handle(Object(Zend\Diactoros\ServerRequest))
#4 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Stratigility\Middleware\RequestHandlerMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#5 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#6 /etc/shlink/module/Rest/src/Middleware/ShortUrl/CreateShortUrlContentNegotiationMiddleware.php(32): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#7 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\ShortUrl\CreateShortUrlContentNegotiationMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#8 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#9 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#10 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Route.php(100): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#11 /etc/shlink/vendor/zendframework/zend-expressive-router/src/RouteResult.php(110): Zend\Expressive\Router\Route->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#12 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Middleware/DispatchMiddleware.php(35): Zend\Expressive\Router\RouteResult->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#13 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\DispatchMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#14 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#15 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#16 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#17 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(129): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#18 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): class@anonymous->handle(Object(Zend\Diactoros\ServerRequest))
#19 /etc/shlink/module/Rest/src/Middleware/AuthenticationMiddleware.php(82): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#20 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\AuthenticationMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#21 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#22 /etc/shlink/module/Rest/src/Middleware/BodyParserMiddleware.php(51): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#23 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\BodyParserMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#24 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#25 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Middleware/ImplicitOptionsMiddleware.php(70): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#26 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\ImplicitOptionsMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#27 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#28 /etc/shlink/module/Rest/src/Middleware/CrossDomainMiddleware.php(21): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#29 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\CrossDomainMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#30 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#31 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#32 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(67): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(class@anonymous))
#33 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\Middleware\PathMiddlewareDecorator->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#34 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#35 /etc/shlink/vendor/zendframework/zend-expressive-router/src/Middleware/RouteMiddleware.php(54): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#36 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Router\Middleware\RouteMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#37 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#38 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#39 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#40 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(129): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#41 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): class@anonymous->handle(Object(Zend\Diactoros\ServerRequest))
#42 /etc/shlink/module/Rest/src/Middleware/ShortUrl/ShortCodePathMiddleware.php(31): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#43 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\ShortUrl\ShortCodePathMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#44 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#45 /etc/shlink/module/Rest/src/Middleware/PathVersionMiddleware.php(39): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#46 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Rest\Middleware\PathVersionMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#47 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#48 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#49 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/PathMiddlewareDecorator.php(67): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(class@anonymous))
#50 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\Middleware\PathMiddlewareDecorator->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#51 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(53): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#52 /etc/shlink/vendor/shlinkio/shlink-common/src/Middleware/CloseDbConnectionMiddleware.php(28): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#53 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Shlinkio\Shlink\Common\Middleware\CloseDbConnectionMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#54 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#55 /etc/shlink/vendor/zendframework/zend-expressive-helpers/src/ContentLengthMiddleware.php(31): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#56 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Expressive\Helper\ContentLengthMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#57 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#58 /etc/shlink/vendor/zendframework/zend-stratigility/src/Middleware/ErrorHandler.php(143): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#59 /etc/shlink/vendor/zendframework/zend-expressive/src/Middleware/LazyLoadingMiddleware.php(46): Zend\Stratigility\Middleware\ErrorHandler->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#60 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Expressive\Middleware\LazyLoadingMiddleware->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#61 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#62 /etc/shlink/vendor/zendframework/zend-stratigility/src/Next.php(60): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\Next))
#63 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(83): Zend\Stratigility\Next->handle(Object(Zend\Diactoros\ServerRequest))
#64 /etc/shlink/vendor/zendframework/zend-stratigility/src/MiddlewarePipe.php(72): Zend\Stratigility\MiddlewarePipe->process(Object(Zend\Diactoros\ServerRequest), Object(Zend\Stratigility\EmptyPipelineHandler))
#65 /etc/shlink/vendor/zendframework/zend-expressive-swoole/src/SwooleRequestHandlerRunner.php(244): Zend\Stratigility\MiddlewarePipe->handle(Object(Zend\Diactoros\ServerRequest))
#66 {main}
[2019-11-14 19:38:15] Access.ERROR: 172.17.0.1 - - [14/Nov/2019:19:38:10 +0000] "POST /rest/v1/short-urls HTTP/1.0" 400 107 [] []```
acelaya commented 4 years ago

I will investigate the issue, but it seems to be related with the http client used to validate URLs.

For now, you can try to workaround it by disabling that validation.

In order to do that, pass the VALIDATE_URLS=false env var to your docker container.

acelaya commented 4 years ago

@Starbix I have just merged the fix for this issue, which makes sure IDNs are parsed before trying to validate the URL with the HTTP client.

The fix will be part of the upcoming v1.20.1

Starbix commented 4 years ago

Thanks for the fix, creating a link containing an Umlaut works great now!

However it doesn't yet handle a redirect to a URL containing Umlauts. I have the following config:

server_name laubacher.io;
...
return 301 https://cédric.laubacher.io$request_uri;

So creating a link for https://laubacher.io doesn't work yet. I'm not sure if this is even supposed to work, as it works on my browsers but not on all cURL versions I've tested.

acelaya commented 4 years ago

That's a question I have asked myself when implementing the fix.

I have decided to go with the approach of "validate the URL once parsed to ASCII, but save the original one with special chars and use it for redirects", mainly because browsers seem to properly handle it, and it's not nice for end users to see the ugly domain name which results from parsing IDN to ASCII.

However, non-browser http clients seem to fail.

Maybe there's some cURL option that will make it work with internationalized domain names.

acelaya commented 4 years ago

Oh, wait, I didn't understand your comment. Now I get what you mean.

That's a use case I didn't consider, but I think it should be possible to handle it.

acelaya commented 4 years ago

Hey @Starbix, I have just tested creating a short URL for https://laubacher.io, ind it is working fine for me :thinking:

image

If I then use the short link generated by shlink, all redirects are properly followed and I end up in https://cédric.laubacher.io.

Starbix commented 4 years ago

Oh that's probably because I temporarily changed my redirect to punycode: return 301 https://xn--cdric-bsa.laubacher.io$request_uri; I changed it back to return 301 https://cédric.laubacher.io$request_uri; now.

acelaya commented 4 years ago

Yeah, it was that :sweat_smile:

Can you leave it like that for a few minutes? It will help me sort the issue out.

acelaya commented 4 years ago

I have fixed it by manually following redirects (instead of letting the HTTP client do it transparently) and making the IDN to ASCII conversion on every step.

https://github.com/shlinkio/shlink/pull/548

Once the build passes I will merge the fix.

acelaya commented 4 years ago

The HTTP client shlink is using has also a PR to add support for this, which will simplify shlink's code a lot once they merge it.

https://github.com/guzzle/guzzle/pull/2286

acelaya commented 4 years ago

image

@Starbix The latest docker tag is being built right now. Give it about 30 minutes and then it should be there including the fix.

Starbix commented 4 years ago

Thanks for the fix!