From 7977b838163dfd748dea69a7294672f214957cfa Mon Sep 17 00:00:00 2001 From: tanner0101 Date: Mon, 13 Apr 2020 16:26:05 -0400 Subject: [PATCH] don't re-add content-length header for HEAD request responses --- Sources/Vapor/HTTP/Server/HTTPServerHandler.swift | 4 +--- Sources/Vapor/HTTP/Server/HTTPServerResponseEncoder.swift | 5 +++-- Sources/Vapor/Response/Response.swift | 4 ++++ 3 files changed, 8 insertions(+), 5 deletions(-) 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 } }