from collections import namedtuple import json def app_body_only(environ, start_response): # pragma: no cover cl = environ.get("CONTENT_LENGTH", None) if cl is not None: cl = int(cl) body = environ["wsgi.input"].read(cl) cl = str(len(body)) start_response("200 OK", [("Content-Length", cl), ("Content-Type", "text/plain"),]) return [body] def app(environ, start_response): # pragma: no cover cl = environ.get("CONTENT_LENGTH", None) if cl is not None: cl = int(cl) request_body = environ["wsgi.input"].read(cl) cl = str(len(request_body)) meta = { "method": environ["REQUEST_METHOD"], "path_info": environ["PATH_INFO"], "script_name": environ["SCRIPT_NAME"], "query_string": environ["QUERY_STRING"], "content_length": cl, "scheme": environ["wsgi.url_scheme"], "remote_addr": environ["REMOTE_ADDR"], "remote_host": environ["REMOTE_HOST"], "server_port": environ["SERVER_PORT"], "server_name": environ["SERVER_NAME"], "headers": { k[len("HTTP_") :]: v for k, v in environ.items() if k.startswith("HTTP_") }, } response = json.dumps(meta).encode("utf8") + b"\r\n\r\n" + request_body start_response( "200 OK", [("Content-Length", str(len(response))), ("Content-Type", "text/plain"),], ) return [response] Echo = namedtuple( "Echo", ( "method path_info script_name query_string content_length scheme " "remote_addr remote_host server_port server_name headers body" ), ) def parse_response(response): meta, body = response.split(b"\r\n\r\n", 1) meta = json.loads(meta.decode("utf8")) return Echo(body=body, **meta)