Skip to main content

llhttp in python

Project description

pyllhttp

Python wrapper for llhttp A fork of llhttp compatible with subinterpreters

A simple Python wrapper around llhttp, the HTTP parser for Node.js.

Install

llhttp via PyPI, or pip install llhttp

Usage

import llhttp
from pprint import pprint

pprint({"version": llhttp.version})

class request_parser(llhttp.Request):
    headers = {}

    url = b''
    current_header_field = None
    current_header_value = None

    def on_message_begin(self):
        print(f"MESSAGE BEGIN")

    def on_url(self, url):
        self.url += url
        self.pause()

    def on_url_complete(self):
        print(f"URL {self.url}")

    def on_header_field(self, field):
        assert self.current_header_value is None
        if self.current_header_field is None:
            self.current_header_field = bytearray(field)
        else:
            self.current_header_field += field

    def on_header_field_complete(self):
        self.current_header_field = self.current_header_field.decode('iso-8859-1').lower()
        assert self.current_header_field not in self.headers

    def on_header_value(self, value):
        assert self.current_header_field is not None
        if self.current_header_value is None:
            self.current_header_value = bytearray(value)
        else:
            self.current_header_value += value

    def on_header_value_complete(self):
        assert self.current_header_field is not None
        self.current_header_value = bytes(self.current_header_value)
        print(f"HEADER {self.current_header_field}: {self.current_header_value}")
        self.headers[self.current_header_field] = self.current_header_value
        self.current_header_field = None
        self.current_header_value = None

    def on_headers_complete(self):
        assert self.current_header_field is None
        assert self.current_header_value is None

    def on_message_complete(self):
        print("MESSAGE COMPLETE")

parser = request_parser()

assert parser.lenient_headers is not True
parser.lenient_headers = True
parser.reset()
assert parser.lenient_headers is True

buffer = b"GET /test HTTP/1.1\r\nlOl:wut\r\nOH: hai\r\n\r\n"
while buffer:
    consumed = parser.execute(buffer[:2])
    buffer = buffer[consumed:]
    if parser.is_paused:
        print("UNPAUSING")
        parser.unpause()

parser.finish()
pprint({
    "method": parser.method,
    "url": parser.url,
    "version": f"{parser.major}.{parser.minor}",
    "headers": parser.headers,
})
{'version': '3.0.0'}
MESSAGE BEGIN
UNPAUSING
UNPAUSING
UNPAUSING
URL b'/test'
HEADER lol: b'wut'
HEADER oh: b'hai'
MESSAGE COMPLETE
{'headers': {'lol': b'wut', 'oh': b'hai'},
 'method': 'GET',
 'url': b'/test',
 'version': '1.1'}

Extra

This project is a toy, started to reacquaint myself with Python c-api modules. If you find it useful, please let me know.

The version number tracks the version of the incorporated llhttp.

License: MIT

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pyllhttp-6.7.0.tar.gz (40.5 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

pyllhttp-6.7.0-cp313-cp313-macosx_15_0_arm64.whl (41.2 kB view details)

Uploaded CPython 3.13macOS 15.0+ ARM64

File details

Details for the file pyllhttp-6.7.0.tar.gz.

File metadata

  • Download URL: pyllhttp-6.7.0.tar.gz
  • Upload date:
  • Size: 40.5 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.0

File hashes

Hashes for pyllhttp-6.7.0.tar.gz
Algorithm Hash digest
SHA256 48344a5080bc9aae829c67a500592dd1f1b84b8fc5e82a70f5354735bde2eb12
MD5 6ef8558bbd2099701ea875b2f4355414
BLAKE2b-256 c7d2c3314ab13a48f1d1c3e8edad87e9681675208a0b59862f9b0d69938aafd3

See more details on using hashes here.

File details

Details for the file pyllhttp-6.7.0-cp313-cp313-macosx_15_0_arm64.whl.

File metadata

File hashes

Hashes for pyllhttp-6.7.0-cp313-cp313-macosx_15_0_arm64.whl
Algorithm Hash digest
SHA256 a734e12fc797189fbcc85bcc86a013f927bb8632815e001b9fbb1198604358d9
MD5 15aae40217bf36b6774a99f896262661
BLAKE2b-256 4ab77303eb2030dc32f0a4c14e772dc72c3220eaf6a97ea597c438e7f2f233db

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page