MCPcopy
hub / github.com/benoitc/gunicorn / _parse_fast

Method _parse_fast

gunicorn/http/message.py:484–569  ·  view source on GitHub ↗

Parse request using fast C parser (gunicorn_h1c >= 0.4.1).

(self, unreader, buf)

Source from the content-addressed store, hash-verified

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 ""

Callers 1

parseMethod · 0.95

Calls 12

read_intoMethod · 0.95
LimitRequestHeadersClass · 0.90
LimitRequestLineClass · 0.90
InvalidHTTPVersionClass · 0.90
InvalidHeaderNameClass · 0.90
InvalidHeaderClass · 0.90
InvalidRequestLineClass · 0.90
bytes_to_strFunction · 0.90
split_request_uriFunction · 0.90
_apply_header_policyMethod · 0.80

Tested by

no test coverage detected