| 198 | sys.exit(1) |
| 199 | |
| 200 | def handle_error(self, req, client, addr, exc): |
| 201 | request_start = datetime.now() |
| 202 | addr = addr or ('', -1) # unix socket case |
| 203 | if isinstance(exc, ( |
| 204 | InvalidRequestLine, InvalidRequestMethod, |
| 205 | InvalidHTTPVersion, InvalidHeader, InvalidHeaderName, |
| 206 | LimitRequestLine, LimitRequestHeaders, |
| 207 | InvalidProxyLine, ForbiddenProxyRequest, |
| 208 | InvalidSchemeHeaders, UnsupportedTransferCoding, |
| 209 | ConfigurationProblem, ObsoleteFolding, ExpectationFailed, |
| 210 | SSLError, |
| 211 | )): |
| 212 | |
| 213 | status_int = 400 |
| 214 | reason = "Bad Request" |
| 215 | |
| 216 | if isinstance(exc, InvalidRequestLine): |
| 217 | mesg = "Invalid Request Line '%s'" % str(exc) |
| 218 | elif isinstance(exc, InvalidRequestMethod): |
| 219 | mesg = "Invalid Method '%s'" % str(exc) |
| 220 | elif isinstance(exc, InvalidHTTPVersion): |
| 221 | mesg = "Invalid HTTP Version '%s'" % str(exc) |
| 222 | elif isinstance(exc, UnsupportedTransferCoding): |
| 223 | mesg = "%s" % str(exc) |
| 224 | status_int = 501 |
| 225 | elif isinstance(exc, ConfigurationProblem): |
| 226 | mesg = "%s" % str(exc) |
| 227 | status_int = 500 |
| 228 | elif isinstance(exc, ObsoleteFolding): |
| 229 | mesg = "%s" % str(exc) |
| 230 | elif isinstance(exc, (InvalidHeaderName, InvalidHeader,)): |
| 231 | mesg = "%s" % str(exc) |
| 232 | if not req and hasattr(exc, "req"): |
| 233 | req = exc.req # for access log |
| 234 | elif isinstance(exc, LimitRequestLine): |
| 235 | mesg = "%s" % str(exc) |
| 236 | elif isinstance(exc, ExpectationFailed): |
| 237 | reason = "Expectation Failed" |
| 238 | mesg = str(exc) |
| 239 | status_int = 417 |
| 240 | elif isinstance(exc, LimitRequestHeaders): |
| 241 | reason = "Request Header Fields Too Large" |
| 242 | mesg = "Error parsing headers: '%s'" % str(exc) |
| 243 | status_int = 431 |
| 244 | elif isinstance(exc, InvalidProxyLine): |
| 245 | mesg = "'%s'" % str(exc) |
| 246 | elif isinstance(exc, ForbiddenProxyRequest): |
| 247 | reason = "Forbidden" |
| 248 | mesg = "Request forbidden" |
| 249 | status_int = 403 |
| 250 | elif isinstance(exc, InvalidSchemeHeaders): |
| 251 | mesg = "%s" % str(exc) |
| 252 | elif isinstance(exc, SSLError): |
| 253 | reason = "Forbidden" |
| 254 | mesg = "'%s'" % str(exc) |
| 255 | status_int = 403 |
| 256 | |
| 257 | msg = "Invalid request from ip={ip}: {error}" |