mirror of
https://github.com/danog/dns-over-https.git
synced 2024-12-02 09:17:50 +01:00
Backwards compatibility
This commit is contained in:
parent
9022700aec
commit
3108b6f63b
@ -41,7 +41,7 @@
|
||||
}
|
||||
],
|
||||
"require": {
|
||||
"php": ">=7.0",
|
||||
"php": ">=8.1",
|
||||
"amphp/cache": "^v2-dev",
|
||||
"amphp/parser": "^1",
|
||||
"danog/libdns-json": "^0.1",
|
||||
|
@ -15,7 +15,7 @@ use Amp\Http\Client\HttpClientBuilder;
|
||||
final class DoHConfig
|
||||
{
|
||||
/**
|
||||
* @var non-empty-array<NameServer> $nameservers
|
||||
* @var non-empty-array<Nameserver> $nameservers
|
||||
*/
|
||||
private readonly array $nameservers;
|
||||
private readonly DelegateHttpClient $httpClient;
|
||||
@ -24,15 +24,17 @@ final class DoHConfig
|
||||
private readonly Cache $cache;
|
||||
|
||||
/**
|
||||
* @param non-empty-array<NameServer> $nameservers
|
||||
* @param non-empty-array<Nameserver> $nameservers
|
||||
*/
|
||||
public function __construct(array $nameservers, ?DelegateHttpClient $httpClient = null, ?Rfc1035StubResolver $resolver = null, ?ConfigLoader $configLoader = null, ?Cache $cache = null)
|
||||
{
|
||||
/** @psalm-suppress TypeDoesNotContainType */
|
||||
if (\count($nameservers) < 1) {
|
||||
throw new ConfigException("At least one nameserver is required for a valid config");
|
||||
}
|
||||
|
||||
foreach ($nameservers as $nameserver) {
|
||||
/** @psalm-suppress DocblockContradiction */
|
||||
if (!($nameserver instanceof Nameserver)) {
|
||||
throw new ConfigException("Invalid nameserver: {$nameserver}");
|
||||
}
|
||||
|
@ -6,6 +6,10 @@ use Amp\Dns\ConfigException;
|
||||
|
||||
final class Nameserver
|
||||
{
|
||||
public const RFC8484_GET = NameserverType::RFC8484_GET;
|
||||
public const RFC8484_POST = NameserverType::RFC8484_POST;
|
||||
public const GOOGLE_JSON = NameserverType::GOOGLE_JSON;
|
||||
|
||||
private readonly string $host;
|
||||
|
||||
public function __construct(
|
||||
|
@ -18,10 +18,8 @@ use Amp\Future;
|
||||
use Amp\Http\Client\DelegateHttpClient;
|
||||
use Amp\Http\Client\Request;
|
||||
use Amp\NullCancellation;
|
||||
use Amp\Promise;
|
||||
use danog\LibDNSJson\JsonDecoder;
|
||||
use danog\LibDNSJson\JsonDecoderFactory;
|
||||
use danog\LibDNSJson\QueryEncoder;
|
||||
use danog\LibDNSJson\QueryEncoderFactory;
|
||||
use LibDNS\Decoder\Decoder;
|
||||
use LibDNS\Decoder\DecoderFactory;
|
||||
@ -48,13 +46,13 @@ final class Rfc8484StubResolver implements Resolver
|
||||
|
||||
private Cache $cache;
|
||||
|
||||
/** @var Promise[] */
|
||||
/** @var Future[] */
|
||||
private array $pendingQueries = [];
|
||||
|
||||
private Rfc1035StubResolver $subResolver;
|
||||
private Encoder $encoder;
|
||||
private Decoder $decoder;
|
||||
private QueryEncoder $encoderJson;
|
||||
private Encoder $encoderJson;
|
||||
private JsonDecoder $decoderJson;
|
||||
private MessageFactory $messageFactory;
|
||||
private DelegateHttpClient $httpClient;
|
||||
@ -234,6 +232,7 @@ final class Rfc8484StubResolver implements Resolver
|
||||
|
||||
private function queryHosts(string $name, int $typeRestriction = null): array
|
||||
{
|
||||
\assert($this->config !== null);
|
||||
$hosts = $this->config->getKnownHosts();
|
||||
$records = [];
|
||||
|
||||
@ -271,6 +270,8 @@ final class Rfc8484StubResolver implements Resolver
|
||||
}
|
||||
}
|
||||
|
||||
\assert($this->config !== null);
|
||||
|
||||
$name = $this->normalizeName($name, $type);
|
||||
$question = $this->createQuestion($name, $type);
|
||||
|
||||
@ -301,7 +302,6 @@ final class Rfc8484StubResolver implements Resolver
|
||||
$result = [];
|
||||
$ttls = [];
|
||||
|
||||
/** @var \LibDNS\Records\Resource $record */
|
||||
foreach ($answers as $record) {
|
||||
$recordType = $record->getType();
|
||||
$result[$recordType][] = (string) $record->getData();
|
||||
@ -351,6 +351,7 @@ final class Rfc8484StubResolver implements Resolver
|
||||
private function ask(Nameserver $nameserver, Question $question, Cancellation $cancellation): Message
|
||||
{
|
||||
$message = $this->createMessage($question, \random_int(0, 0xffff));
|
||||
$request = null;
|
||||
switch ($nameserver->getType()) {
|
||||
case NameserverType::RFC8484_GET:
|
||||
$data = $this->encoder->encode($message);
|
||||
@ -364,7 +365,7 @@ final class Rfc8484StubResolver implements Resolver
|
||||
$request->setBody($data);
|
||||
$request->setHeader('content-type', 'application/dns-message');
|
||||
$request->setHeader('accept', 'application/dns-message');
|
||||
$request->setHeader('content-length', \strlen($data));
|
||||
$request->setHeader('content-length', (string) \strlen($data));
|
||||
$request->setHeaders($nameserver->getHeaders());
|
||||
break;
|
||||
case NameserverType::GOOGLE_JSON:
|
||||
@ -374,6 +375,7 @@ final class Rfc8484StubResolver implements Resolver
|
||||
$request->setHeaders($nameserver->getHeaders());
|
||||
break;
|
||||
}
|
||||
\assert($request !== null);
|
||||
|
||||
$response = $this->httpClient->request($request, $cancellation);
|
||||
if ($response->getStatus() !== 200) {
|
||||
@ -390,7 +392,7 @@ final class Rfc8484StubResolver implements Resolver
|
||||
}
|
||||
}
|
||||
|
||||
private function normalizeName(string $name, int $type)
|
||||
private function normalizeName(string $name, int $type): string
|
||||
{
|
||||
if ($type === Record::PTR) {
|
||||
if (($packedIp = @\inet_pton($name)) !== false) {
|
||||
@ -434,7 +436,10 @@ final class Rfc8484StubResolver implements Resolver
|
||||
return self::CACHE_PREFIX.$name."#".$type;
|
||||
}
|
||||
|
||||
private function decodeCachedResult(string $name, int $type, string $encoded)
|
||||
/**
|
||||
* @return list<Record>
|
||||
*/
|
||||
private function decodeCachedResult(string $name, int $type, string $encoded): array
|
||||
{
|
||||
$decoded = \json_decode($encoded, true);
|
||||
|
||||
|
15
psalm.xml
Normal file
15
psalm.xml
Normal file
@ -0,0 +1,15 @@
|
||||
<?xml version="1.0"?>
|
||||
<psalm
|
||||
errorLevel="2"
|
||||
resolveFromConfigFile="true"
|
||||
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
|
||||
xmlns="https://getpsalm.org/schema/config"
|
||||
xsi:schemaLocation="https://getpsalm.org/schema/config vendor/vimeo/psalm/config.xsd"
|
||||
>
|
||||
<projectFiles>
|
||||
<directory name="lib" />
|
||||
<ignoreFiles>
|
||||
<directory name="vendor" />
|
||||
</ignoreFiles>
|
||||
</projectFiles>
|
||||
</psalm>
|
Loading…
Reference in New Issue
Block a user