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

Roundup Issue Tracker: http://roundup-tracker.org/