def __call__(self, environ, start_response): method = environ['REQUEST_METHOD'] if method not in self.allowed_methods: start_response('403 Forbidden', ()) return [''] if self.strip_script_name: path_info = '' else: path_info = environ['SCRIPT_NAME'] path_info += environ['PATH_INFO'] query_string = environ['QUERY_STRING'] if query_string: path_info += '?' + query_string host_uri = self.extract_uri(environ) uri = host_uri + path_info new_headers = {} for k, v in environ.items(): if k.startswith('HTTP_'): k = k[5:].replace('_', '-').title() new_headers[k] = v for k, v in (('CONTENT_TYPE', None), ('CONTENT_LENGTH', '0')): v = environ.get(k, None) if v is not None: new_headers[k.replace('_', '-').title()] = v if new_headers.get('Content-Length', '0') == '-1': raise ValueError(WEBOB_ERROR) response = self.client.request(uri, method, body=environ['wsgi.input'], headers=new_headers) if 'location' in response: if self.strip_script_name: prefix_path = environ['SCRIPT_NAME'] new_location = rewrite_location(host_uri, response.location, prefix_path=prefix_path) headers = [] for k, v in response.headerslist: if k.lower() == 'location': v = new_location headers.append((k, v)) else: headers = response.headerslist start_response(response.status, headers) if method == "HEAD": return StringIO() return response.tee()
def redirect(self, resp, location, request): """ reset request, set new url of request and perform it """ if self._nb_redirections <= 0: raise RedirectLimit("Redirection limit is reached") if request.initial_url is None: request.initial_url = self.url # discard response body and reset request informations if hasattr(resp, "_body"): resp._body.discard() else: resp.body.discard() # make sure location follow rfc2616 location = rewrite_location(request.url, location) if log.isEnabledFor(logging.DEBUG): log.debug("Redirect to %s" % location) # change request url and method if needed request.url = location self._nb_redirections -= 1 #perform a new request return self.perform(request)
def __call__(self, environ, start_response): method = environ["REQUEST_METHOD"] if method not in self.allowed_methods: start_response("403 Forbidden", ()) return [""] if self.strip_script_name: path_info = "" else: path_info = environ["SCRIPT_NAME"] path_info += environ["PATH_INFO"] query_string = environ["QUERY_STRING"] if query_string: path_info += "?" + query_string host_uri = self.extract_uri(environ) uri = host_uri + path_info new_headers = {} for k, v in environ.items(): if k.startswith("HTTP_"): k = k[5:].replace("_", "-").title() new_headers[k] = v for k, v in (("CONTENT_TYPE", None), ("CONTENT_LENGTH", "0")): v = environ.get(k, None) if v is not None: new_headers[k.replace("_", "-").title()] = v if new_headers.get("Content-Length", "0") == "-1": raise ValueError(WEBOB_ERROR) response = self.client.request(uri, method, body=environ["wsgi.input"], headers=new_headers) if "location" in response: if self.strip_script_name: prefix_path = environ["SCRIPT_NAME"] new_location = rewrite_location(host_uri, response.location, prefix_path=prefix_path) headers = [] for k, v in response.headerslist: if k.lower() == "location": v = new_location headers.append((k, v)) else: headers = response.headerslist start_response(response.status, headers) if method == "HEAD": return StringIO() return response.tee()
def redirect(self, location, request): """ reset request, set new url of request and perform it """ if self._nb_redirections <= 0: raise RedirectLimit("Redirection limit is reached") if request.initial_url is None: request.initial_url = self.url # make sure location follow rfc2616 location = rewrite_location(request.url, location) if log.isEnabledFor(logging.DEBUG): log.debug("Redirect to %s" % location) # change request url and method if needed request.url = location self._nb_redirections -= 1 #perform a new request return self.perform(request)