[pbs-devel] [PATCH proxmox v5 0/5] Teach HTTP client how to decode deflate

Maximiliano Sandoval m.sandoval at proxmox.com
Fri Jul 5 15:04:27 CEST 2024


This patch series adds support for decoding HTTP requests if they contain the
Content-Encoding=deflate header. Deciding on a public API (and implementing it)
to set this header is out-of-scope for this merge request a the moment of
writing 🙈.

Note that currently the proxmox-rest-server replies with deflated replies in the
following functions:

- handle_api_request: Called as part of Formated::handle_request and
  H2Service::handle_request. Always compresses if the client declares that
  supports deflate.
- handle_unformatted_api_request: Called as part of Unformatted::handle_request.
  It decides whether to compress the contents same as before
- simple_static_file_download: Called as part of handle_static_file_download
  which is called in ApiConfig::handle_request, this one decides whether to
  compress based on the fn extension_to_content_type which is a map
  format:should-be-compressed and whether the clients supports it.
- chunked_static_file_download is called as part of handle_static_file_downloda
  same as before

One thing that might be worth pointing out is that according to [1], when the
client supports `Accept-Encoding=deflate`, the HTTP server can reply with
`Content-Encoding=deflate` and encode the body using zlib, which means that it
should be encoded with deflate with the zlib headers included. This is somewhat
confusing but in short it means that one should use a zlib encoder rather than a
deflate encoder. At the moment the server always compresses using deflate
without the zlib headers, not a zlib encoder.

[1] https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Accept-Encoding#deflate

Differences from v4:
 - Rebased

Differences from v3:
 - Make deflate module private instead of pub(crate)

Differences from v2:
 - Split into multiple commits
 - More tests
 - Add builders for DeflateEndoder and DeflateDecoder
 - Both the deflate encoder and decoder where moved into a folder

Maximiliano Sandoval (5):
  compression: deflate: move encoder into a mod
  compression: deflate: add builder pattern
  compression: deflate: add a decoder
  compression: deflate: add test module
  http: teach the Client how to decode deflate content

 proxmox-compression/Cargo.toml                |   3 +-
 .../src/{ => deflate}/compression.rs          |  59 +++++--
 .../src/deflate/decompression.rs              | 141 +++++++++++++++
 proxmox-compression/src/deflate/mod.rs        | 167 ++++++++++++++++++
 proxmox-compression/src/lib.rs                |   4 +-
 proxmox-compression/src/zip.rs                |   2 +-
 proxmox-http/Cargo.toml                       |   7 +
 proxmox-http/src/client/simple.rs             |  65 ++++++-
 8 files changed, 430 insertions(+), 18 deletions(-)
 rename proxmox-compression/src/{ => deflate}/compression.rs (83%)
 create mode 100644 proxmox-compression/src/deflate/decompression.rs
 create mode 100644 proxmox-compression/src/deflate/mod.rs

-- 
2.39.2





More information about the pbs-devel mailing list