mirror of
https://github.com/cloudflare/cloudflared.git
synced 2025-05-22 14:36:35 +00:00

Combines the tunnelrpc and quic/schema capnp files into the same module. To help reduce future issues with capnp id generation, capnpids are provided in the capnp files from the existing capnp struct ids generated in the go files. Reduces the overall interface of the Capnp methods to the rest of the code by providing an interface that will handle the quic protocol selection. Introduces a new `rpc-timeout` config that will allow all of the SessionManager and ConfigurationManager RPC requests to have a timeout. The timeout for these values is set to 5 seconds as non of these operations for the managers should take a long time to complete. Removed the RPC-specific logger as it never provided good debugging value as the RPC method names were not visible in the logs.
112 lines
2.6 KiB
Go
112 lines
2.6 KiB
Go
package pogs
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
capnp "zombiezen.com/go/capnproto2"
|
|
"zombiezen.com/go/capnproto2/pogs"
|
|
|
|
"github.com/cloudflare/cloudflared/tunnelrpc/proto"
|
|
)
|
|
|
|
// ConnectionType indicates the type of underlying connection proxied within the QUIC stream.
|
|
type ConnectionType uint16
|
|
|
|
const (
|
|
ConnectionTypeHTTP ConnectionType = iota
|
|
ConnectionTypeWebsocket
|
|
ConnectionTypeTCP
|
|
)
|
|
|
|
func (c ConnectionType) String() string {
|
|
switch c {
|
|
case ConnectionTypeHTTP:
|
|
return "http"
|
|
case ConnectionTypeWebsocket:
|
|
return "ws"
|
|
case ConnectionTypeTCP:
|
|
return "tcp"
|
|
}
|
|
panic(fmt.Sprintf("invalid ConnectionType: %d", c))
|
|
}
|
|
|
|
// ConnectRequest is the representation of metadata sent at the start of a QUIC application handshake.
|
|
type ConnectRequest struct {
|
|
Dest string `capnp:"dest"`
|
|
Type ConnectionType `capnp:"type"`
|
|
Metadata []Metadata `capnp:"metadata"`
|
|
}
|
|
|
|
// Metadata is a representation of key value based data sent via RequestMeta.
|
|
type Metadata struct {
|
|
Key string `capnp:"key"`
|
|
Val string `capnp:"val"`
|
|
}
|
|
|
|
// MetadataMap returns a map format of []Metadata.
|
|
func (r *ConnectRequest) MetadataMap() map[string]string {
|
|
metadataMap := make(map[string]string)
|
|
for _, metadata := range r.Metadata {
|
|
metadataMap[metadata.Key] = metadata.Val
|
|
}
|
|
return metadataMap
|
|
}
|
|
|
|
func (r *ConnectRequest) FromPogs(msg *capnp.Message) error {
|
|
metadata, err := proto.ReadRootConnectRequest(msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return pogs.Extract(r, proto.ConnectRequest_TypeID, metadata.Struct)
|
|
}
|
|
|
|
func (r *ConnectRequest) ToPogs() (*capnp.Message, error) {
|
|
msg, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
root, err := proto.NewRootConnectRequest(seg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := pogs.Insert(proto.ConnectRequest_TypeID, root.Struct, r); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return msg, nil
|
|
}
|
|
|
|
// ConnectResponse is a representation of metadata sent as a response to a QUIC application handshake.
|
|
type ConnectResponse struct {
|
|
Error string `capnp:"error"`
|
|
Metadata []Metadata `capnp:"metadata"`
|
|
}
|
|
|
|
func (r *ConnectResponse) FromPogs(msg *capnp.Message) error {
|
|
metadata, err := proto.ReadRootConnectResponse(msg)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
return pogs.Extract(r, proto.ConnectResponse_TypeID, metadata.Struct)
|
|
}
|
|
|
|
func (r *ConnectResponse) ToPogs() (*capnp.Message, error) {
|
|
msg, seg, err := capnp.NewMessage(capnp.SingleSegment(nil))
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
root, err := proto.NewRootConnectResponse(seg)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if err := pogs.Insert(proto.ConnectResponse_TypeID, root.Struct, r); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return msg, nil
|
|
}
|