#!/usr/bin/env python3
import http
import http.server
import time
import threading
from contextlib import contextmanager
from typing import Generator

import requests

class TestHandler(http.server.SimpleHTTPRequestHandler):
    # Implementing HTTP methods can be done simply by creating a do_VERB()
    # method!
    def do_POST(self):
        self.rfile.read()
        self.send_response(http.HTTPStatus.OK)
        self.end_headers()

@contextmanager
def test_server() -> Generator[str, None, None]:
    """Run a simple test server and clean up afterwards.

    We yield the base URL for the server, which is handy because we're serving
    on an ephemeral port.
    """
    httpd = http.server.HTTPServer(("127.0.0.1", 0), TestHandler)
    t = threading.Thread(target=httpd.serve_forever)
    t.start()
    try:
        yield f"http://{httpd.server_name}:{httpd.server_port}/"
    finally:
        httpd.shutdown()
        t.join()

def send_request(url: str) -> None:
    before = time.clock_gettime(time.CLOCK_MONOTONIC)
    try:
        requests.post(url, data="A" * 1024 * 1024 * 512, timeout=(0.1, 100))
    except Exception as e:
        print(f"Requests raised an exception: {type(e).__name__}({e})")
    after = time.clock_gettime(time.CLOCK_MONOTONIC)
    print(f"Took {after - before}s")

def main():
    with test_server() as url:
        send_request(url)

if __name__ == "__main__":
    main()
