Skip to main content

HTTP Structured Fields in Python

Test Status

This is a Python 3 library implementing parsing and serialisation of RFC 9651.

Python API

Parsing

Textual HTTP headers can be parsed by calling parse; the return value is a data structure that represents the field value.

>>> from http_sf import parse, ser
>>> parse(b"foo; a=1, bar; b=2", tltype="dictionary")
{'foo': (True, {'a': 1}), 'bar': (True, {'b': 2})}

parse() takes a bytes-like object as the first argument. If you want to parse a string, please .encode() it first.

Indicating Top-Level Type

Because the library needs to know which kind of field it is, you need to hint this when calling parse. There are two ways to do this:

  1. Using a tltype parameter, whose value should be one of 'dictionary', 'list', or 'item'.
  2. Using a name parameter to indicate a field name that has a registered type, per the retrofit draft.

Note that if you use name, a KeyError will be raised if the type associated with the name isn't known, unless you also pass a tltype as a fallback.

Error Handling

When parsing fails, a StructuredFieldError (a subclass of ValueError) is raised. This exception has attributes that can be used to debugging the error:

  • position: The character offset in the input bytes where the error was detected.
  • offending_char: The character at the position where the error was detected.
  • context: If the error occurred within a Dictionary or Parameter value, the key name.
>>> from http_sf import parse, StructuredFieldError
>>> try:
...     parse(b"foo; bar", tltype="item")
... except StructuredFieldError as e:
...     print(f"Error at {e.position}: {e}")
...
Error at 8: Parameter value definition expected

Duplicate Keys

By default, duplicate keys in Dictionaries and Parameters are overwritten by the last value, as per the specification. If you wish to detect when this happens, you can set a callback:

>>> from http_sf import parse
>>> def complain(key, context):
...     print(f"Duplicate key: {key} in {context}")
...
>>> parse(b"a=1, a=2", tltype="dictionary", on_duplicate_key=complain)
Duplicate key: a in dictionary
{'a': (2, {})}

Types

In the returned data, Dictionaries are represented as Python dictionaries; Lists are represented as Python lists, and Items are the bare type.

Bare types are represented using the following Python types:

  • Integers: int
  • Decimals: float
  • Strings: str
  • Tokens: http_sf.Token (a UserString)
  • Byte Sequences: bytes
  • Booleans: bool
  • Dates: datetime.datetime
  • Display Strings: http_sf.DisplayString (a UserString)

Inner Lists are represented as lists as well.

Parameters

Structured Types that can have parameters (including Dictionary and List members as well as singular Items and Inner Lists) are represented as a tuple of (value, parameters) where parameters is a dictionary.

So, a single item that's a Token with one parameter whose value is an integer will be represented like this:

>>> parse(b"foo; a=1", tltype="item")
(Token("foo"), {'a': 1})

Note that even if there aren't parameters, a tuple will still be returned, as in some items on this List:

>>> parse(b"a, b; q=5, c", tltype="list")
[(Token("a"), {}), (Token("b"), {'q': 5}), (Token("c"), {})]

Serialisation

To serialise that data structure back to a textual Structured Field, use ser:

>>> field = parse(b"a, b; q=5, c", tltype="list")
>>> ser(field)
'a, b;q=5, c'

When using ser, if an Item or Inner List doesn't have parameters, they can be omitted; for example:

>>> structure = [5, 6, (7, {"with": "param"})]
>>> ser(structure)
'5, 6, 7;with="param"'

Note that ser produces a string, not a bytes-like object.

Migrating from http_sfv

If you have code that uses the deprecated http_sfv package, a drop-in compatibility layer is available in http_sf.compat. It provides the same object-oriented Dictionary, List, Item, InnerList, Token, and DisplayString classes built on top of this library's functional API, so existing code typically only needs an import change:

# Before
from http_sfv import Dictionary, List, Item, Token

# After
from http_sf.compat import Dictionary, List, Item, Token

The compat layer exposes the same .parse(bytes) / str(...) workflow, .value / .params attributes, structural list/dict behaviour, and Item equality semantics (compared by value, ignoring parameters) as http_sfv. New code should prefer the functional parse / ser API documented above.

Command Line Use

You can validate and examine the data model of a field value by calling the library on the command line, using -d, -l and -i to denote dictionaries, lists or items respectively; e.g.,

> python3 -m http_sf -i "foo;bar=baz"
[
    {
        "__type": "token",
        "value": "foo"
    },
    {
        "bar": {
            "__type": "token",
            "value": "baz"
        }
    }
]

or:

> python3 -m http_sf -i "foo;&bar=baz"
FAIL: Key does not begin with lcalpha or * at: &bar=baz

Alternatively, you can pass the field name with the -n option, provided that it is a compatible retrofit field:

> python3 -m http_sf -n "Cache-Control" "max-age=40, must-revalidate"
{
    "max-age": [
        40,
        {}
    ],
    "must-revalidate": [
        true,
        {}
    ]
}

Note that if successful, the output is in the JSON format used by the test suite.

Metadata

Release files for http-sf 1.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for http-sf 1.3.0
File Size Uploaded
http_sf-1.3.0.tar.gz 23.1 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for http-sf 1.3.0
File Interpreter ABI Platform
http_sf-1.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 45.4 kB

Release files / http_sf-1.3.0.tar.gz

Download URL http_sf-1.3.0.tar.gz
Size 23.1 kB
Tags Source
SHA-256 checksum
How to use checksums
95c2d0bdc756a61d46ca0993d7225ed6871a9329331b2fbc7a751fa82c62a1b3
BLAKE2b-256 checksum
How to use checksums
acaa2db087c98e3dd52474be6c42fc42d317944a95c9b515d3753442a88358cb
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 25, 2026.

Transparency log

Release files / http_sf-1.3.0-py3-none-any.whl

Download URL http_sf-1.3.0-py3-none-any.whl
Size 22.3 kB
Tags Python 3
SHA-256 checksum
How to use checksums
2b3e3130bb1b8ec2a2262a4651addff36cc06c05d514564e5fa3a9e500b4cc71
BLAKE2b-256 checksum
How to use checksums
c18f08d1dd69e8f8115fa95b96ca82ef02c7c6baa1dcd798e896e4926bf6808d
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/6.1.0 CPython/3.13.12

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on May 25, 2026.

Transparency log

Release history Release notifications | RSS feed

This release

1.3.0 This release

2 release files

1.2.1

2 release files

1.2.0

2 release files

1.1.1

2 release files

1.1.0

2 release files

1.0.7

2 release files

1.0.6

2 release files

1.0.5

2 release files

1.0.4

2 release files

1.0.3

2 release files

1.0.2

2 release files

1.0.1

2 release files

1.0.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page