| 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) |