diff --git a/src/Psr18/URLExtractor.php b/src/Psr18/URLExtractor.php index 2c42d12f..59f816af 100644 --- a/src/Psr18/URLExtractor.php +++ b/src/Psr18/URLExtractor.php @@ -12,8 +12,11 @@ use chillerlan\HTTP\Psr17\RequestFactory; use Psr\Http\Client\ClientInterface; -use Psr\Http\Message\{RequestFactoryInterface, RequestInterface, ResponseInterface}; +use Psr\Http\Message\{RequestFactoryInterface, RequestInterface, ResponseInterface, UriInterface}; +use function array_key_last; +use function array_pop; +use function count; use function in_array; /** @@ -58,6 +61,33 @@ public function sendRequest(RequestInterface $request):ResponseInterface{ return $response; } + /** + * extract the given URL and return the last valid location header + */ + public function extract(UriInterface|string $shortURL):?string{ + $request = $this->requestFactory->createRequest('GET', $shortURL); + $response = $this->sendRequest($request); + + if($response->getStatusCode() !== 200 || empty($this->responses)){ + return null; + } + + $count = count($this->responses) - 2; + + while($count >= 0){ + + $url = $this->responses[$count]?->getHeaderLine('location'); + + if(!empty($url)){ + return $url; + } + + $count--; + } + + return null; + } + /** * @return \Psr\Http\Message\ResponseInterface[] */ diff --git a/tests/Psr18/URLExtractorTest.php b/tests/Psr18/URLExtractorTest.php index bce4ed62..2240ac9f 100644 --- a/tests/Psr18/URLExtractorTest.php +++ b/tests/Psr18/URLExtractorTest.php @@ -62,4 +62,10 @@ public function testSendRequest():void{ } + public function testExtract():void{ + $url = $this->http->extract('https://t.co/ZSS6nVOcVp'); + + $this::assertSame('https://api.guildwars2.com/v2/build', $url); + } + }