Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

net/http: http.Transport Clone() bug #52713

Closed
TelephoneTan opened this issue May 4, 2022 · 3 comments
Closed

net/http: http.Transport Clone() bug #52713

TelephoneTan opened this issue May 4, 2022 · 3 comments

Comments

@TelephoneTan
Copy link

What version of Go are you using (go version)?

$ go version
go version go1.18.1 windows/amd64

Does this issue reproduce with the latest release?

yes

What operating system and processor architecture are you using (go env)?

go env Output
$ go env
set GO111MODULE=on
set GOARCH=amd64
set GOBIN=
set GOCACHE=C:\Users\Terry\AppData\Local\go-build
set GOENV=C:\Users\Terry\AppData\Roaming\go\env
set GOEXE=.exe
set GOEXPERIMENT=
set GOFLAGS=
set GOHOSTARCH=amd64
set GOHOSTOS=windows
set GOINSECURE=
set GOMODCACHE=C:\Users\Terry\go\pkg\mod
set GONOPROXY=
set GONOSUMDB=
set GOOS=windows
set GOPATH=C:\Users\Terry\go
set GOPRIVATE=
set GOPROXY=https://goproxy.io,direct
set GOROOT=C:\Users\Terry\go\go1.18.1
set GOSUMDB=sum.golang.org
set GOTMPDIR=
set GOTOOLDIR=C:\Users\Terry\go\go1.18.1\pkg\tool\windows_amd64
set GOVCS=
set GOVERSION=go1.18.1
set GCCGO=gccgo
set GOAMD64=v1
set AR=ar
set CC=gcc
set CXX=g++
set CGO_ENABLED=1
set GOMOD=C:\Code\GUETCourseTable\Server-Go\go.mod
set GOWORK=
set CGO_CFLAGS=-g -O2
set CGO_CPPFLAGS=
set CGO_CXXFLAGS=-g -O2
set CGO_FFLAGS=-g -O2
set CGO_LDFLAGS=-g -O2
set PKG_CONFIG=pkg-config
set GOGCCFLAGS=-m64 -mthreads -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=C:\Users\Terry\AppData\Local\Temp\go-build306232544=/tmp/go-build -gno-record-gcc-switches

What did you do?

Clone http.DefaultTransport then disable HTTP/2 on it.

https://go.dev/play/p/LTKzma-H3fm

What did you expect to see?

Success

What did you see instead?

Fail Get "https://cas.guet.edu.cn": net/http: HTTP/1.x transport connection broken: malformed HTTP response "\x00\x00\x12\x04\x00\x00\x00\x00\x00\x00\x03\x00\x00\x00\x80\x00\x04\x00\x01\x00\x00\x00\x05\x00\xff\xff\xff\x00\x00\x04\b\x00\x00\x00\x00\x00\u007f\xff\x00\x00\x00\x00\b\a\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x01"
@TelephoneTan
Copy link
Author

I am pretty sure it's not proxy issue. I have set Transport.Proxy to nil.

@TelephoneTan
Copy link
Author

TelephoneTan commented May 4, 2022

t.nextProtoOnce.Do(t.onceSetNextProtoDefaults)

It seems this line will cause the auto-generated TLSClientConfig of the old Transport to be cloned into the new one, further leading to unexpected behavior.

For example, the old Transport has some auto-generated TLSClientConfig for HTTP/2, then it's cloned, the new one has the same TLSClientConfig value as the old one. Later, user changes the TLSNextProto field of the new one to an empty map in order to disable HTTP/2 on the new one, but the TLSClientConfig field of the new one doesn't adapt to the new TLSNextProto value because the TLSClientConfig field of Transport type seems designed to be one-shot initialized, then mistakes happen.

Is this a bug, or did i miss something? @bradfitz

@seankhliao
Copy link
Member

Duplicate of #39302

@seankhliao seankhliao marked this as a duplicate of #39302 May 4, 2022
@golang golang locked and limited conversation to collaborators May 4, 2023
Sign up for free to subscribe to this conversation on GitHub. Already have an account? Sign in.
Projects
None yet
Development

No branches or pull requests

3 participants