@@ -3,7 +3,6 @@ package upstream
33import (
44 "bytes"
55 "crypto"
6− "crypto/tls"
76 "encoding/json"
87 "fmt"
98 "net/http"
@@ -23,9 +22,8 @@ import (
2322)
2423
2524var _ = Describe("HTTP Upstream Suite", func() {
26−
27− const flushInterval5s = options.Duration(5 * time.Second)
28− const flushInterval1s = options.Duration(1 * time.Second)
25+ defaultFlushInterval := options.Duration(options.DefaultUpstreamFlushInterval)
26+ defaultTimeout := options.Duration(options.DefaultUpstreamTimeout)
2927 truth := true
3028 falsum := false
3129
@@ -62,12 +60,15 @@ var _ = Describe("HTTP Upstream Suite", func() {
6260
6361 flush := options.Duration(1 * time.Second)
6462
63+ timeout := options.Duration(options.DefaultUpstreamTimeout)
64+
6565 upstream := options.Upstream{
6666 ID: in.id,
6767 PassHostHeader: &in.passUpstreamHostHeader,
6868 ProxyWebSockets: &falsum,
6969 InsecureSkipTLSVerify: false,
7070 FlushInterval: &flush,
71+ Timeout: &timeout,
7172 }
7273
7374 Expect(in.serverAddr).ToNot(BeNil())
@@ -318,13 +319,13 @@ var _ = Describe("HTTP Upstream Suite", func() {
318319 req = middlewareapi.AddRequestScope(req, &middlewareapi.RequestScope{})
319320 rw := httptest.NewRecorder()
320321
321− flush := options.Duration(1 * time.Second)
322322 upstream := options.Upstream{
323323 ID: "noPassHost",
324324 PassHostHeader: &falsum,
325325 ProxyWebSockets: &falsum,
326326 InsecureSkipTLSVerify: false,
327− FlushInterval: &flush,
327+ FlushInterval: &defaultFlushInterval,
328+ Timeout: &defaultTimeout,
328329 }
329330
330331 u, err := url.Parse(serverAddr)
@@ -354,6 +355,7 @@ var _ = Describe("HTTP Upstream Suite", func() {
354355 skipVerify bool
355356 sigData *options.SignatureData
356357 errorHandler func(http.ResponseWriter, *http.Request, error)
358+ timeout options.Duration
357359 }
358360
359361 DescribeTable("newHTTPUpstreamProxy",
@@ -366,6 +368,7 @@ var _ = Describe("HTTP Upstream Suite", func() {
366368 FlushInterval: &in.flushInterval,
367369 InsecureSkipTLSVerify: in.skipVerify,
368370 ProxyWebSockets: &in.proxyWebSockets,
371+ Timeout: &in.timeout,
369372 }
370373
371374 handler := newHTTPUpstreamProxy(upstream, u, in.sigData, in.errorHandler)
@@ -380,49 +383,63 @@ var _ = Describe("HTTP Upstream Suite", func() {
380383 proxy, ok := upstreamProxy.handler.(*httputil.ReverseProxy)
381384 Expect(ok).To(BeTrue())
382385 Expect(proxy.FlushInterval).To(Equal(in.flushInterval.Duration()))
386+ transport, ok := proxy.Transport.(*http.Transport)
387+ Expect(ok).To(BeTrue())
388+ Expect(transport.ResponseHeaderTimeout).To(Equal(in.timeout.Duration()))
383389 Expect(proxy.ErrorHandler != nil).To(Equal(in.errorHandler != nil))
384390 if in.skipVerify {
385− Expect(proxy.Transport).To(Equal(&http.Transport{
386− TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
387− }))
391+ Expect(transport.TLSClientConfig.InsecureSkipVerify).To(Equal(true))
388392 }
389393 },
390394 Entry("with proxy websockets", &newUpstreamTableInput{
391395 proxyWebSockets: true,
392− flushInterval: flushInterval1s,
396+ flushInterval: defaultFlushInterval,
393397 skipVerify: false,
394398 sigData: nil,
395399 errorHandler: nil,
400+ timeout: defaultTimeout,
396401 }),
397402 Entry("with a non standard flush interval", &newUpstreamTableInput{
398403 proxyWebSockets: false,
399− flushInterval: flushInterval5s,
404+ flushInterval: options.Duration(5 * time.Second),
400405 skipVerify: false,
401406 sigData: nil,
402407 errorHandler: nil,
408+ timeout: defaultTimeout,
403409 }),
404410 Entry("with a InsecureSkipTLSVerify", &newUpstreamTableInput{
405411 proxyWebSockets: false,
406− flushInterval: flushInterval1s,
412+ flushInterval: defaultFlushInterval,
407413 skipVerify: true,
408414 sigData: nil,
409415 errorHandler: nil,
416+ timeout: defaultTimeout,
410417 }),
411418 Entry("with a SignatureData", &newUpstreamTableInput{
412419 proxyWebSockets: false,
413− flushInterval: flushInterval1s,
420+ flushInterval: defaultFlushInterval,
414421 skipVerify: false,
415422 sigData: &options.SignatureData{Hash: crypto.SHA256, Key: "secret"},
416423 errorHandler: nil,
424+ timeout: defaultTimeout,
417425 }),
418426 Entry("with an error handler", &newUpstreamTableInput{
419427 proxyWebSockets: false,
420− flushInterval: flushInterval1s,
428+ flushInterval: defaultFlushInterval,
421429 skipVerify: false,
422430 sigData: nil,
423431 errorHandler: func(rw http.ResponseWriter, req *http.Request, arg3 error) {
424432 rw.WriteHeader(502)
425433 },
434+ timeout: defaultTimeout,
435+ }),
436+ Entry("with a non-default timeout", &newUpstreamTableInput{
437+ proxyWebSockets: false,
438+ flushInterval: defaultFlushInterval,
439+ skipVerify: false,
440+ sigData: nil,
441+ errorHandler: nil,
442+ timeout: options.Duration(5 * time.Second),
426443 }),
427444 )
428445
@@ -431,12 +448,14 @@ var _ = Describe("HTTP Upstream Suite", func() {
431448
432449 BeforeEach(func() {
433450 flush := options.Duration(1 * time.Second)
451+ timeout := options.Duration(options.DefaultUpstreamTimeout)
434452 upstream := options.Upstream{
435453 ID: "websocketProxy",
436454 PassHostHeader: &truth,
437455 ProxyWebSockets: &truth,
438456 InsecureSkipTLSVerify: false,
439457 FlushInterval: &flush,
458+ Timeout: &timeout,
440459 }
441460
442461 u, err := url.Parse(serverAddr)