hyper icon indicating copy to clipboard operation
hyper copied to clipboard

HTTP11Connection does not use http/1.1 protocol

Open nqbao opened this issue 6 years ago • 1 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.

nqbao avatar Dec 10 '19 18:12 nqbao

I found the issue: if we don't supply the ssl context, it will use the default ssl context, which use h2 by default: https://github.com/python-hyper/hyper/blob/bc0738bdf7afdc1236e8154868352b58850fdf1a/hyper/tls.py#L114

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?

nqbao avatar Dec 10 '19 20:12 nqbao