You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何从asyncio流中获取选定的ALPN协议?

如何在asyncio流中获取选定的ALPN协议?

在使用asyncio编写HTTP客户端并配置ALPN后,直接访问writer.transport的私有属性(如_ssl_protocol、_sslobj)并不靠谱——这类下划线开头的属性属于Python内部实现,不同版本可能存在差异,导致代码不稳定。

正确的官方方案是利用SSLTransport提供的get_extra_info方法,获取底层的SSLSocket对象,再调用标准的selected_alpn_protocol()方法:

修改后的工作代码

import asyncio
import ssl

async def test_alpn():
    ctx = ssl.create_default_context()
    ctx.set_alpn_protocols(["http/1.1", "h2"])
    reader, writer = await asyncio.open_connection(
        'example.org', 443, ssl=ctx, server_hostname='example.org'
    )
    # 获取官方暴露的SSLSocket对象
    ssl_socket = writer.transport.get_extra_info('ssl_object')
    return ssl_socket.selected_alpn_protocol()

print(asyncio.run(test_alpn()))

注意事项

  • 该方法要求Python 3.7及以上版本,get_extra_info('ssl_object')是从这个版本开始正式支持的。
  • 确保在SSL握手完成后调用此方法,asyncio.open_connection完成时握手已经结束,所以直接调用没问题。

内容的提问来源于stack exchange,提问作者Adam Jenča

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.29 18:22:04