Net-DNS-Resolver-DoH

 view release on metacpan or  search on metacpan

lib/Net/DNS/Resolver/DoH.pm  view on Meta::CPAN

  if ( @_ ) {
    my @url;
    foreach my $ns ( grep defined, @_ ) {
      next if ! $ns =~ /https:\/\//;
      next if ! $ns =~ /\{dns\}/;
      push @url, $ns;
    }
    $self->{dohnameservers} = \@url;
  }
  return @{$self->{dohnameservers}} if defined $self->{dohnameservers};
  return @{$self->_defaultdohservers};
}

sub _send_doh {
  my ( $self, $query, $query_data ) = @_;
  my @ns = $self->nameservers();
  my $fallback;
  my $timeout = $self->{tcp_timeout}; ## TODO
  foreach my $url (@ns) {
    my $this_url = $url;
    my $data = encode_base64url( $query_data );
    $this_url =~ s/{dns}/?dns=$data/;
    $self->_diag( 'doh send', "[$url]" );
    my $http = HTTP::Tiny->new(
      'keep_alive' => 0,
    );
    my $response = $http->get( $this_url );
    if ( ! $response->{'success'} ) {
        #        return; #### TODO
    }
    $self->_diag( 'reply from', "[$url]", $response->{status}, length($response->{content}), 'bytes' );

    my $reply = Net::DNS::Packet->decode( \$response->{content}, $self->{debug} );
    $self->errorstring($@);

    #$reply->from($ip);

    if ( $self->{tsig_rr} && !$reply->verify($query) ) {
      $self->errorstring( $reply->verifyerr );
      next;
    }

    my $rcode = $reply->header->rcode;
    return $reply if $rcode eq 'NOERROR';
    return $reply if $rcode eq 'NXDOMAIN';

    #$fallback = $reply; ## TODO

    return $reply;

  }

  #$self->{errorstring} = $fallback->header->rcode if $fallback;  TODO
  #$self->errorstring('query timed out') unless $self->{errorstring};
  #return $fallback;
}

#sub srcaddr { ## TODO

sub bgsend { die 'not implemented' }
sub bgbusy { die 'not implemented' }
sub bgread { die 'not implemented' }
sub bgisready { die 'not implemented' }
sub axfr { die 'not implemented' }

## TODO override methods not available via DoH

1;



( run in 0.666 second using v1.01-cache-2.11-cpan-39bf76dae61 )