diff --git a/ChangeLog.md b/ChangeLog.md index f75f6c0..aaf1d42 100644 --- a/ChangeLog.md +++ b/ChangeLog.md @@ -1,4 +1,8 @@ +## 0.6.0.2 + +* Fix docker registry reverse proxying by preserving the 'Content-Length' response header to HTTP/2 and HEAD requests. [#45](https://github.com/fpco/http-reverse-proxy/pull/45) + ## 0.6.0.1 * Introduce a "semi cached body" to let the beginning of a request body be retried [#34](https://github.com/fpco/http-reverse-proxy/issues/34) diff --git a/Network/HTTP/ReverseProxy.hs b/Network/HTTP/ReverseProxy.hs index 5a00f74..ad82903 100644 --- a/Network/HTTP/ReverseProxy.hs +++ b/Network/HTTP/ReverseProxy.hs @@ -426,9 +426,12 @@ waiProxyToSettings getDest wps' manager req0 sendResponse = do (awaitForever (\bs -> yield (Chunk $ fromByteString bs) >> yield Flush)) (wpsProcessBody wps req $ const () <$> res) src = bodyReaderSource $ HC.responseBody res + noChunked = HT.httpMajor (WAI.httpVersion req) >= 2 || WAI.requestMethod req == HT.methodHead sendResponse $ WAI.responseStream (HC.responseStatus res) - (filter (\(key, _) -> not $ key `Set.member` strippedHeaders) $ HC.responseHeaders res) + (filter (\(key, v) -> not (key `Set.member` strippedHeaders) || + key == "content-length" && (noChunked || v == "0")) + (HC.responseHeaders res)) (\sendChunk flush -> runConduit $ src .| conduit .| CL.mapM_ (\mb -> case mb of Flush -> flush diff --git a/http-reverse-proxy.cabal b/http-reverse-proxy.cabal index 568a3d0..28952e0 100644 --- a/http-reverse-proxy.cabal +++ b/http-reverse-proxy.cabal @@ -1,5 +1,5 @@ name: http-reverse-proxy -version: 0.6.0.1 +version: 0.6.0.2 synopsis: Reverse proxy HTTP requests, either over raw sockets or with WAI description: Provides a simple means of reverse-proxying HTTP requests. The raw approach uses the same technique as leveraged by keter, whereas the WAI approach performs full request/response parsing via WAI and http-conduit. homepage: https://github.com/fpco/http-reverse-proxy