| // Copyright 2024 The Go Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style |
| // license that can be found in the LICENSE file. |
| |
| package http2 |
| |
| import ( |
| "crypto/tls" |
| "errors" |
| "net" |
| ) |
| |
| const nextProtoUnencryptedHTTP2 = "unencrypted_http2" |
| |
| // unencryptedNetConnFromTLSConn retrieves a net.Conn wrapped in a *tls.Conn. |
| // |
| // TLSNextProto functions accept a *tls.Conn. |
| // |
| // When passing an unencrypted HTTP/2 connection to a TLSNextProto function, |
| // we pass a *tls.Conn with an underlying net.Conn containing the unencrypted connection. |
| // To be extra careful about mistakes (accidentally dropping TLS encryption in a place |
| // where we want it), the tls.Conn contains a net.Conn with an UnencryptedNetConn method |
| // that returns the actual connection we want to use. |
| func unencryptedNetConnFromTLSConn(tc *tls.Conn) (net.Conn, error) { |
| conner, ok := tc.NetConn().(interface { |
| UnencryptedNetConn() net.Conn |
| }) |
| if !ok { |
| return nil, errors.New("http2: TLS conn unexpectedly found in unencrypted handoff") |
| } |
| return conner.UnencryptedNetConn(), nil |
| } |