python-hyper / hyper

HTTP/2 for Python.

Home Page:http://hyper.rtfd.org/en/latest/

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

HTTP11Connection does not use http/1.1 protocol

nqbao opened this issue · comments

Sample code

try:
    conn = HTTP11Connection('www.cloudflare.com:443', secure=True)
    req = conn.request('GET', '/')
    rep = conn.get_response()  # <-- this will raise TLSUpgrade exception
except Exception as ex:
    print(ex.negotiated)   # <-- this will print h2

Expected behavior is to use http/1.1 protocol.

I found the issue: if we don't supply the ssl context, it will use the default ssl context, which use h2 by default:

with ignore_missing():

The only way to force http/1.1 is to supply your own ssl context like below:

from hyper.tls import init_context

ssl_context = init_context()
ssl_context.set_alpn_protocols(["http/1.1"])

try:
    conn = HTTP11Connection('www.cloudflare.com:443', secure=True, ssl_context=ssl_context)
    req = conn.request('GET', '/')
    rep = conn.get_response()  # now it works
except Exception as ex:
    print(ex)   # <-- this will print h2

I think HTTP11Connection should works without providing the ssl context. One way to fix this is to have another ssl context for HTTP11Connection. What do you think?