Skip to content

Commit c042854

Browse files
ctlongweymanf
andcommitted
Feature flag the HTTP2 work
- added enableHTTP2 to config - defaults to false - passes to protocolcheck handler [cloudfoundry/routing-release#200] Co-authored-by: Weyman Fung <[email protected]>
1 parent 36dd869 commit c042854

File tree

6 files changed

+71
-22
lines changed

6 files changed

+71
-22
lines changed

config/config.go

+2
Original file line numberDiff line numberDiff line change
@@ -195,6 +195,7 @@ type Config struct {
195195
EnableSSL bool `yaml:"enable_ssl,omitempty"`
196196
SSLPort uint16 `yaml:"ssl_port,omitempty"`
197197
DisableHTTP bool `yaml:"disable_http,omitempty"`
198+
EnableHTTP2 bool `yaml:"enable_http2,omitempty"`
198199
SSLCertificates []tls.Certificate `yaml:"-"`
199200
TLSPEM []TLSPem `yaml:"tls_pem,omitempty"`
200201
CACerts string `yaml:"ca_certs,omitempty"`
@@ -292,6 +293,7 @@ var defaultConfig = Config{
292293
EnableSSL: false,
293294
SSLPort: 443,
294295
DisableHTTP: false,
296+
EnableHTTP2: false,
295297
MinTLSVersion: tls.VersionTLS12,
296298
MaxTLSVersion: tls.VersionTLS12,
297299

config/config_test.go

+17
Original file line numberDiff line numberDiff line change
@@ -1399,6 +1399,23 @@ disable_http: true
13991399
})
14001400
})
14011401

