Skip to content

feat: Add request body compression with optional brotli#927

Open
mixalturek wants to merge 7 commits into
masterfrom
brotli-compression
Open

feat: Add request body compression with optional brotli#927
mixalturek wants to merge 7 commits into
masterfrom
brotli-compression

Conversation

@mixalturek

@mixalturek mixalturek commented Jul 8, 2026

Copy link
Copy Markdown
  • https://github.com/apify/apify-core/pull/28971 added support for brotli compression to BE.
  • Pros: higher compression, cons: more CPU intensive.
  • The brotli dependencies are defined as optional, one has to explicitly enable it and choose one. If none is available, the code falls back to gzip.
  • JS client doesn't compress requests that are too small, this Python client compresses just everything. No change done, I only noticed and stating it.

Related PRs

@codecov

codecov Bot commented Jul 8, 2026

Copy link
Copy Markdown

Codecov Report

❌ Patch coverage is 84.61538% with 2 lines in your changes missing coverage. Please review.
✅ Project coverage is 94.54%. Comparing base (7f61a10) to head (28f34e2).
⚠️ Report is 15 commits behind head on master.

Files with missing lines Patch % Lines
src/apify_client/http_clients/_base.py 84.61% 2 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff             @@
##           master     #927      +/-   ##
==========================================
- Coverage   94.54%   94.54%   -0.01%     
==========================================
  Files          48       48              
  Lines        5100     5130      +30     
==========================================
+ Hits         4822     4850      +28     
- Misses        278      280       +2     
Flag Coverage Δ
integration 92.88% <69.23%> (-0.04%) ⬇️
unit 83.43% <84.61%> (+0.05%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@mixalturek mixalturek force-pushed the brotli-compression branch 2 times, most recently from 49bf689 to aabd87c Compare July 8, 2026 10:05
- apify/apify-core#28971 added support for brotli compression to BE.
- Pros: higher compression, cons: more CPU intensive.
- The brotli dependencies are defined as optional, one has to explicitly enable it and choose one. If none is available, the code falls back to gzip.
- JS client doesn't compress requests that are too small, this Python client compresses just everything. No change done, I only noticed and stating it.
Comment thread src/apify_client/http_clients/_base.py
Comment thread src/apify_client/http_clients/_base.py Outdated
Comment thread tests/unit/test_http_clients.py Outdated
Comment thread tests/unit/test_run_charge.py Outdated
Comment thread pyproject.toml Outdated
Comment thread README.md
Comment thread pyproject.toml Outdated
Comment thread tests/unit/test_run_charge.py Outdated
Comment thread pyproject.toml Outdated
@vdusek vdusek requested a review from Pijukatel July 8, 2026 13:36
@vdusek

vdusek commented Jul 8, 2026

Copy link
Copy Markdown
Contributor

This has a significant impact. @Pijukatel, please check it as well.

- Remove `brotlicffi`, only CPython runtime is supported.
- Add a test with bytearray as an input. This would break only in `brotlicffi`, which is no longer in the dependencies. `brotli` dependency handles it correctly and doesn't throw.
- Add `brotli` to dev dependencies and use it directly in tests.
mixalturek added a commit to apify/apify-client-js that referenced this pull request Jul 8, 2026
- apify/apify-client-python#927 (comment)
- The default was 11 (max). Now it uses quality 6 - roughly 2–4× faster with only a modest increase in compressed size.
@mixalturek

Copy link
Copy Markdown
Author

@vdusek Nearly all comments are fixed now, thanks again for your great review.

One more thing: I forgot to mention that the JS client skips compression if the payload size is below 1024 B. Do we want to apply it to the Python client as well?

mixalturek added a commit to apify/apify-client-js that referenced this pull request Jul 8, 2026
- apify/apify-client-python#927 (comment)
- The default was 11 (max). Now it uses quality 6 - roughly 2–4× faster with only a modest increase in compressed size.
mixalturek added a commit to apify/apify-client-js that referenced this pull request Jul 8, 2026
- apify/apify-client-python#927 (comment)
- The default was 11 (max). Now it uses quality 6 - roughly 2–4× faster with only a modest increase in compressed size.
@vdusek

vdusek commented Jul 9, 2026

Copy link
Copy Markdown
Contributor

One more thing: I forgot to mention that the JS client skips compression if the payload size is below 1024 B. Do we want to apply it to the Python client as well?

Thanks for noticing. I opened an issue for that: #934. Let's resolve it in a separate PR so it is documented in the changelog.

@Pijukatel Pijukatel left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Not sure about the non-default compression quality , but it is not blocking for me.

Comment thread README.md

@vdusek vdusek left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I removed brotli from the dev dependency group. Sorry, my previous comment wasn't entirely correct. We run uv sync --all-extras everywhere in CI, so there's no need to include it there. The initial mypy/ty override ignores confused me, but they were probably added based on your local setup, where you didn't have the brotli extra installed.

Other than that, one more thing: the documentation 🙂.

Please extend the installation section in the docs here: https://docs.apify.com/api/client/python/docs#installation. You can use a similar section to the one you added to the README.

Also, please create a new concept page for compression. Something like: explaining HTTP compression, how to switch between compression methods, and the pros and cons of each approach.

@vdusek vdusek changed the title feat: Compress requests using brotli algo feat: Add request body compression with optional brotli Jul 9, 2026
@mixalturek mixalturek requested a review from szaganek as a code owner July 9, 2026 11:31
mixalturek added a commit to apify/apify-client-js that referenced this pull request Jul 9, 2026
- apify/apify-core#28971 added support for
brotli compression to BE.
- Pros: higher compression, cons: more CPU intensive.
- The code could be running on too old Node.js, so brotli compression is
applied only if possible; the code otherwise falls back to gzip. Too
small payloads and unsupported types are still not compressed - no
change.

### Related PRs
- apify/apify-core#28971
- apify/apify-docs#2750
- #962
- apify/apify-client-python#927
- apify/apify-sdk-python#1031
mixalturek added a commit to apify/apify-docs that referenced this pull request Jul 9, 2026
- apify/apify-core#28971 added support for
brotli compression to BE.
- Key value store endpoints didn't support it recently. I guess this was
a bug in doc, but it's all good now :-)
- Dataset items endpoints support it as well now.
- I put brotli at the beginning of the lists, it should be the first
choice whenever possible.

### Related PRs
- apify/apify-core#28971
- #2750
- apify/apify-client-js#962
- apify/apify-client-python#927
- apify/apify-sdk-python#1031
@mixalturek mixalturek requested a review from vdusek July 9, 2026 11:46
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants