def _handle_request(app, conn): env = DEFAULT_ENVIRON.copy() rawheaders = netstring.decode_stream(conn) it = iter(rawheaders.split(b"\0")) for key in it: if not key: break value = next(it) env[key.decode("latin1")] = value.decode("latin1") env['CONTENT_LENGTH'] = int(env["CONTENT_LENGTH"]) env['wsgi.input'] = conn.makefile("rb", 32758) env['wsgi.errors'] = Logger(env["SCRIPT_NAME"], "LOCAL7") if env.get('HTTPS', 'off') in ('on', '1'): env['wsgi.url_scheme'] = 'https' else: env['wsgi.url_scheme'] = 'http' def start_response(status, headers, exc_info=None): if exc_info is not None: try: raise exc_info[0](exc_info[1]).with_traceback(exc_info[2]) finally: exc_info = None conn.sendall("Status: {}\r\n".format(status).encode("ascii")) for h, v in headers: conn.sendall("{}: {}\r\n".format(h, v).encode("ascii")) conn.sendall(CRLF) if env["REQUEST_METHOD"] == "HEAD": app(env, start_response) else: for chunk in app(env, start_response): conn.sendall(chunk) # app encodes the return env['wsgi.input'].close()
def _netstring_listener(path, q): os.unlink(path) if os.path.exists(path) else None sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM, 0) sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) sock.bind(path) sock.listen(5) news, addr = sock.accept() db = netstring.decode_stream(news) sock.close() q.put(db)