[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]
[tor-commits] [meek/master] Use Clone to make copies of http.DefaultTransport.
commit bc887de694bc2d2381af099d5c38f0e9efd76c4b
Author: David Fifield <david@xxxxxxxxxxxxxxx>
Date: Wed Apr 29 13:22:07 2020 -0600
Use Clone to make copies of http.DefaultTransport.
Clone is new in go1.13.
https://github.com/golang/go/issues/26013
---
meek-client/meek-client.go | 2 +-
meek-client/utls.go | 28 +++-------------------------
2 files changed, 4 insertions(+), 26 deletions(-)
diff --git a/meek-client/meek-client.go b/meek-client/meek-client.go
index f520a60..3431b53 100644
--- a/meek-client/meek-client.go
+++ b/meek-client/meek-client.go
@@ -82,7 +82,7 @@ const (
// We use this RoundTripper to make all our requests when neither --helper nor
// utls is in effect. We use the defaults, except we take control of the Proxy
// setting (notably, disabling the default ProxyFromEnvironment).
-var httpRoundTripper *http.Transport = http.DefaultTransport.(*http.Transport)
+var httpRoundTripper *http.Transport = http.DefaultTransport.(*http.Transport).Clone()
// We use this RoundTripper when --helper is in effect.
var helperRoundTripper = &HelperRoundTripper{
diff --git a/meek-client/utls.go b/meek-client/utls.go
index 66b1a93..576eb26 100644
--- a/meek-client/utls.go
+++ b/meek-client/utls.go
@@ -39,7 +39,6 @@ import (
"net"
"net/http"
"net/url"
- "reflect"
"strings"
"sync"
@@ -48,25 +47,6 @@ import (
"golang.org/x/net/proxy"
)
-// Copy the public fields (fields for which CanSet is true) from src to dst.
-// src and dst must be pointers to the same type. We use this to make copies of
-// httpRoundTripper. We cannot use struct assignment, because http.Transport
-// contains private mutexes. The idea of using reflection to copy only the
-// public fields comes from a post by Nick Craig-Wood:
-// https://groups.google.com/d/msg/Golang-Nuts/SDiGYNVE8iY/89hRKTF4BAAJ
-func copyPublicFields(dst, src interface{}) {
- if reflect.TypeOf(dst) != reflect.TypeOf(src) {
- panic("unequal types")
- }
- dstValue := reflect.ValueOf(dst).Elem()
- srcValue := reflect.ValueOf(src).Elem()
- for i := 0; i < dstValue.NumField(); i++ {
- if dstValue.Field(i).CanSet() {
- dstValue.Field(i).Set(srcValue.Field(i))
- }
- }
-}
-
// Extract a host:port address from a URL, suitable for passing to net.Dial.
func addrForDial(url *url.URL) (string, error) {
host := url.Hostname()
@@ -264,9 +244,8 @@ func makeRoundTripper(url *url.URL, clientHelloID *utls.ClientHelloID, cfg *utls
default:
// With http.Transport, copy important default fields from
// http.DefaultTransport, such as TLSHandshakeTimeout and
- // IdleConnTimeout.
- tr := &http.Transport{}
- copyPublicFields(tr, httpRoundTripper)
+ // IdleConnTimeout, before overriding DialTLS.
+ tr := httpRoundTripper.Clone()
tr.DialTLS = dialTLS
return tr, nil
}
@@ -310,8 +289,7 @@ func NewUTLSRoundTripper(name string, cfg *utls.Config, proxyURL *url.URL) (http
// This special-case RoundTripper is used for HTTP requests, which don't
// use uTLS but should use the specified proxy.
- httpRT := &http.Transport{}
- copyPublicFields(httpRT, httpRoundTripper)
+ httpRT := httpRoundTripper.Clone()
httpRT.Proxy = http.ProxyURL(proxyURL)
return &UTLSRoundTripper{
_______________________________________________
tor-commits mailing list
tor-commits@xxxxxxxxxxxxxxxxxxxx
https://lists.torproject.org/cgi-bin/mailman/listinfo/tor-commits