Parse request using fast C parser (gunicorn_h1c >= 0.4.1).
(self, unreader, buf)
| 482 | return self._parse_python(unreader, buf) |
| 483 | |
| 484 | def _parse_fast(self, unreader, buf): |
| 485 | """Parse request using fast C parser (gunicorn_h1c >= 0.4.1).""" |
| 486 | # Read until we have complete headers |
| 487 | data = bytes(buf) |
| 488 | last_len = 0 |
| 489 | |
| 490 | while True: |
| 491 | try: |
| 492 | # Pass all limit parameters to C parser |
| 493 | # Use _fast_limit_request_line which handles 0=unlimited |
| 494 | result = _fast_parser_module.parse_request( |
| 495 | data, |
| 496 | last_len=last_len, |
| 497 | limit_request_line=self._fast_limit_request_line, |
| 498 | limit_request_fields=self.limit_request_fields, |
| 499 | limit_request_field_size=self.limit_request_field_size, |
| 500 | permit_unconventional_http_method=self.cfg.permit_unconventional_http_method, |
| 501 | permit_unconventional_http_version=self.cfg.permit_unconventional_http_version, |
| 502 | ) |
| 503 | break |
| 504 | except _fast_parser_module.IncompleteError: |
| 505 | last_len = len(data) |
| 506 | self.read_into(unreader, buf) |
| 507 | data = bytes(buf) |
| 508 | if len(data) > self.max_buffer_headers + self._fast_limit_request_line: |
| 509 | raise LimitRequestHeaders("max buffer headers") |
| 510 | except _fast_parser_module.LimitRequestLine as e: |
| 511 | raise LimitRequestLine(str(e)) |
| 512 | except _fast_parser_module.LimitRequestHeaders as e: |
| 513 | raise LimitRequestHeaders(str(e)) |
| 514 | except _fast_parser_module.InvalidRequestMethod as e: |
| 515 | raise InvalidRequestMethod(str(e)) |
| 516 | except _fast_parser_module.InvalidHTTPVersion as e: |
| 517 | raise InvalidHTTPVersion(str(e)) |
| 518 | except _fast_parser_module.InvalidHeaderName as e: |
| 519 | raise InvalidHeaderName(str(e)) |
| 520 | except _fast_parser_module.InvalidHeader as e: |
| 521 | raise InvalidHeader(str(e)) |
| 522 | except _fast_parser_module.ParseError as e: |
| 523 | raise InvalidRequestLine(str(e)) |
| 524 | |
| 525 | # Extract parsed data |
| 526 | self.method = bytes_to_str(result['method']) |
| 527 | self.uri = bytes_to_str(result['path']) |
| 528 | |
| 529 | # Casefold method if configured (validation done by C parser) |
| 530 | if self.cfg.casefold_http_method: |
| 531 | self.method = self.method.upper() |
| 532 | |
| 533 | # Parse URI parts |
| 534 | if len(self.uri) == 0: |
| 535 | raise InvalidRequestLine(self.uri) |
| 536 | try: |
| 537 | parts = split_request_uri(self.uri) |
| 538 | except ValueError: |
| 539 | raise InvalidRequestLine(self.uri) |
| 540 | self.path = parts.path or "" |
| 541 | self.query = parts.query or "" |
no test coverage detected