swift - 为什么 Swift NIO 示例使用 HTTP/2 到 HTTP/1 协议(protocol)转换?

标签 swift http2 swift-nio

HTTP2ToHTTP1ServerCodec 的用途是什么。为什么需要将 HTTP/2 协议(protocol)转换为 HTTP/1 协议(protocol)?

channel.configureHTTP2Pipeline(mode: .server) { (streamChannel, streamID) -> EventLoopFuture<Void> in
    // For every HTTP/2 stream that the client opens, we put in the `HTTP2ToHTTP1ServerCodec` which
    // transforms the HTTP/2 frames to the HTTP/1 messages from the `NIOHTTP1` module.
    streamChannel.pipeline.addHandler(HTTP2ToHTTP1ServerCodec(streamID: streamID)).flatMap { () -> EventLoopFuture<Void> in
        // And lastly, we put in our very basic HTTP server :).
        streamChannel.pipeline.addHandler(HTTPServer())

这是修改后的 code snippet来自 Swift NIO 示例存储库。

最佳答案

HTTP/2 是在单个 TCP 连接(和新的有线协议(protocol))中的多个流上的 HTTP(/1) 语义。作为一个选项,SwiftNIO 因此可以允许您使用 HTTP(/1) 数据类型来处理 HTTP/2。这允许您完全重用您使用 SwiftNIO 和 HTTP/1 为 HTTP/2 编写的服务器/客户端实现,这对大多数人来说都是一个好处。

然而,该翻译绝对不是必需的。如果您更喜欢在 HTTP2 frames 上操作直接,您不需要将 HTTP2ToHTTP1ServerCodec 添加到您的管道。


稍后编辑:我还应该指出 HTTP2toHTTP1ServerCodec 实际上是一段非常简单的代码,它只是翻译 HTTP/2 帧之间的入站和出站消息和 HTTP/1 消息部分。 Code is here .

关于swift - 为什么 Swift NIO 示例使用 HTTP/2 到 HTTP/1 协议(protocol)转换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57574726/

相关文章:

curl - 如何从代码中禁用服务器 key 交换?

http2 - 我可以通过 STDIN/STDOUT 说 HTTP/2 吗?

swift - 使用 async-http-client 进行摘要式身份验证

swift - 按字母顺序键将数组插入 swift 字典

iOS 8 Swift 导航栏标题,按钮未显示在基于选项卡的应用程序中

ios - Swift 搜索栏( Controller )内存泄漏

ios - 从 swift 4.0 到 swift 4.1 崩溃

server - HTTP/2 服务器推送和浏览器缓存

swift - 在继续之前获取 [EventLoopF​​uture] 的所有值