"""Loopback teaching adapter. Not a production HTTP server.""" from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pipeline import decode, encode, predict def server(bundle, version, port=0): class Handler(BaseHTTPRequestHandler): def log_message(self, *_): pass def reply(self, status, value): data = encode(value) self.send_response(status) self.send_header('Content-Type', 'application/json') self.send_header('Content-Length', str(len(data))) self.end_headers() self.wfile.write(data) def do_POST(self): if self.path != '/predict': self.reply(404, {'error': 'unknown route'}) return try: size = int(self.headers.get('Content-Length', '0')) if not 0 < size <= 4096: self.reply(413, {'error': 'body must be 1..4096 bytes'}) return if self.headers.get_content_type() != 'application/json': self.reply(415, {'error': 'application/json required'}) return data = self.rfile.read(size) self.reply(200, predict(bundle, decode(data), version)) except (ValueError, TypeError, OverflowError): self.reply(422, {'error': 'invalid prediction request'}) service = ThreadingHTTPServer(('127.0.0.1', port), Handler) service.timeout = 2 return service