diff --git a/src/go.sum b/src/go.sum index aeadce5..fcef8ae 100644 --- a/src/go.sum +++ b/src/go.sum @@ -669,8 +669,6 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= @@ -941,8 +939,6 @@ golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA= golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= diff --git a/src/mod/dynamicproxy/dpcore/dpcore.go b/src/mod/dynamicproxy/dpcore/dpcore.go index 14a425e..cef1f9d 100644 --- a/src/mod/dynamicproxy/dpcore/dpcore.go +++ b/src/mod/dynamicproxy/dpcore/dpcore.go @@ -2,7 +2,6 @@ package dpcore import ( "context" - "crypto/tls" "errors" "io" "log" @@ -12,8 +11,8 @@ import ( "strings" "time" - "golang.org/x/net/http2" "imuslab.com/zoraxy/mod/dynamicproxy/domainsniff" + "imuslab.com/zoraxy/mod/dynamicproxy/modh2c" "imuslab.com/zoraxy/mod/dynamicproxy/permissionpolicy" ) @@ -104,14 +103,6 @@ func NewDynamicProxyCore(target *url.URL, prepender string, dpcOptions *DpcoreOp } thisTransporter := http.DefaultTransport - if dpcOptions.UseH2CRoundTripper { - thisTransporter = &http2.Transport{ - DialTLS: func(network, addr string, cfg *tls.Config) (net.Conn, error) { - return net.Dial(network, addr) - }, - AllowHTTP: true, - } - } //Hack the default transporter to handle more connections optimalConcurrentConnection := 32 @@ -121,13 +112,17 @@ func NewDynamicProxyCore(target *url.URL, prepender string, dpcOptions *DpcoreOp thisTransporter.(*http.Transport).MaxConnsPerHost = optimalConcurrentConnection * 2 thisTransporter.(*http.Transport).DisableCompression = true - //TODO: Add user adjustable timeout option here - if dpcOptions.IgnoreTLSVerification { //Ignore TLS certificate validation error thisTransporter.(*http.Transport).TLSClientConfig.InsecureSkipVerify = true } + //TODO: Add user adjustable timeout option here + if dpcOptions.UseH2CRoundTripper { + //Use H2C RoundTripper for HTTP/2.0 connection + thisTransporter = modh2c.NewH2CRoundTripper() + } + return &ReverseProxy{ Director: director, Prepender: prepender, diff --git a/src/mod/dynamicproxy/modh2c/modh2c.go b/src/mod/dynamicproxy/modh2c/modh2c.go new file mode 100644 index 0000000..8bf005b --- /dev/null +++ b/src/mod/dynamicproxy/modh2c/modh2c.go @@ -0,0 +1,45 @@ +package modh2c + +/* + modh2c.go + + This module is a simple h2c roundtripper for dpcore +*/ + +import ( + "context" + "crypto/tls" + "net" + "net/http" + "time" + + "golang.org/x/net/http2" +) + +type H2CRoundTripper struct { +} + +func NewH2CRoundTripper() *H2CRoundTripper { + return &H2CRoundTripper{} +} + +// Example from https://github.com/thrawn01/h2c-golang-example/blob/master/cmd/client/main.go +func (h2c *H2CRoundTripper) RoundTrip(req *http.Request) (*http.Response, error) { + ctx, cancel := context.WithTimeout(context.Background(), time.Second*10) + defer cancel() + + req, err := http.NewRequestWithContext(ctx, req.Method, req.RequestURI, nil) + if err != nil { + return nil, err + } + + tr := &http2.Transport{ + AllowHTTP: true, + DialTLSContext: func(ctx context.Context, network, addr string, cfg *tls.Config) (net.Conn, error) { + var d net.Dialer + return d.DialContext(ctx, network, addr) + }, + } + + return tr.RoundTrip(req) +}