1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- package quic
- import (
- "fmt"
- "io"
- capnp "zombiezen.com/go/capnproto2"
- "github.com/cloudflare/cloudflared/tunnelrpc/pogs"
- )
- // RequestClientStream is a stream to provide requests to the server. This operation is typically driven by the edge service.
- type RequestClientStream struct {
- io.ReadWriteCloser
- }
- // WriteConnectRequestData writes requestMeta to a stream.
- func (rcs *RequestClientStream) WriteConnectRequestData(dest string, connectionType pogs.ConnectionType, metadata ...pogs.Metadata) error {
- connectRequest := &pogs.ConnectRequest{
- Dest: dest,
- Type: connectionType,
- Metadata: metadata,
- }
- msg, err := connectRequest.ToPogs()
- if err != nil {
- return err
- }
- if err := writeDataStreamPreamble(rcs); err != nil {
- return err
- }
- return capnp.NewEncoder(rcs).Encode(msg)
- }
- // ReadConnectResponseData reads the response from the rpc stream to a ConnectResponse.
- func (rcs *RequestClientStream) ReadConnectResponseData() (*pogs.ConnectResponse, error) {
- signature, err := determineProtocol(rcs)
- if err != nil {
- return nil, err
- }
- if signature != dataStreamProtocolSignature {
- return nil, fmt.Errorf("wrong protocol signature %v", signature)
- }
- // This is a NO-OP for now. We could cause a branching if we wanted to use multiple versions.
- if _, err := readVersion(rcs); err != nil {
- return nil, err
- }
- msg, err := capnp.NewDecoder(rcs).Decode()
- if err != nil {
- return nil, err
- }
- r := &pogs.ConnectResponse{}
- if err := r.FromPogs(msg); err != nil {
- return nil, err
- }
- return r, nil
- }
|