1
0
Fork 0
mirror of https://github.com/Yetangitu/ampache synced 2025-10-04 10:19:25 +02:00
ampache/modules/React/Dns/Query/CachedExecutor.php

66 lines
1.8 KiB
PHP

<?php
namespace React\Dns\Query;
use React\Dns\Model\Message;
use React\Dns\Model\Record;
class CachedExecutor implements ExecutorInterface
{
private $executor;
private $cache;
public function __construct(ExecutorInterface $executor, RecordCache $cache)
{
$this->executor = $executor;
$this->cache = $cache;
}
public function query($nameserver, Query $query)
{
$executor = $this->executor;
$cache = $this->cache;
return $this->cache
->lookup($query)
->then(
function ($cachedRecords) use ($query) {
return $this->buildResponse($query, $cachedRecords);
},
function () use ($executor, $cache, $nameserver, $query) {
return $executor
->query($nameserver, $query)
->then(function ($response) use ($cache, $query) {
$cache->storeResponseMessage($query->currentTime, $response);
return $response;
});
}
);
}
public function buildResponse(Query $query, array $cachedRecords)
{
$response = new Message();
$response->header->set('id', $this->generateId());
$response->header->set('qr', 1);
$response->header->set('opcode', Message::OPCODE_QUERY);
$response->header->set('rd', 1);
$response->header->set('rcode', Message::RCODE_OK);
$response->questions[] = new Record($query->name, $query->type, $query->class);
foreach ($cachedRecords as $record) {
$response->answers[] = $record;
}
$response->prepare();
return $response;
}
protected function generateId()
{
return mt_rand(0, 0xffff);
}
}