| Current Path : /home/seto/indexator.pm/src/Search/ |
| 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());
}
}
}