Work around dream-encoding footgun

Dream-encoding adds a Transfer-Encoding header to a response. If that
response is an error code it will go through the error handler which may
change the response - but the new response *does not* go through the
dream-encoding middleware! This means we may rewrite the response with a
plaintext message but still have the Transfer-Encoding header! This
makes clients very unhappy.
This commit is contained in:
Reynir Björnsson 2025-01-24 13:56:57 +01:00
parent 713912071e
commit 4e74c8d25f
2 changed files with 14 additions and 2 deletions

View file

@ -797,7 +797,19 @@ let error_template error _debug_info suggested_response =
in
Dream.set_header suggested_response "Content-Type" Dream.text_html;
Dream.set_body suggested_response @@ string_of_html html;
Lwt.return suggested_response
(* NOTE: this does the same job as the dream-encoding middleware;
the middleware is not triggered in error templates *)
let preferred_algorithm =
Option.bind error.request
Dream_encoding.preferred_content_encoding
in
begin match preferred_algorithm with
| Some algorithm ->
let+ body = Dream.body suggested_response in
Dream_encoding.with_encoded_body body ~algorithm suggested_response
| None ->
Lwt.return suggested_response
end
| _ ->
Lwt.return suggested_response

View file

@ -2,4 +2,4 @@
(name builder_web)
(libraries builder builder_db dream tyxml bos duration ohex caqti-lwt
opamdiff ptime.clock.os cmarkit tar tar.gz tar-unix owee solo5-elftool decompress.de
decompress.gz uri digestif))
decompress.gz uri digestif dream-encoding))