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:
parent
713912071e
commit
4e74c8d25f
2 changed files with 14 additions and 2 deletions
|
@ -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
|
||||
|
||||
|
|
2
lib/dune
2
lib/dune
|
@ -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))
|
||||
|
|
Loading…
Reference in a new issue