cloudflare/cloudflared

Public

mirrored from https://github.com/cloudflare/cloudflaredAvailable

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2020.7.1

Branches

Tags

  • No tags available.
0Branches0Tags
Go to file
Add file
Code

Clone

HTTPS

Download ZIP

connection/rpc.go

49lines · modeblame

bbf31377Nick Vollmar6 years ago1package connection
2
3import (
4"context"
5"fmt"
6"time"
7
8rpc "zombiezen.com/go/capnproto2/rpc"
9
10"github.com/cloudflare/cloudflared/h2mux"
046be632Dalton6 years ago11"github.com/cloudflare/cloudflared/logger"
bbf31377Nick Vollmar6 years ago12"github.com/cloudflare/cloudflared/tunnelrpc"
13tunnelpogs "github.com/cloudflare/cloudflared/tunnelrpc/pogs"
14)
15
16// NewRPCClient creates and returns a new RPC client, which will communicate
17// using a stream on the given muxer
18func NewRPCClient(
19ctx context.Context,
20muxer *h2mux.Muxer,
046be632Dalton6 years ago21logger logger.Service,
bbf31377Nick Vollmar6 years ago22openStreamTimeout time.Duration,
23) (client tunnelpogs.TunnelServer_PogsClient, err error) {
24openStreamCtx, openStreamCancel := context.WithTimeout(ctx, openStreamTimeout)
25defer openStreamCancel()
26stream, err := muxer.OpenRPCStream(openStreamCtx)
27if err != nil {
28return
29}
30
31if !isRPCStreamResponse(stream.Headers) {
32stream.Close()
33err = fmt.Errorf("rpc: bad response headers: %v", stream.Headers)
34return
35}
36
37conn := rpc.NewConn(
38tunnelrpc.NewTransportLogger(logger, rpc.StreamTransport(stream)),
39tunnelrpc.ConnLog(logger),
40)
41client = tunnelpogs.TunnelServer_PogsClient{Client: conn.Bootstrap(ctx), Conn: conn}
42return client, nil
43}
44
45func isRPCStreamResponse(headers []h2mux.Header) bool {
46return len(headers) == 1 &&
47headers[0].Name == ":status" &&
48headers[0].Value == "200"
49}