Mercurial > p > roundup > code
comparison roundup/cgi/wsgi_handler.py @ 5821:e7b30ab60941
Fix REST API for WSGI
Add dictionary-like headers attribute.
Similar to the apache implementation in same directory but we look up
the given header in the wsgi environment. Environment entries are
mangled (all uppercase, '-' replaced with '_', prefix HTTP_). So on
lookup we mangle the given name first. This allows the rest
implementation (and others) to look up headers.
| author | Ralf Schlatterbeck <rsc@runtux.com> |
|---|---|
| date | Fri, 21 Jun 2019 18:17:42 +0200 |
| parents | 1a835db41674 |
| children | edd9e2c67785 |
comparison
equal
deleted
inserted
replaced
| 5816:75296ce63f25 | 5821:e7b30ab60941 |
|---|---|
| 18 from roundup.anypy import http_ | 18 from roundup.anypy import http_ |
| 19 from roundup.anypy.strings import s2b, bs2b | 19 from roundup.anypy.strings import s2b, bs2b |
| 20 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler | 20 BaseHTTPRequestHandler = http_.server.BaseHTTPRequestHandler |
| 21 DEFAULT_ERROR_MESSAGE = http_.server.DEFAULT_ERROR_MESSAGE | 21 DEFAULT_ERROR_MESSAGE = http_.server.DEFAULT_ERROR_MESSAGE |
| 22 | 22 |
| 23 class Headers(object): | |
| 24 """ Idea more or less stolen from the 'apache.py' in same directory. | |
| 25 Except that wsgi stores http headers in environment. | |
| 26 """ | |
| 27 def __init__(self, environ): | |
| 28 self.environ = environ | |
| 29 | |
| 30 def mangle_name(self, name): | |
| 31 n = name.replace('-', '_').upper() | |
| 32 return 'HTTP_' + n | |
| 33 | |
| 34 def get(self, name, default = None): | |
| 35 return self.environ.get(self.mangle_name(name), default) | |
| 36 getheader = get | |
| 23 | 37 |
| 24 class Writer(object): | 38 class Writer(object): |
| 25 '''Perform a start_response if need be when we start writing.''' | 39 '''Perform a start_response if need be when we start writing.''' |
| 26 def __init__(self, request): | 40 def __init__(self, request): |
| 27 self.request = request #weakref.ref(request) | 41 self.request = request #weakref.ref(request) |
| 48 request = RequestDispatcher(self.home, self.debug, self.timing) | 62 request = RequestDispatcher(self.home, self.debug, self.timing) |
| 49 request.__start_response = start_response | 63 request.__start_response = start_response |
| 50 | 64 |
| 51 request.wfile = Writer(request) | 65 request.wfile = Writer(request) |
| 52 request.__wfile = None | 66 request.__wfile = None |
| 67 request.headers = Headers(environ) | |
| 53 | 68 |
| 54 if environ ['REQUEST_METHOD'] == 'OPTIONS': | 69 if environ ['REQUEST_METHOD'] == 'OPTIONS': |
| 55 code = 501 | 70 code = 501 |
| 56 message, explain = BaseHTTPRequestHandler.responses[code] | 71 message, explain = BaseHTTPRequestHandler.responses[code] |
| 57 request.start_response([('Content-Type', 'text/html'), | 72 request.start_response([('Content-Type', 'text/html'), |
