1+ <?php
2+
3+ namespace App ;
4+
5+ use Embed \Http \CurlClient ;
6+ use Embed \Http \FactoryDiscovery ;
7+ use Psr \Http \Client \ClientInterface ;
8+ use Psr \Http \Message \RequestFactoryInterface ;
9+ use Psr \Http \Message \RequestInterface ;
10+ use Psr \Http \Message \ResponseInterface ;
11+ use Psr \Http \Message \UriFactoryInterface ;
12+ use Psr \Http \Message \UriInterface ;
13+
14+ class Crawler extends \Embed \Http \Crawler implements ClientInterface, RequestFactoryInterface, UriFactoryInterface
15+ {
16+ protected RequestFactoryInterface $ requestFactory ;
17+ protected UriFactoryInterface $ uriFactory ;
18+ protected ClientInterface $ client ;
19+ protected array $ defaultHeaders = [
20+ 'User-Agent ' => 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:73.0) Gecko/20100101 Firefox/73.0 ' ,
21+ 'Cache-Control ' => 'max-age=0 ' ,
22+ ];
23+
24+ public function __construct (?ClientInterface $ client = null , ?RequestFactoryInterface $ requestFactory = null , ?UriFactoryInterface $ uriFactory = null )
25+ {
26+ $ this ->client = $ client ?: new CurlClient ();
27+ $ this ->requestFactory = $ requestFactory ?: FactoryDiscovery::getRequestFactory ();
28+ $ this ->uriFactory = $ uriFactory ?: FactoryDiscovery::getUriFactory ();
29+ }
30+
31+ public function addDefaultHeaders (array $ headers ): void
32+ {
33+ $ this ->defaultHeaders = $ headers + $ this ->defaultHeaders ;
34+ }
35+
36+ /**
37+ * @param UriInterface|string $uri The URI associated with the request.
38+ */
39+ public function createRequest (string $ method , $ uri ): RequestInterface
40+ {
41+ $ request = $ this ->requestFactory ->createRequest ($ method , $ uri );
42+
43+ foreach ($ this ->defaultHeaders as $ name => $ value ) {
44+ $ request = $ request ->withHeader ($ name , $ value );
45+ }
46+
47+ return $ request ;
48+ }
49+
50+ public function createUri (string $ uri = '' ): UriInterface
51+ {
52+ return $ this ->uriFactory ->createUri ($ uri );
53+ }
54+
55+ public function sendRequest (RequestInterface $ request ): ResponseInterface
56+ {
57+ return $ this ->client ->sendRequest ($ request );
58+ }
59+
60+ public function sendRequests (RequestInterface ...$ requests ): array
61+ {
62+ if ($ this ->client instanceof CurlClient) {
63+ $ response = $ this ->client ->sendRequests (...$ requests );
64+
65+ logger (print_r ($ response , true ));
66+
67+ return $ response ;
68+ }
69+
70+ return array_map (
71+ fn ($ request ) => $ this ->client ->sendRequest ($ request ),
72+ $ requests
73+ );
74+ }
75+
76+ public function getResponseUri (ResponseInterface $ response ): ?UriInterface
77+ {
78+ $ location = $ response ->getHeaderLine ('Content-Location ' );
79+
80+ return $ location ? $ this ->uriFactory ->createUri ($ location ) : null ;
81+ }
82+ }
0 commit comments