Skip to content

Commit 73147b8

Browse files
committed
net/http/httputil: TestReverseProxyWebSocketCancelation wip
1 parent 6219b48 commit 73147b8

File tree

1 file changed

+30
-10
lines changed

1 file changed

+30
-10
lines changed

src/net/http/httputil/reverseproxy_test.go

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1075,7 +1075,8 @@ func TestSelectFlushInterval(t *testing.T) {
10751075
}
10761076
}
10771077

1078-
func TestReverseProxyWebSocket(t *testing.T) {
1078+
func TestReverseProxyWebSocketCancelation(t *testing.T) {
1079+
backendEnd := "backendEnd"
10791080
backendServer := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
10801081
if upgradeType(r.Header) != "websocket" {
10811082
t.Error("unexpected backend request")
@@ -1094,7 +1095,13 @@ func TestReverseProxyWebSocket(t *testing.T) {
10941095
t.Errorf("backend failed to read line from client: %v", bs.Err())
10951096
return
10961097
}
1097-
fmt.Fprintf(c, "backend got %q\n", bs.Text())
1098+
1099+
for i := 0; i < 5; i++ {
1100+
fmt.Fprintf(c, "backend i=%d\n", i)
1101+
time.Sleep(time.Second)
1102+
}
1103+
fmt.Fprintln(c, backendEnd)
1104+
t.Error("Backend has not been closed")
10981105
}))
10991106
defer backendServer.Close()
11001107

@@ -1106,9 +1113,16 @@ func TestReverseProxyWebSocket(t *testing.T) {
11061113
return nil
11071114
}
11081115

1116+
triggerCancel := make(chan interface{})
11091117
handler := http.HandlerFunc(func(rw http.ResponseWriter, req *http.Request) {
11101118
rw.Header().Set("X-Header", "X-Value")
1111-
rproxy.ServeHTTP(rw, req)
1119+
ctx, cancel := context.WithCancel(req.Context())
1120+
go func() {
1121+
<-triggerCancel
1122+
fmt.Printf("cancel\n")
1123+
cancel()
1124+
}()
1125+
rproxy.ServeHTTP(rw, req.WithContext(ctx))
11121126
})
11131127

11141128
frontendProxy := httptest.NewServer(handler)
@@ -1120,6 +1134,7 @@ func TestReverseProxyWebSocket(t *testing.T) {
11201134

11211135
c := frontendProxy.Client()
11221136
res, err := c.Do(req)
1137+
close(triggerCancel)
11231138
if err != nil {
11241139
t.Fatal(err)
11251140
}
@@ -1148,13 +1163,18 @@ func TestReverseProxyWebSocket(t *testing.T) {
11481163

11491164
io.WriteString(rwc, "Hello\n")
11501165
bs := bufio.NewScanner(rwc)
1151-
if !bs.Scan() {
1152-
t.Fatalf("Scan: %v", bs.Err())
1153-
}
1154-
got = bs.Text()
1155-
want = `backend got "Hello"`
1156-
if got != want {
1157-
t.Errorf("got %#q, want %#q", got, want)
1166+
for {
1167+
ok := bs.Scan()
1168+
if ok {
1169+
got = bs.Text()
1170+
fmt.Printf("got=%v\n", got)
1171+
if got == backendEnd {
1172+
t.Fatalf("Got end marker from the backend, the websocket was not properly canceled")
1173+
}
1174+
} else {
1175+
fmt.Printf("err %+v\n", bs.Err())
1176+
break
1177+
}
11581178
}
11591179
}
11601180

0 commit comments

Comments
 (0)