in Sources/NIOHTTP2/HTTP2ToHTTP1Codec.swift [49:98]
mutating func processInboundData(_ data: HTTP2Frame.FramePayload) throws -> (first: HTTPClientResponsePart?, second: HTTPClientResponsePart?) {
switch data {
case .headers(let headerContent):
switch try self.headerStateMachine.newHeaders(block: headerContent.headers) {
case .trailer:
return (first: .end(HTTPHeaders(regularHeadersFrom: headerContent.headers)), second: nil)
case .informationalResponseHead:
return (first: .head(try HTTPResponseHead(http2HeaderBlock: headerContent.headers)), second: nil)
case .finalResponseHead:
guard let outgoingHTTP1RequestHead = outgoingHTTP1RequestHead else {
preconditionFailure("Expected not to get a response without having sent a request")
}
self.outgoingHTTP1RequestHead = nil
let respHead = try HTTPResponseHead(
http2HeaderBlock: headerContent.headers,
requestHead: outgoingHTTP1RequestHead,
endStream: headerContent.endStream
)
let first = HTTPClientResponsePart.head(respHead)
var second: HTTPClientResponsePart? = nil
if headerContent.endStream {
second = .end(nil)
}
return (first: first, second: second)
case .requestHead:
preconditionFailure("A client can not receive request heads")
}
case .data(let content):
guard case .byteBuffer(let b) = content.data else {
preconditionFailure("Received DATA frame with non-bytebuffer IOData")
}
var first = HTTPClientResponsePart.body(b)
var second: HTTPClientResponsePart? = nil
if content.endStream {
if b.readableBytes == 0 {
first = .end(nil)
} else {
second = .end(nil)
}
}
return (first: first, second: second)
case .alternativeService, .rstStream, .priority, .windowUpdate, .settings, .pushPromise, .ping, .goAway, .origin:
// These don't have an HTTP/1 equivalent, so let's drop them.
return (first: nil, second: nil)
}
}