cloudflare/cloudflared

Public

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

CodeCommitsIssuesPull requestsActionsInsightsSecurity
2021.3.2

Branches

Tags

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

Clone

HTTPS

Download ZIP

carrier/carrier_test.go

158lines · modecode

1package carrier
2
3import (
4 "bytes"
5 "io"
6 "net"
7 "net/http"
8 "net/http/httptest"
9 "sync"
10 "testing"
11
12 ws "github.com/gorilla/websocket"
13 "github.com/rs/zerolog"
14 "github.com/stretchr/testify/assert"
15)
16
17const (
18 // example in Sec-Websocket-Key in rfc6455
19 testSecWebsocketKey = "dGhlIHNhbXBsZSBub25jZQ=="
20)
21
22type testStreamer struct {
23 buf *bytes.Buffer
24 l sync.RWMutex
25}
26
27func newTestStream() *testStreamer {
28 return &testStreamer{buf: new(bytes.Buffer)}
29}
30
31func (s *testStreamer) Read(p []byte) (int, error) {
32 s.l.RLock()
33 defer s.l.RUnlock()
34 return s.buf.Read(p)
35
36}
37
38func (s *testStreamer) Write(p []byte) (int, error) {
39 s.l.Lock()
40 defer s.l.Unlock()
41 return s.buf.Write(p)
42}
43
44func TestStartClient(t *testing.T) {
45 message := "Good morning Austin! Time for another sunny day in the great state of Texas."
46 log := zerolog.Nop()
47 wsConn := NewWSConnection(&log)
48 ts := newTestWebSocketServer()
49 defer ts.Close()
50
51 buf := newTestStream()
52 options := &StartOptions{
53 OriginURL: "http://" + ts.Listener.Addr().String(),
54 Headers: nil,
55 }
56 err := StartClient(wsConn, buf, options)
57 assert.NoError(t, err)
58 _, _ = buf.Write([]byte(message))
59
60 readBuffer := make([]byte, len(message))
61 _, _ = buf.Read(readBuffer)
62 assert.Equal(t, message, string(readBuffer))
63}
64
65func TestStartServer(t *testing.T) {
66 listener, err := net.Listen("tcp", "localhost:")
67 if err != nil {
68 t.Fatalf("Error starting listener: %v", err)
69 }
70 message := "Good morning Austin! Time for another sunny day in the great state of Texas."
71 log := zerolog.Nop()
72 shutdownC := make(chan struct{})
73 wsConn := NewWSConnection(&log)
74 ts := newTestWebSocketServer()
75 defer ts.Close()
76 options := &StartOptions{
77 OriginURL: "http://" + ts.Listener.Addr().String(),
78 Headers: nil,
79 }
80
81 go func() {
82 err := Serve(wsConn, listener, shutdownC, options)
83 if err != nil {
84 t.Errorf("Error running server: %v", err)
85 return
86 }
87 }()
88
89 conn, err := net.Dial("tcp", listener.Addr().String())
90 _, _ = conn.Write([]byte(message))
91
92 readBuffer := make([]byte, len(message))
93 _, _ = conn.Read(readBuffer)
94 assert.Equal(t, string(readBuffer), message)
95}
96
97func TestIsAccessResponse(t *testing.T) {
98 validLocationHeader := http.Header{}
99 validLocationHeader.Add("location", "https://test.cloudflareaccess.com/cdn-cgi/access/login/blahblah")
100 invalidLocationHeader := http.Header{}
101 invalidLocationHeader.Add("location", "https://google.com")
102 testCases := []struct {
103 Description string
104 In *http.Response
105 ExpectedOut bool
106 }{
107 {"nil response", nil, false},
108 {"redirect with no location", &http.Response{StatusCode: http.StatusFound}, false},
109 {"200 ok", &http.Response{StatusCode: http.StatusOK}, false},
110 {"redirect with location", &http.Response{StatusCode: http.StatusFound, Header: validLocationHeader}, true},
111 {"redirect with invalid location", &http.Response{StatusCode: http.StatusFound, Header: invalidLocationHeader}, false},
112 }
113
114 for i, tc := range testCases {
115 if IsAccessResponse(tc.In) != tc.ExpectedOut {
116 t.Fatalf("Failed case %d -- %s", i, tc.Description)
117 }
118 }
119
120}
121
122func newTestWebSocketServer() *httptest.Server {
123 upgrader := ws.Upgrader{
124 ReadBufferSize: 1024,
125 WriteBufferSize: 1024,
126 }
127
128 return httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
129 conn, _ := upgrader.Upgrade(w, r, nil)
130 defer conn.Close()
131 for {
132 mt, message, err := conn.ReadMessage()
133 if err != nil {
134 break
135 }
136
137 if err := conn.WriteMessage(mt, []byte(message)); err != nil {
138 break
139 }
140 }
141 }))
142}
143
144func testRequest(t *testing.T, url string, stream io.ReadWriter) *http.Request {
145 req, err := http.NewRequest("GET", url, stream)
146 if err != nil {
147 t.Fatalf("testRequestHeader error")
148 }
149
150 req.Header.Add("Connection", "Upgrade")
151 req.Header.Add("Upgrade", "WebSocket")
152 req.Header.Add("Sec-Websocket-Key", testSecWebsocketKey)
153 req.Header.Add("Sec-Websocket-Protocol", "tunnel-protocol")
154 req.Header.Add("Sec-Websocket-Version", "13")
155 req.Header.Add("User-Agent", "curl/7.59.0")
156
157 return req
158}
159