Your IP : 216.73.217.78


Current Path : /home/seto/indexator.pm/src/Search/
Upload File :
Current File : /home/seto/indexator.pm/src/Search/XmlRiverProvider.php

<?php

namespace App\Search;

use GuzzleHttp\Client;
use GuzzleHttp\Exception\GuzzleException;

class XmlRiverProvider implements SearchProviderInterface
{
    private Client $http;

    public function __construct(private string $user, private string $key)
    {
        $this->http = new Client([
            'timeout'         => 45,
            'connect_timeout' => 10,
        ]);
    }

    public function getName(): string
    {
        return 'xmlriver';
    }

    public function buildCurlOptions(string $query): array
    {
        return [
            CURLOPT_URL            => 'http://xmlriver.com/search/xml?' . http_build_query([
                'user'  => $this->user,
                'key'   => $this->key,
                'query' => $query,
            ]),
            CURLOPT_TIMEOUT        => 45,
            CURLOPT_CONNECTTIMEOUT => 10,
            CURLOPT_RETURNTRANSFER => true,
        ];
    }

    public function parseResponse(string $body, int $httpCode): SearchResult
    {
        $rawExcerpt = substr($body, 0, 2000);

        if ($httpCode < 200 || $httpCode >= 300) {
            return new SearchResult('error', 0, [], $rawExcerpt, 'HTTP ' . $httpCode);
        }

        if ($body === '') {
            return new SearchResult('error', 0, [], '', 'Empty response from XMLRiver');
        }

        $xml = @simplexml_load_string($body);
        if ($xml === false) {
            return new SearchResult('error', 0, [], $rawExcerpt, 'Invalid XML from XMLRiver');
        }

        if (isset($xml->response->error)) {
            $code = (int) $xml->response->error['code'];
            if ($code === 15) {
                return new SearchResult('ok', 0, [], $rawExcerpt);
            }
            return new SearchResult('error', 0, [], $rawExcerpt, (string) $xml->response->error);
        }

        $organicUrls = [];
        foreach ($xml->response->results->grouping->group ?? [] as $group) {
            $docUrl = (string) ($group->doc->url ?? '');
            if ($docUrl !== '') {
                $organicUrls[] = $docUrl;
            }
        }

        return new SearchResult('ok', count($organicUrls), $organicUrls, $rawExcerpt);
    }

    public function search(string $query): SearchResult
    {
        $url = 'http://xmlriver.com/search/xml?' . http_build_query([
            'user'  => $this->user,
            'key'   => $this->key,
            'query' => $query,
        ]);

        try {
            $response = $this->http->get($url);
            $body     = (string) $response->getBody();
            return $this->parseResponse($body, $response->getStatusCode());

        } catch (GuzzleException $e) {
            return new SearchResult('error', 0, [], '', 'Request failed: ' . $e->getMessage());
        }
    }
}