]> git.ipfire.org Git - thirdparty/dnspython.git/commitdiff
Support for DoH GET method
authorFilip Š <filip.stamcar@hotmail.com>
Fri, 4 Oct 2019 19:38:08 +0000 (21:38 +0200)
committerFilip Š <filip.stamcar@hotmail.com>
Fri, 4 Oct 2019 19:38:08 +0000 (21:38 +0200)
dns/query.py
dns/query.pyi

index 598fa8bd5f21deb1ad9e9105d4ad8df5f4bab8b9..6c0f379db2b05c17240dac36fe4b18827923eef4 100644 (file)
@@ -27,6 +27,7 @@ import socket
 import struct
 import sys
 import time
+import base64
 
 import dns.exception
 import dns.inet
@@ -191,13 +192,15 @@ def _destination_and_source(af, where, port, source, source_port):
     return (af, destination, source)
 
 
-def doh(query, nameserver):
+def doh(query, nameserver, post=True):
     """Return the response obtained after sending a query via DoH.
 
     *query*, a ``dns.message.Message`` containing the query to send
 
     *nameserver*, a ``str`` containing the nameserver URL.
 
+    *post*, a ``bool`` indicating whether POST method should be used.
+
     Returns a ``dns.message.Message``.
     """
 
@@ -207,9 +210,13 @@ def doh(query, nameserver):
         'Content-Type': 'application/dns-message',
     }
 
-    request = urllib.request.Request(nameserver, data=wirequery, headers=headers)
-    response = urllib.request.urlopen(request).read()
+    if post:
+        request = urllib.request.Request(nameserver, data=wirequery, headers=headers)
+    else:
+        wirequery = base64.urlsafe_b64encode(wirequery).decode('utf-8').strip('=')
+        request = urllib.request.Request(nameserver + '?dns=' + wirequery, headers=headers)
 
+    response = urllib.request.urlopen(request).read()
     return dns.message.from_wire(response)
 
 def send_udp(sock, what, destination, expiration=None):
index ccd4b3fe6b485535efd0b4662770cf4543502989..26012e5d8abc78b67681eb9d57fe1d502e55d3b7 100644 (file)
@@ -1,6 +1,6 @@
 from typing import Optional, Union, Dict, Generator, Any
 from . import message, tsig, rdatatype, rdataclass, name, message
-def doh(query : message.Message, nameserver : str) -> message.Message:
+def doh(query : message.Message, nameserver : str, post=True) -> message.Message:
     pass
 
 def tcp(q : message.Message, where : str, timeout : float = None, port=53, af : Optional[int] = None, source : Optional[str] = None, source_port : int = 0,