request_server_stream.go 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758
  1. package quic
  2. import (
  3. "io"
  4. capnp "zombiezen.com/go/capnproto2"
  5. "github.com/cloudflare/cloudflared/tunnelrpc/pogs"
  6. )
  7. // RequestServerStream is a stream to serve requests
  8. type RequestServerStream struct {
  9. io.ReadWriteCloser
  10. }
  11. // ReadConnectRequestData reads the handshake data from a QUIC stream.
  12. func (rss *RequestServerStream) ReadConnectRequestData() (*pogs.ConnectRequest, error) {
  13. // This is a NO-OP for now. We could cause a branching if we wanted to use multiple versions.
  14. if _, err := readVersion(rss); err != nil {
  15. return nil, err
  16. }
  17. msg, err := capnp.NewDecoder(rss).Decode()
  18. if err != nil {
  19. return nil, err
  20. }
  21. r := &pogs.ConnectRequest{}
  22. if err := r.FromPogs(msg); err != nil {
  23. return nil, err
  24. }
  25. return r, nil
  26. }
  27. // WriteConnectResponseData writes response to a QUIC stream.
  28. func (rss *RequestServerStream) WriteConnectResponseData(respErr error, metadata ...pogs.Metadata) error {
  29. var connectResponse *pogs.ConnectResponse
  30. if respErr != nil {
  31. connectResponse = &pogs.ConnectResponse{
  32. Error: respErr.Error(),
  33. }
  34. } else {
  35. connectResponse = &pogs.ConnectResponse{
  36. Metadata: metadata,
  37. }
  38. }
  39. msg, err := connectResponse.ToPogs()
  40. if err != nil {
  41. return err
  42. }
  43. if err := writeDataStreamPreamble(rss); err != nil {
  44. return err
  45. }
  46. return capnp.NewEncoder(rss).Encode(msg)
  47. }