More work on parsing endpoints in the body
This commit is contained in:
		
							parent
							
								
									4eba80387d
								
							
						
					
					
						commit
						e5f7595321
					
				@ -3,6 +3,7 @@
 | 
			
		||||
namespace Lewisdale\Webmentions;
 | 
			
		||||
 | 
			
		||||
use Symfony\Contracts\HttpClient\ResponseInterface;
 | 
			
		||||
use Symfony\Component\DomCrawler\Crawler;
 | 
			
		||||
 | 
			
		||||
class EndpointParser {
 | 
			
		||||
    public static function parse(ResponseInterface $response) : string | null
 | 
			
		||||
@ -22,6 +23,11 @@ class EndpointParser {
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if (!$endpoint) {
 | 
			
		||||
            $doc = new Crawler($response->getContent());
 | 
			
		||||
            $webmention = $doc->filter('rel="webmention"')->first();
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        if ($endpoint && !str_contains($endpoint, "https://")) {
 | 
			
		||||
            $res = parse_url($response->getInfo('url'));
 | 
			
		||||
            $endpoint = $res["scheme"] . "://" . $res["host"] . $endpoint;
 | 
			
		||||
 | 
			
		||||
@ -35,4 +35,39 @@ class EndpointParserTest extends TestCase {
 | 
			
		||||
        $this->assertSame("https://webmention.rocks/test/5/webmention", EndpointParser::parse($response));   
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testParsesAbsoluteEndpointFromHeader() {
 | 
			
		||||
        $response = $this->createStub(ResponseInterface::class);
 | 
			
		||||
 | 
			
		||||
        $response->method('getHeaders')
 | 
			
		||||
            ->willReturn([
 | 
			
		||||
                "link" => ['<https://webmention.rocks/test/2/webmention>; rel="webmention"'],
 | 
			
		||||
            ]);
 | 
			
		||||
 | 
			
		||||
        
 | 
			
		||||
        $response->method('getInfo')
 | 
			
		||||
            ->willReturn('https://webmention.rocks/test/2');
 | 
			
		||||
 | 
			
		||||
        $this->assertSame("https://webmention.rocks/test/2/webmention", EndpointParser::parse($response));
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    public function testParsesRelativeEndpointFromLink() {
 | 
			
		||||
        $content = <<<XML
 | 
			
		||||
        <html>
 | 
			
		||||
            <head>
 | 
			
		||||
                <link rel="webmention" href="/test/4/webmention" />
 | 
			
		||||
            </head>
 | 
			
		||||
            <body>
 | 
			
		||||
                <h1>Some content</h1>
 | 
			
		||||
        </html>
 | 
			
		||||
        XML;
 | 
			
		||||
 | 
			
		||||
        $response = $this->createStub(ResponseInterface::class);
 | 
			
		||||
        $response->method('getHeaders')->willReturn([]);
 | 
			
		||||
        $response->method('getContent')->willReturn($content);
 | 
			
		||||
        $response->method('getInfo')
 | 
			
		||||
            ->willReturn('https://webmention.rocks/test/4');
 | 
			
		||||
 | 
			
		||||
        $this->assertSame("https://webmention.rocks/test/4/webmention", EndpointParser::parse($response));
 | 
			
		||||
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user