diff --git a/Sources/Vapor/HTTP/Server/HTTPServerHandler.swift b/Sources/Vapor/HTTP/Server/HTTPServerHandler.swift index 17435f294e..0394ea8909 100644 --- a/Sources/Vapor/HTTP/Server/HTTPServerHandler.swift +++ b/Sources/Vapor/HTTP/Server/HTTPServerHandler.swift @@ -19,11 +19,9 @@ final class HTTPServerHandler: ChannelInboundHandler, RemovableChannelHandler { case .failure(let error): self.errorCaught(context: context, error: error) case .success(let response): - let contentLength = response.headers.first(name: .contentLength) if request.method == .HEAD { - response.body = .init() + response.forHeadRequest = true } - response.headers.replaceOrAdd(name: .contentLength, value: contentLength ?? "0") self.serialize(response, for: request, context: context) } } diff --git a/Sources/Vapor/HTTP/Server/HTTPServerResponseEncoder.swift b/Sources/Vapor/HTTP/Server/HTTPServerResponseEncoder.swift index a06e572cd5..17f9ae33b9 100644 --- a/Sources/Vapor/HTTP/Server/HTTPServerResponseEncoder.swift +++ b/Sources/Vapor/HTTP/Server/HTTPServerResponseEncoder.swift @@ -31,8 +31,9 @@ final class HTTPServerResponseEncoder: ChannelOutboundHandler, RemovableChannelH headers: response.headers ))), promise: nil) - if response.status == .noContent { - // don't send bodies for 204 (no content) requests + if response.status == .noContent || response.forHeadRequest { + // don't send bodies for 204 (no content) responses + // or HEAD requests context.writeAndFlush(self.wrapOutboundOut(.end(nil)), promise: promise) } else { switch response.body.storage { diff --git a/Sources/Vapor/Response/Response.swift b/Sources/Vapor/Response/Response.swift index 8dc4d359b4..fa02aa6637 100644 --- a/Sources/Vapor/Response/Response.swift +++ b/Sources/Vapor/Response/Response.swift @@ -32,6 +32,9 @@ public final class Response: CustomStringConvertible { didSet { self.headers.updateContentLength(self.body.count) } } + // If `true`, don't serialize the body. + var forHeadRequest: Bool + internal enum Upgrader { case webSocket(maxFrameSize: WebSocketMaxFrameSize, onUpgrade: (WebSocket) -> ()) } @@ -134,6 +137,7 @@ public final class Response: CustomStringConvertible { self.headers = headers self.body = body self.storage = .init() + self.forHeadRequest = false } }