Skip to content

Commit 85c5c69

Browse files
authored
Merge pull request #72 from netlify/disable_h2_post
Disable H2 for retryable requests.
2 parents 03902f6 + 65ae820 commit 85c5c69

File tree

2 files changed

+64
-5
lines changed

2 files changed

+64
-5
lines changed

go/porcelain/http/http.go

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,8 @@
11
package http
22

33
import (
4+
"crypto/tls"
5+
"net"
46
"net/http"
57
"strconv"
68
"time"
@@ -9,6 +11,8 @@ import (
911
"github.com/go-openapi/runtime"
1012
)
1113

14+
var DefaultTransport = httpTransport()
15+
1216
type RetryableTransport struct {
1317
tr runtime.ClientTransport
1418
attempts int
@@ -35,7 +39,7 @@ func (t *RetryableTransport) Submit(op *runtime.ClientOperation) (interface{}, e
3539

3640
transport := client.Transport
3741
if transport == nil {
38-
transport = http.DefaultTransport
42+
transport = DefaultTransport
3943
}
4044
client.Transport = &retryableRoundTripper{
4145
tr: transport,
@@ -95,3 +99,22 @@ func delayWithRateLimit(resp *http.Response, cancel <-chan struct{}) bool {
9599
return false
96100
}
97101
}
102+
103+
func httpTransport() *http.Transport {
104+
protoUpgrade := map[string]func(string, *tls.Conn) http.RoundTripper{
105+
"ignore-h2": func(string, *tls.Conn) http.RoundTripper { return nil },
106+
}
107+
108+
return &http.Transport{
109+
Proxy: http.ProxyFromEnvironment,
110+
DialContext: (&net.Dialer{
111+
Timeout: 30 * time.Second,
112+
KeepAlive: 30 * time.Second,
113+
}).DialContext,
114+
MaxIdleConns: 100,
115+
IdleConnTimeout: 90 * time.Second,
116+
TLSHandshakeTimeout: 10 * time.Second,
117+
ExpectContinueTimeout: 1 * time.Second,
118+
TLSNextProto: protoUpgrade,
119+
}
120+
}

go/porcelain/http/http_test.go

Lines changed: 40 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ func TestRetryableTransport(t *testing.T) {
2525
reset := fmt.Sprintf("%d", time.Now().Add(1*time.Second).Unix())
2626
rw.Header().Set("X-RateLimit-Reset", reset)
2727
rw.WriteHeader(http.StatusTooManyRequests)
28-
_, _ = rw.Write([]byte("rate limited"))
28+
rw.Write([]byte("rate limited"))
2929
} else {
3030
rw.WriteHeader(http.StatusOK)
31-
_, _ = rw.Write([]byte("ok"))
31+
rw.Write([]byte("ok"))
3232
}
3333
}))
3434
defer server.Close()
@@ -72,7 +72,7 @@ func TestRetryableTransportExceedsMaxAttempts(t *testing.T) {
7272
reset := fmt.Sprintf("%d", time.Now().Add(1*time.Second).Unix())
7373
rw.Header().Set("X-RateLimit-Reset", reset)
7474
rw.WriteHeader(http.StatusTooManyRequests)
75-
_, _ = rw.Write([]byte("rate limited"))
75+
rw.Write([]byte("rate limited"))
7676
}))
7777
defer server.Close()
7878

@@ -111,7 +111,7 @@ func TestRetryableWithDifferentError(t *testing.T) {
111111
attempts++
112112

113113
rw.WriteHeader(http.StatusNotFound)
114-
_, _ = rw.Write([]byte("not found"))
114+
rw.Write([]byte("not found"))
115115
}))
116116
defer server.Close()
117117

@@ -142,3 +142,39 @@ func TestRetryableWithDifferentError(t *testing.T) {
142142
require.Error(t, err)
143143
require.Equal(t, 1, attempts)
144144
}
145+
146+
func TestRetryableTransport_POST(t *testing.T) {
147+
server := httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
148+
rw.WriteHeader(http.StatusCreated)
149+
rw.Write([]byte("test result"))
150+
}))
151+
defer server.Close()
152+
153+
rwrtr := runtime.ClientRequestWriterFunc(func(req runtime.ClientRequest, _ strfmt.Registry) error {
154+
return req.SetBodyParam("test result")
155+
})
156+
157+
hu, _ := url.Parse(server.URL)
158+
rt := NewRetryableTransport(httptransport.New(hu.Host, "/", []string{"http"}), 2)
159+
160+
result, err := rt.Submit(&runtime.ClientOperation{
161+
ID: "createSite",
162+
Method: "POST",
163+
PathPattern: "/",
164+
Params: rwrtr,
165+
Reader: runtime.ClientResponseReaderFunc(func(response runtime.ClientResponse, consumer runtime.Consumer) (interface{}, error) {
166+
if response.Code() == 201 {
167+
var result string
168+
if err := consumer.Consume(response.Body(), &result); err != nil {
169+
return nil, err
170+
}
171+
return result, nil
172+
}
173+
return nil, errors.New("Generic error")
174+
}),
175+
})
176+
177+
require.NoError(t, err)
178+
actual := result.(string)
179+
require.EqualValues(t, "test result", actual)
180+
}

0 commit comments

Comments
 (0)