from http.server import HTTPServer, SimpleHTTPRequestHandler
import os
import mimetypes

PORT = 8000


class BrotliHandler(SimpleHTTPRequestHandler):

    def send_brotli_file(self, filepath, original_name):
        self.send_response(200)

        mime_type, _ = mimetypes.guess_type(original_name)

        if mime_type is None:
            mime_type = "application/octet-stream"

        self.send_header("Content-Type", mime_type)
        self.send_header("Content-Encoding", "br")
        self.send_header("Content-Length", str(os.path.getsize(filepath)))
        self.send_header("Cache-Control", "no-cache")
        self.end_headers()

        with open(filepath, "rb") as f:
            self.wfile.write(f.read())

    def do_GET(self):

        requested = self.path.split("?", 1)[0]
        requested = requested.lstrip("/")

        if requested == "":
            requested = "."

        # Requested real path
        real_path = os.path.join(os.getcwd(), requested)

        # Case 1:
        # User explicitly requests .br file
        if requested.endswith(".br") and os.path.isfile(real_path):

            original_name = requested[:-3]

            return self.send_brotli_file(real_path, original_name)

        # Case 2:
        # User requests normal file, but .br version exists
        br_path = real_path + ".br"

        if os.path.isfile(br_path):
            return self.send_brotli_file(br_path, requested)

        # Case 3:
        # Normal static file
        return super().do_GET()


httpd = HTTPServer(("0.0.0.0", PORT), BrotliHandler)

print(f"Serving directory:")
print(os.getcwd())

print(f"\nOpen browser:")
print(f"http://localhost:{PORT}")

httpd.serve_forever()