Metadata-Version: 2.4
Name: brotlicffi
Version: 1.2.1.0
Summary: Python CFFI bindings to the Brotli library
Home-page: https://github.com/python-hyper/brotlicffi
Author: Cory Benfield
Author-email: cory@lukasa.co.uk
License: MIT
Classifier: Programming Language :: Python :: Implementation :: CPython
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.8
Classifier: Programming Language :: Python :: 3.9
Classifier: Programming Language :: Python :: 3.10
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Programming Language :: Python :: 3.13
Classifier: Programming Language :: Python :: 3.14
Classifier: Programming Language :: Python :: Free Threading :: 2 - Beta
Requires-Python: >=3.8
License-File: LICENSE
Requires-Dist: cffi>=1.0.0; python_version < "3.13"
Requires-Dist: cffi>=1.17.0; python_version >= "3.13"
Dynamic: author
Dynamic: author-email
Dynamic: classifier
Dynamic: description
Dynamic: home-page
Dynamic: license
Dynamic: license-file
Dynamic: requires-dist
Dynamic: requires-python
Dynamic: summary

BrotliCFFI
==========

.. image:: https://img.shields.io/pypi/v/brotlicffi
    :alt: Version
    :target: https://pypi.org/project/brotlicffi

.. image:: https://img.shields.io/conda/vn/conda-forge/brotlicffi
    :alt: Version-Conda
    :target: https://anaconda.org/conda-forge/brotlicffi

.. image:: https://pepy.tech/badge/brotlicffi
    :alt: Downloads
    :target: https://pepy.tech/project/brotlicffi

.. image:: https://img.shields.io/github/workflow/status/python-hyper/brotlicffi/CI/master
    :alt: CI Status
    :target: https://github.com/python-hyper/brotlicffi/actions

This library contains Python CFFI bindings for the reference Brotli encoder/decoder,
`available here`_. This allows Python software to use the Brotli compression
algorithm directly from Python code.

Install from PyPI:

.. code-block::

    $ python -m pip install brotlicffi

Install from Conda:

.. code-block::

    $ conda install -c conda-forge brotlicffi

To use it simply, try this:

.. code-block:: python

    import brotlicffi
    data = brotlicffi.decompress(compressed_data)

More information can be found `in the documentation`_.

.. _available here: https://github.com/google/brotli
.. _in the documentation: https://brotlipy.readthedocs.org

Using BrotliCFFI in Projects
----------------------------

The API is 100% compatible with the `Brotli Python C bindings`_.
We recommend installing the C bindings on CPython and the CFFI
bindings everywhere else (PyPy, etc)

Essentially you use requirements like this:

 .. code-block:: python

    install_requires=[
        "brotli; platform_python_implementation == 'CPython'",
        "brotlicffi; platform_python_implementation != 'CPython'"
    ]

and then import the correct Brotli library like so:

 .. code-block:: python

    try:
        import brotlicffi as brotli
    except ImportError:
        import brotli

We provide an `example project`_ that shows how to use both
libraries together to support Brotli with multiple Python implementations.

.. _Brotli Python C bindings: https://pypi.org/project/Brotli
.. _example project: https://github.com/python-hyper/brotlipy/tree/master/example

License
-------

The source code of BrotliCFFI is available under the MIT license. Brotli itself
is made available under the Version 2.0 of the Apache Software License. See the
LICENSE and libbrotli/LICENSE files for more information.

Authors
-------

BrotliCFFI/brotlipy was authored by Cory Benfield and
is currently maintained by Seth Michael Larson.


Changelog
=========

1.2.1.0 (2026-10-21)
--------------------

- Upgraded libbrotli to v1.2.1, which remediates CVE-2026-111497, an
  out-of-bounds write that permits remote code execution.
- Changed one-shot ``decompress()`` and streaming ``Decompressor.process()`` /
  ``Decompressor.decompress()`` to raise ``brotlicffi.error`` for trailing bytes
  after a complete Brotli stream, including calls without an output limit.
  Previously tolerated input is now rejected, and any output produced during
  the failing call is discarded. This prevents infinite drain loops in
  streaming consumers.

1.2.0.2 (2026-08-21)
--------------------

- Fixed a bug where ``Decompressor.decompress()`` could leave stale
  unconsumed input behind after fully consuming a chunk of compressed
  data, causing subsequent calls to fail or re-process old data.
- Since cibuildwheel dropped support, this release does not include Python 3.8 wheels.

1.2.0.1 (2026-03-05)
--------------------

- Added support for the free-threaded build of Python 3.14.
- Concurrent sharing of Compressor or Decompressor objects
  now raises an exception.

1.2.0.0 (2025-11-21)
--------------------

- Upgraded libbrotli to v1.2.0.
- Added ``output_buffer_limit`` parameter to ``Decompressor.decompress()`` and
  ``Decompressor.process()`` methods to allow mitigation of unexpectedly large
  output. This addresses potential security concerns where maliciously crafted
  compressed data could result in excessive memory usage during decompression.


1.1.0.0 (2023-09-14)
--------------------

- Upgraded libbrotli to v1.1.0
- Added explicit support for Python 3.10, 3.11, and 3.12
- Removed support for Python 2.7, 3.5, and 3.6


1.0.9.2 (2021-04-06)
--------------------

- Added ``manylinux_aarch64`` wheels


1.0.9.1 (2021-01-27)
--------------------

- Avoid byte/string comparison warning in error message construction


1.0.9.0 (2021-01-20)
--------------------

- Updated to v1.0.9 of the Brotli library
- Library version now follows Brotli version
- Removed the ``dictionary`` parameter from ``compress`` and ``Compressor``
- **NOTE:** Python 2.7 wheels for Windows likely won't work until
  `google/brotli#848`_ is resolved

.. _google/brotli#848: https://github.com/google/brotli/issues/848

0.8.0 (2020-11-30)
------------------

- Renamed the package on PyPI to ``brotlicffi``, all further updates will be
  published to the new package. Using the ``brotlipy`` is deprecated.
- Changed the importable namespace from ``brotli`` to ``brotlicffi`` to no longer
  conflict with the ``Brotli`` PyPI package.
- Added ``process()`` method to ``Compressor`` and ``Decompressor``.
- Added ``is_finished()`` method to ``Decompressor``.

0.7.0 (2017-05-30)
------------------

- Update to v0.6.0 of the Brotli library.

0.6.0 (2016-09-08)
------------------

- Resolved a bug where ``decompress()`` would return an empty bytestring
  instead of erroring if the provided bytestring was small enough.
- Added the ``finish()`` method to the streaming decompressor.

0.5.1 (2016-08-17)
------------------

- Update to v0.5.2 of the Brotli library.
- Add new exception type (``Error``).
- Add compatibility with C++ brotli library by aliasing ``Error`` to ``error``.
- Extra error checking of input parameters to the compressor.

0.5.0 (2016-08-16)
------------------

- Update to v0.5.0 of the Brotli library.
- Extend one-shot compression API to include all control parameters.
- Added streaming/incremental compression API.
- Added flags to control compression mode.

0.4.0 (2016-08-01)
------------------

Update to v0.4.0 of the Brotli library.

0.3.0 (2016-05-11)
------------------

Update to v0.3.0 of the Brotli library.

0.2.0 (2015-10-05)
------------------

Fix broken ``brotli.compress`` support on Windows.

0.1.3 (2015-10-05)
------------------

- Added basic for ``brotli.compress`` through a C wrapper included in this
  library.
