| 152 | } |
| 153 | |
| 154 | func serveTailnetHTTP(t *testing.T, conn *tailnet.Conn, handler http.Handler) { |
| 155 | t.Helper() |
| 156 | |
| 157 | ln, err := conn.Listen("tcp", fmt.Sprintf(":%d", workspacesdk.AgentHTTPAPIServerPort)) |
| 158 | require.NoError(t, err) |
| 159 | |
| 160 | server := &http.Server{Handler: handler, ReadHeaderTimeout: testutil.WaitShort} |
| 161 | t.Cleanup(func() { |
| 162 | assert.NoError(t, server.Close()) |
| 163 | assert.NoError(t, ln.Close()) |
| 164 | }) |
| 165 | |
| 166 | go func() { |
| 167 | err := server.Serve(ln) |
| 168 | if err != nil && !errors.Is(err, net.ErrClosed) && !errors.Is(err, http.ErrServerClosed) { |
| 169 | assert.NoError(t, err) |
| 170 | } |
| 171 | }() |
| 172 | } |
| 173 | |
| 174 | // stitchTailnet cross-programs every conn's node into every other conn, the |
| 175 | // N-peer analog of tailnet's stitch test helper, so the peers can reach each |