mutating func processInboundData()

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)
        }
    }