#!/usr/bin/env python3
"""HTTP server for the fillPoses POC.

Serves /poc.html plus the MojoJS module bindings (gen/**.mojom.m.js)
that webxr-test.js needs in order to mock device.mojom.VRService.
"""
import http.server
import os
import socketserver
import sys

PORT = int(os.environ.get('PORT', '28765'))
HERE = os.path.dirname(os.path.abspath(__file__))
SRC  = os.environ.get('CHROMIUM_SRC', '/chromium/chromium/src')
GEN  = os.path.join(SRC, 'out', 'asan', 'gen')
WPT  = os.path.join(SRC, 'third_party', 'blink', 'web_tests',
                    'external', 'wpt')

ROUTES = [
    ('/gen/',                GEN),
    ('/resources/chromium/', os.path.join(WPT, 'resources', 'chromium')),
]

EXT = {
    '.html': 'text/html; charset=utf-8',
    '.js':   'text/javascript; charset=utf-8',
    '.mjs':  'text/javascript; charset=utf-8',
    '.json': 'application/json; charset=utf-8',
}


class Handler(http.server.SimpleHTTPRequestHandler):
    def translate_path(self, path):
        path = path.split('?', 1)[0].split('#', 1)[0]
        for prefix, base in ROUTES:
            if path.startswith(prefix):
                rel = os.path.normpath(path[len(prefix):]).lstrip('/\\')
                return os.path.join(base, rel)
        rel = os.path.normpath(path).lstrip('/\\')
        return os.path.join(HERE, rel)

    def guess_type(self, path):
        for ext, mt in EXT.items():
            if path.endswith(ext):
                return mt
        return super().guess_type(path)

    def log_message(self, fmt, *args):
        sys.stderr.write('[server] ' + (fmt % args) + '\n')


class Server(socketserver.TCPServer):
    allow_reuse_address = True


if __name__ == '__main__':
    with Server(('127.0.0.1', PORT), Handler) as httpd:
        print(f'serving on http://127.0.0.1:{PORT}/', flush=True)
        httpd.serve_forever()
