MCPcopy
hub / github.com/cloudflare/cloudflared / testProxyWebsocket

Function testProxyWebsocket

proxy/proxy_test.go:194–256  ·  view source on GitHub ↗
(proxy connection.OriginProxy)

Source from the content-addressed store, hash-verified

192}
193
194func testProxyWebsocket(proxy connection.OriginProxy) func(t *testing.T) {
195 return func(t *testing.T) {
196 // WSRoute is a websocket echo handler
197 const testTimeout = 5 * time.Second * 1000
198 ctx, cancel := context.WithTimeout(t.Context(), testTimeout)
199 defer cancel()
200 readPipe, writePipe := io.Pipe()
201 req, err := http.NewRequestWithContext(ctx, http.MethodGet, fmt.Sprintf("http://localhost:8080%s", hello.WSRoute), readPipe)
202 req.Header.Set("Sec-Websocket-Key", "dGhlIHNhbXBsZSBub25jZQ==")
203 req.Header.Set("Connection", "Upgrade")
204 req.Header.Set("Upgrade", "websocket")
205 responseWriter := newMockWSRespWriter(nil)
206
207 finished := make(chan struct{})
208
209 errGroup, ctx := errgroup.WithContext(ctx)
210 errGroup.Go(func() error {
211 log := zerolog.Nop()
212 err = proxy.ProxyHTTP(responseWriter, tracing.NewTracedHTTPRequest(req, 0, &log), true)
213 require.NoError(t, err)
214
215 require.Equal(t, http.StatusSwitchingProtocols, responseWriter.Code)
216 return nil
217 })
218
219 errGroup.Go(func() error {
220 select {
221 case <-finished:
222 case <-ctx.Done():
223 }
224 if ctx.Err() == context.DeadlineExceeded {
225 t.Errorf("Test timed out")
226 readPipe.Close()
227 writePipe.Close()
228 responseWriter.Close()
229 }
230 return nil
231 })
232
233 msg := []byte("test websocket")
234 err = wsutil.WriteClientText(writePipe, msg)
235 require.NoError(t, err)
236
237 // ReadServerText reads next data message from rw, considering that caller represents proxy side.
238 returnedMsg, err := wsutil.ReadServerText(responseWriter.respBody())
239 require.NoError(t, err)
240 require.Equal(t, msg, returnedMsg)
241
242 err = wsutil.WriteClientBinary(writePipe, msg)
243 require.NoError(t, err)
244
245 returnedMsg, err = wsutil.ReadServerBinary(responseWriter.respBody())
246 require.NoError(t, err)
247 require.Equal(t, msg, returnedMsg)
248
249 _ = readPipe.Close()
250 _ = writePipe.Close()
251 _ = responseWriter.Close()

Callers 1

TestProxySingleOriginFunction · 0.85

Calls 11

NewTracedHTTPRequestFunction · 0.92
newMockWSRespWriterFunction · 0.85
ErrorfMethod · 0.80
respBodyMethod · 0.80
WaitMethod · 0.80
ContextMethod · 0.65
ProxyHTTPMethod · 0.65
EqualMethod · 0.65
CloseMethod · 0.65
SetMethod · 0.45
ErrMethod · 0.45

Tested by

no test coverage detected