Skip to content

Commit 7d4afd4

Browse files
committed
Add Http2Origin option to force HTTP/2 origin connections
If `http2Origin` is set, it will set `ForceAttemptHTTP2` in the transport config of the `OriginService`.
1 parent 4b6437c commit 7d4afd4

File tree

5 files changed

+22
-1
lines changed

5 files changed

+22
-1
lines changed

cmd/cloudflared/tunnel/cmd.go

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -821,6 +821,13 @@ func configureProxyFlags(shouldHide bool) []cli.Flag {
821821
EnvVars: []string{"TUNNEL_NO_CHUNKED_ENCODING"},
822822
Hidden: shouldHide,
823823
}),
824+
altsrc.NewBoolFlag(&cli.BoolFlag{
825+
Name: ingress.Http2OriginFlag,
826+
Usage: "Enables HTTP/2 origin servers.",
827+
EnvVars: []string{"TUNNEL_ORIGIN_ENABLE_HTTP2"},
828+
Hidden: shouldHide,
829+
Value: false,
830+
}),
824831
}
825832
return append(flags, sshFlags(shouldHide)...)
826833
}

config/configuration.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -227,6 +227,8 @@ type OriginRequestConfig struct {
227227
ProxyType *string `yaml:"proxyType" json:"proxyType,omitempty"`
228228
// IP rules for the proxy service
229229
IPRules []IngressIPRule `yaml:"ipRules" json:"ipRules,omitempty"`
230+
// Attempt to connect to origin with HTTP/2
231+
Http2Origin *bool `yaml:"http2Origin" json:"http2Origin,omitempty"`
230232
}
231233

232234
type IngressIPRule struct {

config/configuration_test.go

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -139,7 +139,8 @@ var rawConfig = []byte(`
139139
"ports": [443, 4443],
140140
"allow": true
141141
}
142-
]
142+
],
143+
"http2Origin": true
143144
}
144145
`)
145146

@@ -188,6 +189,7 @@ func assertConfig(
188189
assert.Equal(t, true, *config.NoTLSVerify)
189190
assert.Equal(t, uint(9000), *config.ProxyPort)
190191
assert.Equal(t, "socks", *config.ProxyType)
192+
assert.Equal(t, true, *config.Http2Origin)
191193

192194
privateV4 := "10.0.0.0/8"
193195
privateV6 := "fc00::/7"

ingress/config.go

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ const (
3535
NoChunkedEncodingFlag = "no-chunked-encoding"
3636
ProxyAddressFlag = "proxy-address"
3737
ProxyPortFlag = "proxy-port"
38+
Http2OriginFlag = "http2-origin"
3839
)
3940

4041
const (
@@ -93,6 +94,7 @@ func originRequestFromSingeRule(c *cli.Context) OriginRequestConfig {
9394
var proxyAddress = defaultProxyAddress
9495
var proxyPort uint
9596
var proxyType string
97+
var http2Origin bool
9698
if flag := ProxyConnectTimeoutFlag; c.IsSet(flag) {
9799
connectTimeout = config.CustomDuration{Duration: c.Duration(flag)}
98100
}
@@ -136,9 +138,13 @@ func originRequestFromSingeRule(c *cli.Context) OriginRequestConfig {
136138
// Note TUN-3758 , we use Int because UInt is not supported with altsrc
137139
proxyPort = uint(c.Int(flag))
138140
}
141+
if flag := Http2OriginFlag; c.IsSet(flag) {
142+
http2Origin = c.Bool(flag)
143+
}
139144
if c.IsSet(Socks5Flag) {
140145
proxyType = socksProxy
141146
}
147+
142148
return OriginRequestConfig{
143149
ConnectTimeout: connectTimeout,
144150
TLSTimeout: tlsTimeout,
@@ -155,6 +161,7 @@ func originRequestFromSingeRule(c *cli.Context) OriginRequestConfig {
155161
ProxyAddress: proxyAddress,
156162
ProxyPort: proxyPort,
157163
ProxyType: proxyType,
164+
Http2Origin: http2Origin,
158165
}
159166
}
160167

@@ -263,6 +270,8 @@ type OriginRequestConfig struct {
263270
ProxyType string `yaml:"proxyType" json:"proxyType"`
264271
// IP rules for the proxy service
265272
IPRules []ipaccess.Rule `yaml:"ipRules" json:"ipRules"`
273+
// Attempt to connect to origin with HTTP/2
274+
Http2Origin bool `yaml:"http2Origin" json:"http2Origin"`
266275
}
267276

268277
func (defaults *OriginRequestConfig) setConnectTimeout(overrides config.OriginRequestConfig) {

ingress/origin_service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ func newHTTPTransport(service OriginService, cfg OriginRequestConfig, log *zerol
291291
TLSHandshakeTimeout: cfg.TLSTimeout.Duration,
292292
ExpectContinueTimeout: 1 * time.Second,
293293
TLSClientConfig: &tls.Config{RootCAs: originCertPool, InsecureSkipVerify: cfg.NoTLSVerify},
294+
ForceAttemptHTTP2: cfg.Http2Origin,
294295
}
295296
if _, isHelloWorld := service.(*helloWorld); !isHelloWorld && cfg.OriginServerName != "" {
296297
httpTransport.TLSClientConfig.ServerName = cfg.OriginServerName

0 commit comments

Comments
 (0)