1402+
Context("enable_http2", func() {
1403+
It("defaults to false", func() {
1404+
Expect(config.Process()).To(Succeed())
1405+
Expect(config.EnableHTTP2).To(BeFalse())
1406+
})
1407+
1408+
It("setting enable_http2 succeeds", func() {
1409+
var b = []byte(fmt.Sprintf(`
1410+
enable_http2: true
1411+
`))
1412+
err := config.Initialize(b)
1413+
Expect(err).NotTo(HaveOccurred())
1414+
Expect(config.Process()).To(Succeed())
1415+
Expect(config.EnableHTTP2).To(BeTrue())
1416+
})
1417+
})
1418+
14021419
Context("When given a routing_table_sharding_mode that is supported ", func() {
14031420
Context("sharding mode `all`", func() {
14041421
It("succeeds", func() {

handlers/protocolcheck.go

+6-4
Original file line numberDiff line numberDiff line change
@@ -16,19 +16,21 @@ import (
1616
type protocolCheck struct {
1717
logger logger.Logger
1818
errorWriter errorwriter.ErrorWriter
19+
enableHTTP2 bool
1920
}
2021

2122
// NewProtocolCheck creates a handler responsible for checking the protocol of
2223
// the request
23-
func NewProtocolCheck(logger logger.Logger, errorWriter errorwriter.ErrorWriter) negroni.Handler {
24+
func NewProtocolCheck(logger logger.Logger, errorWriter errorwriter.ErrorWriter, enableHTTP2 bool) negroni.Handler {
2425
return &protocolCheck{
2526
logger: logger,
2627
errorWriter: errorWriter,
28+
enableHTTP2: enableHTTP2,
2729
}
2830
}
2931

3032
func (p *protocolCheck) ServeHTTP(rw http.ResponseWriter, r *http.Request, next http.HandlerFunc) {
31-
if !isProtocolSupported(r) {
33+
if !p.isProtocolSupported(r) {
3234
// must be hijacked, otherwise no response is sent back
3335
conn, buf, err := p.hijack(rw)
3436
if err != nil {
@@ -58,6 +60,6 @@ func (p *protocolCheck) hijack(rw http.ResponseWriter) (net.Conn, *bufio.ReadWri
5860
return hijacker.Hijack()
5961
}
6062

61-
func isProtocolSupported(request *http.Request) bool {
62-
return request.ProtoMajor == 2 || (request.ProtoMajor == 1 && (request.ProtoMinor == 0 || request.ProtoMinor == 1))
63+
func (p *protocolCheck) isProtocolSupported(request *http.Request) bool {
64+
return (p.enableHTTP2 && request.ProtoMajor == 2) || (request.ProtoMajor == 1 && (request.ProtoMinor == 0 || request.ProtoMinor == 1))
6365
}

handlers/protocolcheck_test.go

+42-15
Original file line numberDiff line numberDiff line change
@@ -21,20 +21,21 @@ var _ = Describe("Protocolcheck", func() {
2121
logger logger.Logger
2222
ew = errorwriter.NewPlaintextErrorWriter()
2323

24-
nextCalled bool
25-
server *ghttp.Server
26-
n *negroni.Negroni
24+
nextCalled bool
25+
server *ghttp.Server
26+
n *negroni.Negroni
27+
enableHTTP2 bool
2728
)
2829

29-
BeforeEach(func() {
30+
JustBeforeEach(func() {
3031
logger = test_util.NewTestZapLogger("protocolcheck")
3132
nextCalled = false
3233

3334
n = negroni.New()
3435
n.UseFunc(func(rw http.ResponseWriter, req *http.Request, next http.HandlerFunc) {
3536
next(rw, req)
3637
})
37-
n.Use(handlers.NewProtocolCheck(logger, ew))
38+
n.Use(handlers.NewProtocolCheck(logger, ew, enableHTTP2))
3839
n.UseHandlerFunc(func(http.ResponseWriter, *http.Request) {
3940
nextCalled = true
4041
})
@@ -49,18 +50,44 @@ var _ = Describe("Protocolcheck", func() {
4950
})
5051

5152
Context("http2", func() {
52-
It("passes the request through", func() {
53-
conn, err := net.Dial("tcp", server.Addr())
54-
defer conn.Close()
55-
Expect(err).ToNot(HaveOccurred())
56-
respReader := bufio.NewReader(conn)
53+
Context("when http2 is enabled", func() {
54+
BeforeEach(func() {
55+
enableHTTP2 = true
56+
})
57+
58+
It("passes the request through", func() {
59+
conn, err := net.Dial("tcp", server.Addr())
60+
defer conn.Close()
61+
Expect(err).ToNot(HaveOccurred())
62+
respReader := bufio.NewReader(conn)
63+
64+
conn.Write([]byte("PRI * HTTP/2.0\r\nHost: example.com\r\n\r\n"))
65+
resp, err := http.ReadResponse(respReader, nil)
66+
Expect(err).ToNot(HaveOccurred())
67+
68+
Expect(resp.StatusCode).To(Equal(200))
69+
Expect(nextCalled).To(BeTrue())
70+
})
71+
})
5772

58-
conn.Write([]byte("PRI * HTTP/2.0\r\nHost: example.com\r\n\r\n"))
59-
resp, err := http.ReadResponse(respReader, nil)
60-
Expect(err).ToNot(HaveOccurred())
73+
Context("when http2 is disabled", func() {
74+
BeforeEach(func() {
75+
enableHTTP2 = false
76+
})
6177

62-
Expect(resp.StatusCode).To(Equal(200))
63-
Expect(nextCalled).To(BeTrue())
78+
It("returns a 400 witha helpful error ", func() {
79+
conn, err := net.Dial("tcp", server.Addr())
80+
defer conn.Close()
81+
Expect(err).ToNot(HaveOccurred())
82+
respReader := bufio.NewReader(conn)
83+
84+
conn.Write([]byte("PRI * HTTP/2.0\r\nHost: example.com\r\n\r\n"))
85+
resp, err := http.ReadResponse(respReader, nil)
86+
Expect(err).ToNot(HaveOccurred())
87+
88+
Expect(resp.StatusCode).To(Equal(400))
89+
Expect(nextCalled).To(BeFalse())
90+
})
6491
})
6592
})
6693

integration/main_test.go

+3-2
Original file line numberDiff line numberDiff line change
@@ -255,12 +255,14 @@ var _ = Describe("Router Integration", func() {
255255
clientTLSConfig *tls.Config
256256
mbusClient *nats.Conn
257257
)
258+
258259
BeforeEach(func() {
259260
cfg, clientTLSConfig = createSSLConfig(statusPort, proxyPort, sslPort, natsPort)
260-
261261
})
262+
262263
JustBeforeEach(func() {
263264
var err error
265+
cfg.EnableHTTP2 = true
264266
writeConfig(cfg, cfgFile)
265267
mbusClient, err = newMessageBus(cfg)
266268
Expect(err).ToNot(HaveOccurred())
@@ -297,7 +299,6 @@ var _ = Describe("Router Integration", func() {
297299
})
298300

299301
Context("Drain", func() {
300-
301302
BeforeEach(func() {
302303
cfg = createConfig(statusPort, proxyPort, cfgFile, defaultPruneInterval, defaultPruneThreshold, 1, false, 0, natsPort)
303304
})

proxy/proxy.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,7 @@ func NewProxy(
174174
n.Use(handlers.NewProxyHealthcheck(cfg.HealthCheckUserAgent, p.health, logger))
175175
n.Use(zipkinHandler)
176176
n.Use(w3cHandler)
177-
n.Use(handlers.NewProtocolCheck(logger, errorWriter))
177+
n.Use(handlers.NewProtocolCheck(logger, errorWriter, cfg.EnableHTTP2))
178178
n.Use(handlers.NewLookup(registry, reporter, logger, errorWriter, cfg.EmptyPoolResponseCode503))
179179
n.Use(handlers.NewClientCert(
180180
SkipSanitize(routeServiceHandler.(*handlers.RouteService)),

0 commit comments

Comments
 (0)