TUN-3449: Use flag to select transport protocol implementation

This commit is contained in:
cthuang 2020-10-08 10:48:10 +01:00
parent 59051ba425
commit d7498b0c03
4 changed files with 41 additions and 4 deletions

View File

@ -719,6 +719,7 @@ func tunnelFlags(shouldHide bool) []cli.Flag {
Value: false, Value: false,
Hidden: shouldHide, Hidden: shouldHide,
}), }),
selectProtocolFlag,
}...) }...)
return flags return flags

View File

@ -260,12 +260,16 @@ func (sc *subcommandContext) run(tunnelID uuid.UUID) error {
return err return err
} }
protocol, ok := origin.ParseProtocol(sc.c.String("protocol"))
if !ok {
return fmt.Errorf("%s is not valid protocol. %s", sc.c.String("protocol"), availableProtocol)
}
return StartServer( return StartServer(
sc.c, sc.c,
version, version,
shutdownC, shutdownC,
graceShutdownC, graceShutdownC,
&origin.NamedTunnelConfig{Auth: *credentials, ID: tunnelID}, &origin.NamedTunnelConfig{Auth: *credentials, ID: tunnelID, Protocol: protocol},
sc.logger, sc.logger,
sc.isUIEnabled, sc.isUIEnabled,
) )

View File

@ -30,6 +30,7 @@ import (
const ( const (
credFileFlagAlias = "cred-file" credFileFlagAlias = "cred-file"
availableProtocol = "Available protocols: http2, Go's implementation and h2mux, Cloudflare's implementation of HTTP/2."
) )
var ( var (
@ -83,6 +84,13 @@ var (
Aliases: []string{"f"}, Aliases: []string{"f"},
Usage: "Allows you to delete a tunnel, even if it has active connections.", Usage: "Allows you to delete a tunnel, even if it has active connections.",
} }
selectProtocolFlag = &cli.StringFlag{
Name: "protocol",
Value: "h2mux",
Aliases: []string{"p"},
Usage: fmt.Sprintf("Protocol implementation to connect with Cloudflare's edge network. %s", availableProtocol),
Hidden: true,
}
) )
func buildCreateCommand() *cli.Command { func buildCreateCommand() *cli.Command {
@ -309,6 +317,7 @@ func buildRunCommand() *cli.Command {
flags := []cli.Flag{ flags := []cli.Flag{
forceFlag, forceFlag,
credentialsFileFlag, credentialsFileFlag,
selectProtocolFlag,
} }
flags = append(flags, configureProxyFlags(false)...) flags = append(flags, configureProxyFlags(false)...)
return &cli.Command{ return &cli.Command{

View File

@ -188,9 +188,28 @@ func (c *TunnelConfig) IsTrialTunnel() bool {
} }
type NamedTunnelConfig struct { type NamedTunnelConfig struct {
Auth pogs.TunnelAuth Auth pogs.TunnelAuth
ID uuid.UUID ID uuid.UUID
Client pogs.ClientInfo Client pogs.ClientInfo
Protocol Protocol
}
type Protocol int64
const (
h2muxProtocol Protocol = iota
http2Protocol
)
func ParseProtocol(s string) (Protocol, bool) {
switch s {
case "h2mux":
return h2muxProtocol, true
case "http2":
return http2Protocol, true
default:
return 0, false
}
} }
func StartTunnelDaemon(ctx context.Context, config *TunnelConfig, connectedSignal *signal.Signal, cloudflaredID uuid.UUID, reconnectCh chan ReconnectSignal) error { func StartTunnelDaemon(ctx context.Context, config *TunnelConfig, connectedSignal *signal.Signal, cloudflaredID uuid.UUID, reconnectCh chan ReconnectSignal) error {
@ -284,6 +303,10 @@ func ServeTunnel(
connectionTag := uint8ToString(connectionIndex) connectionTag := uint8ToString(connectionIndex)
if config.NamedTunnel != nil && config.NamedTunnel.Protocol == http2Protocol {
return ServeNamedTunnel(ctx, config, connectionIndex, addr, connectedFuse, reconnectCh)
}
// Returns error from parsing the origin URL or handshake errors // Returns error from parsing the origin URL or handshake errors
handler, originLocalAddr, err := NewTunnelHandler(ctx, config, addr, connectionIndex, bufferPool) handler, originLocalAddr, err := NewTunnelHandler(ctx, config, addr, connectionIndex, bufferPool)
if err != nil { if err != nil {