"""Compare loopback-only and all-IPv4 binding using disposable HTTP servers."""

import json
from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer
from threading import Thread
from urllib.error import URLError
from urllib.request import ProxyHandler, build_opener


class Handler(BaseHTTPRequestHandler):
    def do_GET(self):
        self.send_response(200)
        self.end_headers()
        self.wfile.write(b"demo")

    def log_message(self, *args):
        pass


def check(bind):
    server = ThreadingHTTPServer((bind, 0), Handler)
    thread = Thread(target=server.serve_forever, daemon=True)
    thread.start()
    results = {}
    try:
        opener = build_opener(ProxyHandler({}))
        for host in ('127.0.0.1', '127.0.0.2'):
            try:
                with opener.open(f'http://{host}:{server.server_port}/', timeout=2) as response:
                    results[host] = response.status
            except URLError:
                results[host] = 'connection_failed'
    finally:
        server.shutdown()
        server.server_close()
        thread.join()
    return results


if __name__ == '__main__':
    results = {bind: check(bind) for bind in ('127.0.0.1', '0.0.0.0')}
    assert results['127.0.0.1'] == {'127.0.0.1': 200, '127.0.0.2': 'connection_failed'}
    assert results['0.0.0.0'] == {'127.0.0.1': 200, '127.0.0.2': 200}
    print(json.dumps(results, indent=2))
