Skip to content

Commit deca1c3

Browse files
authored
Remove forbidden HTTP1 headers even if no connection header is present (#311)
1 parent 326f7f9 commit deca1c3

File tree

4 files changed

+28
-7
lines changed

4 files changed

+28
-7
lines changed

Sources/NIOHPACK/HPACKHeader.swift

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,10 @@ public struct HPACKHeaders: ExpressibleByDictionaryLiteral {
3333
self.headers = httpHeaders.map { HPACKHeader(name: $0.name.lowercased(), value: $0.value) }
3434

3535
let connectionHeaderValue = httpHeaders[canonicalForm: "connection"]
36-
if !connectionHeaderValue.isEmpty {
37-
self.headers.removeAll { header in
38-
return HPACKHeaders.illegalHeaders.contains(header.name) ||
39-
connectionHeaderValue.contains(header.name[...])
40-
}
36+
37+
self.headers.removeAll { header in
38+
connectionHeaderValue.contains(header.name[...]) ||
39+
HPACKHeaders.illegalHeaders.contains(header.name)
4140
}
4241
} else {
4342
self.headers = httpHeaders.map { HPACKHeader(name: $0.name, value: $0.value) }

Sources/NIOHTTP2/HTTP2ToHTTP1Codec.swift

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -225,10 +225,10 @@ public final class HTTP2FramePayloadToHTTP1ClientCodec: ChannelInboundHandler, C
225225
}
226226

227227
public func write(context: ChannelHandlerContext, data: NIOAny, promise: EventLoopPromise<Void>?) {
228-
let responsePart = self.unwrapOutboundIn(data)
228+
let requestPart = self.unwrapOutboundIn(data)
229229

230230
do {
231-
let transformedPayload = try self.baseCodec.processOutboundData(responsePart, allocator: context.channel.allocator)
231+
let transformedPayload = try self.baseCodec.processOutboundData(requestPart, allocator: context.channel.allocator)
232232
context.write(self.wrapOutboundOut(transformedPayload), promise: promise)
233233
} catch {
234234
promise?.fail(error)

Tests/NIOHTTP2Tests/HTTP2FramePayloadToHTTP1CodecTests+XCTest.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ extension HTTP2FramePayloadToHTTP1CodecTests {
6060
("testWeDoNotNormalizeHeadersIfUserAskedUsNotToForRequests", testWeDoNotNormalizeHeadersIfUserAskedUsNotToForRequests),
6161
("testWeDoNotNormalizeHeadersIfUserAskedUsNotToForResponses", testWeDoNotNormalizeHeadersIfUserAskedUsNotToForResponses),
6262
("testWeStripIllegalHeadersAsWellAsTheHeadersNominatedByTheConnectionHeaderForRequests", testWeStripIllegalHeadersAsWellAsTheHeadersNominatedByTheConnectionHeaderForRequests),
63+
("testWeStripTransferEncodingChunkedHeader", testWeStripTransferEncodingChunkedHeader),
6364
("testWeStripIllegalHeadersAsWellAsTheHeadersNominatedByTheConnectionHeaderForResponses", testWeStripIllegalHeadersAsWellAsTheHeadersNominatedByTheConnectionHeaderForResponses),
6465
("testServerSideWithEmptyFinalPackage", testServerSideWithEmptyFinalPackage),
6566
("testClientSideWithEmptyFinalPackage", testClientSideWithEmptyFinalPackage),

Tests/NIOHTTP2Tests/HTTP2FramePayloadToHTTP1CodecTests.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -663,6 +663,27 @@ final class HTTP2FramePayloadToHTTP1CodecTests: XCTestCase {
663663
headers: expectedRequestHeaders,
664664
type: .request)
665665
}
666+
667+
func testWeStripTransferEncodingChunkedHeader() {
668+
let writeRecorder = FramePayloadWriteRecorder()
669+
XCTAssertNoThrow(try self.channel.pipeline.addHandler(writeRecorder).wait())
670+
XCTAssertNoThrow(try self.channel.pipeline.addHandler(HTTP2FramePayloadToHTTP1ClientCodec(httpProtocol: .https)).wait())
671+
672+
// A basic request.
673+
var requestHead = HTTPRequestHead(version: .init(major: 1, minor: 1), method: .POST, uri: "/post")
674+
requestHead.headers = HTTPHeaders([
675+
("host", "example.org"),
676+
("Transfer-Encoding", "chunked"),
677+
])
678+
self.channel.writeAndFlush(HTTPClientRequestPart.head(requestHead), promise: nil)
679+
680+
let expectedRequestHeaders = HPACKHeaders([(":path", "/post"), (":method", "POST"), (":scheme", "https"),
681+
(":authority", "example.org")])
682+
XCTAssertEqual(writeRecorder.flushedWrites.count, 1)
683+
writeRecorder.flushedWrites[0].assertHeadersFramePayload(endStream: false,
684+
headers: expectedRequestHeaders,
685+
type: .request)
686+
}
666687

667688
func testWeStripIllegalHeadersAsWellAsTheHeadersNominatedByTheConnectionHeaderForResponses() throws {
668689
let writeRecorder = FramePayloadWriteRecorder()

0 commit comments

Comments
 (0)