如何从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
相关产品推荐
相关产品推荐

