This repository has been archived on 2023-02-09. You can view files and clone it, but cannot push or open issues or pull requests.
Files
blender-benchmark-bundle/benchmark/submission/auth.py

68 lines
1.9 KiB
Python
Raw Normal View History

import http.server
import logging
import random
import urllib.parse
from . import html, sockutil
log = logging.getLogger(__name__)
class TokenHTTPHandler(http.server.BaseHTTPRequestHandler):
"""Handle GET requests with tokens on the URL."""
def do_GET(self):
# /?token=72157630789362986-5405f8542b549e95
qs = urllib.parse.urlsplit(self.path).query
url_vars = urllib.parse.parse_qs(qs)
self.server.auth_token = url_vars['token'][0]
assert (isinstance(self.server.auth_token, str))
self.send_response(200)
self.send_header('Content-type', 'text/html')
self.end_headers()
self.wfile.write(html.auth_okay_html)
class TokenHTTPServer(http.server.HTTPServer):
"""HTTP server on a random port, which will receive the token."""
def __init__(self) -> None:
self.log = log.getChild('TokenHTTPServer')
self.local_addr = self.listen_port()
self.log.info('Creating HTTP server at %s', self.local_addr)
self.auth_token = None
http.server.HTTPServer.__init__(self, self.local_addr, TokenHTTPHandler)
def listen_port(self):
"""Returns the hostname and TCP/IP port number to listen on.
Finds a random free port between 1100 and 20000.
"""
# Find a random free port
local_addr = ('localhost', int(random.uniform(1100, 20000)))
self.log.debug('Finding free port starting at %s', local_addr)
return sockutil.find_free_port(local_addr)
def wait_for_token(self, timeout: float):
"""Starts the HTTP server, waits for the Token."""
if self.auth_token is None:
self.timeout = timeout
self.handle_request()
if self.auth_token:
self.log.info('Auth token received: %s' % self.auth_token)
return self.auth_token
@property
def auth_callback_url(self) -> str:
return f'http://localhost:{self.local_addr[1]}/'