def handle_error(self, req, client, addr, exc): request_start = datetime.now() addr = addr or ('', -1) # unix socket case if isinstance(exc, (InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, LimitRequestLine, LimitRequestHeaders, InvalidProxyLine, ForbiddenProxyRequest, SSLError)): status_int = 400 reason = "Bad Request" if isinstance(exc, InvalidRequestLine): mesg = "Invalid Request Line '%s'" % str(exc) elif isinstance(exc, InvalidRequestMethod): mesg = "Invalid Method '%s'" % str(exc) elif isinstance(exc, InvalidHTTPVersion): mesg = "Invalid HTTP Version '%s'" % str(exc) elif isinstance(exc, (InvalidHeaderName, InvalidHeader,)): mesg = "%s" % str(exc) if not req and hasattr(exc, "req"): req = exc.req # for access log elif isinstance(exc, LimitRequestLine): mesg = "%s" % str(exc) elif isinstance(exc, LimitRequestHeaders): mesg = "Error parsing headers: '%s'" % str(exc) elif isinstance(exc, InvalidProxyLine): mesg = "'%s'" % str(exc) elif isinstance(exc, ForbiddenProxyRequest): reason = "Forbidden" mesg = "Request forbidden" status_int = 403 elif isinstance(exc, SSLError): reason = "Forbidden" mesg = "'%s'" % str(exc) status_int = 403 msg = "Invalid request from ip={ip}: {error}" self.log.debug(msg.format(ip=addr[0], error=str(exc))) else: if hasattr(req, "uri"): self.log.exception("Error handling request %s", req.uri) status_int = 500 reason = "Internal Server Error" mesg = "" if req is not None: request_time = datetime.now() - request_start environ = default_environ(req, client, self.cfg) environ['REMOTE_ADDR'] = addr[0] environ['REMOTE_PORT'] = str(addr[1]) resp = Response(req, client, self.cfg) resp.status = "%s %s" % (status_int, reason) resp.response_length = len(mesg) self.log.access(resp, req, environ, request_time) try: util.write_error(client, status_int, reason, mesg) except: self.log.debug("Failed to send error message.")
def handle_error(self, req, client, addr, exc): request_start = datetime.now() addr = addr or ('', -1) # unix socket case if isinstance(exc, (InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, LimitRequestLine, LimitRequestHeaders,)): status_int = 400 reason = "Bad Request" if isinstance(exc, InvalidRequestLine): mesg = "<p>Invalid Request Line '%s'</p>" % str(exc) elif isinstance(exc, InvalidRequestMethod): mesg = "<p>Invalid Method '%s'</p>" % str(exc) elif isinstance(exc, InvalidHTTPVersion): mesg = "<p>Invalid HTTP Version '%s'</p>" % str(exc) elif isinstance(exc, (InvalidHeaderName, InvalidHeader,)): mesg = "<p>Invalid Header '%s'</p>" % str(exc) elif isinstance(exc, LimitRequestLine): mesg = "<p>%s</p>" % str(exc) elif isinstance(exc, LimitRequestHeaders): mesg = "<p>Error parsing headers: '%s'</p>" % str(exc) self.log.debug("Invalid request from ip={ip}: {error}"\ "".format(ip=addr[0], error=str(exc), ) ) else: self.log.exception("Error handling request") status_int = 500 reason = "Internal Server Error" mesg = "" if req is not None: request_time = datetime.now() - request_start environ = default_environ(req, client, self.cfg) environ['REMOTE_ADDR'] = addr[0] environ['REMOTE_PORT'] = str(addr[1]) resp = Response(req, client) resp.status = "%s %s" % (status_int, reason) resp.response_length = len(mesg) self.log.access(resp, req, environ, request_time) if self.debug: tb = traceback.format_exc() mesg += "<h2>Traceback:</h2>\n<pre>%s</pre>" % tb try: util.write_error(client, status_int, reason, mesg) except: self.log.debug("Failed to send error message.")
def handle_error(self, req, client, addr, exc): request_start = datetime.now() if isinstance(exc, (InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, LimitRequestLine, LimitRequestHeaders,)): status_int = 400 reason = "Bad Request" if isinstance(exc, InvalidRequestLine): mesg = "<p>Invalid Request Line '%s'</p>" % str(exc) elif isinstance(exc, InvalidRequestMethod): mesg = "<p>Invalid Method '%s'</p>" % str(exc) elif isinstance(exc, InvalidHTTPVersion): mesg = "<p>Invalid HTTP Version '%s'</p>" % str(exc) elif isinstance(exc, (InvalidHeaderName, InvalidHeader,)): mesg = "<p>Invalid Header '%s'</p>" % str(exc) elif isinstance(exc, LimitRequestLine): mesg = "<p>%s</p>" % str(exc) elif isinstance(exc, LimitRequestHeaders): mesg = "<p>Error parsing headers: '%s'</p>" % str(exc) self.log.debug("Invalid request from ip={ip}: {error}"\ "".format(ip=client.getpeername()[0], error=repr(exc), ) ) else: self.log.exception("Error handling request") status_int = 500 reason = "Internal Server Error" mesg = "" if req is not None: request_time = datetime.now() - request_start environ = default_environ(req, client, self.cfg) environ['REMOTE_ADDR'] = addr[0] environ['REMOTE_PORT'] = str(addr[1]) resp = Response(req, client) resp.status = "%s %s" % (status_int, reason) resp.response_length = len(mesg) self.log.access(resp, req, environ, request_time) if self.debug: tb = traceback.format_exc() mesg += "<h2>Traceback:</h2>\n<pre>%s</pre>" % tb try: util.write_error(client, status_int, reason, mesg) except: self.log.warning("Failed to send error message.")
def handle_error(self, req, client, addr, exc): request_start = datetime.now() addr = addr or ('', -1) # unix socket case if isinstance(exc, ( InvalidRequestLine, InvalidRequestMethod, InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, LimitRequestLine, LimitRequestHeaders, InvalidProxyLine, ForbiddenProxyRequest, )): status_int = 400 reason = "Bad Request" if isinstance(exc, InvalidRequestLine): mesg = "<p>Invalid Request Line '%s'</p>" % str(exc) elif isinstance(exc, InvalidRequestMethod): mesg = "<p>Invalid Method '%s'</p>" % str(exc) elif isinstance(exc, InvalidHTTPVersion): mesg = "<p>Invalid HTTP Version '%s'</p>" % str(exc) elif isinstance(exc, ( InvalidHeaderName, InvalidHeader, )): mesg = "<p>%s</p>" % str(exc) if not req and hasattr(exc, "req"): req = exc.req # for access log elif isinstance(exc, LimitRequestLine): mesg = "<p>%s</p>" % str(exc) elif isinstance(exc, LimitRequestHeaders): mesg = "<p>Error parsing headers: '%s'</p>" % str(exc) elif isinstance(exc, InvalidProxyLine): mesg = "<p>'%s'</p>" % str(exc) elif isinstance(exc, ForbiddenProxyRequest): reason = "Forbidden" mesg = "<p>Request forbidden</p>" status_int = 403 self.log.debug("Invalid request from ip={ip}: {error}"\ "".format(ip=addr[0], error=str(exc), ) ) elif isinstance(exc, socket.timeout): status_int = 408 reason = "Request Timeout" mesg = "<p>The server timed out handling for the request</p>" else: self.log.exception("Error handling request") status_int = 500 reason = "Internal Server Error" mesg = "" if req is not None: request_time = datetime.now() - request_start environ = default_environ(req, client, self.cfg) environ['REMOTE_ADDR'] = addr[0] environ['REMOTE_PORT'] = str(addr[1]) resp = Response(req, client) resp.status = "%s %s" % (status_int, reason) resp.response_length = len(mesg) self.log.access(resp, req, environ, request_time) if self.debug: tb = traceback.format_exc() mesg += "<h2>Traceback:</h2>\n<pre>%s</pre>" % tb try: util.write_error(client, status_int, reason, mesg) except: self.log.debug("Failed to send error message.")
def create_environ(req, sock, client, server, cfg): # set initial environ environ = default_environ(req, sock, cfg) # default variables host = None script_name = os.environ.get("SCRIPT_NAME", "") # add the headers to the environ for hdr_name, hdr_value in req.headers: if hdr_name == "EXPECT": # handle expect if hdr_value.lower() == "100-continue": sock.send(b"HTTP/1.1 100 Continue\r\n\r\n") elif hdr_name == 'HOST': host = hdr_value elif hdr_name == "SCRIPT_NAME": script_name = hdr_value elif hdr_name == "CONTENT-TYPE": environ['CONTENT_TYPE'] = hdr_value continue elif hdr_name == "CONTENT-LENGTH": environ['CONTENT_LENGTH'] = hdr_value continue key = 'HTTP_' + hdr_name.replace('-', '_') if key in environ: hdr_value = "%s,%s" % (environ[key], hdr_value) environ[key] = hdr_value # set the url scheme environ['wsgi.url_scheme'] = req.scheme # set the REMOTE_* keys in environ # authors should be aware that REMOTE_HOST and REMOTE_ADDR # may not qualify the remote addr: # http://www.ietf.org/rfc/rfc3875 if isinstance(client, six.string_types): environ['REMOTE_ADDR'] = client elif isinstance(client, six.binary_type): environ['REMOTE_ADDR'] = client.decode() else: environ['REMOTE_ADDR'] = client[0] environ['REMOTE_PORT'] = str(client[1]) # handle the SERVER_* # Normally only the application should use the Host header but since the # WSGI spec doesn't support unix sockets, we are using it to create # viable SERVER_* if possible. if isinstance(server, six.string_types): server = server.split(":") if len(server) == 1: # unix socket if host: server = host.split(':') if len(server) == 1: if req.scheme == "http": server.append(80) elif req.scheme == "https": server.append(443) else: server.append('') else: # no host header given which means that we are not behind a # proxy, so append an empty port. server.append('') environ['SERVER_NAME'] = server[0] environ['SERVER_PORT'] = str(server[1]) # set the path and script name path_info = req.path if script_name: path_info = path_info.split(script_name, 1)[1] environ['PATH_INFO'] = unquote_to_wsgi_str(path_info) environ['SCRIPT_NAME'] = script_name # override the environ with the correct remote and server address if # we are behind a proxy using the proxy protocol. environ.update(proxy_environ(req)) return environ