#!/usr/bin/env python3

import requests
import socket
import threading

def server(port, upstream):
  assert type(port) is int
  assert port >= 0 and port <= 65535

  assert type(upstream) is str
  assert upstream.startswith('https://')

  udp_sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, socket.IPPROTO_UDP)

  udp_sock.bind(('127.0.0.1', port))

  requests_session = requests.Session()

  def handle(info):
    nonlocal udp_sock

    request, peer = info

    response = requests_session.post(upstream, data=request, timeout=10, headers={ 'content-type': 'application/dns-message' })

    assert response.status_code == 200

    udp_sock.sendto(response.content, peer)

  threads = [] 
  while True:
     info = udp_sock.recvfrom(65539)

     new_thread = threading.Thread(target=handle, args=(info,))

     threads.append(new_thread)
     new_thread.start()

server(53, 'https://1.0.0.1/dns-query')
Edit
Pub: 25 Apr 2021 07:59 UTC
Views: 219