@@ -1075,7 +1075,8 @@ func TestSelectFlushInterval(t *testing.T) {
1075
1075
}
1076
1076
}
1077
1077
1078
- func TestReverseProxyWebSocket (t * testing.T ) {
1078
+ func TestReverseProxyWebSocketCancelation (t * testing.T ) {
1079
+ backendEnd := "backendEnd"
1079
1080
backendServer := httptest .NewServer (http .HandlerFunc (func (w http.ResponseWriter , r * http.Request ) {
1080
1081
if upgradeType (r .Header ) != "websocket" {
1081
1082
t .Error ("unexpected backend request" )
@@ -1094,7 +1095,13 @@ func TestReverseProxyWebSocket(t *testing.T) {
1094
1095
t .Errorf ("backend failed to read line from client: %v" , bs .Err ())
1095
1096
return
1096
1097
}
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" )
1098
1105
}))
1099
1106
defer backendServer .Close ()
1100
1107
@@ -1106,9 +1113,16 @@ func TestReverseProxyWebSocket(t *testing.T) {
1106
1113
return nil
1107
1114
}
1108
1115
1116
+ triggerCancel := make (chan interface {})
1109
1117
handler := http .HandlerFunc (func (rw http.ResponseWriter , req * http.Request ) {
1110
1118
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 ))
1112
1126
})
1113
1127
1114
1128
frontendProxy := httptest .NewServer (handler )
@@ -1120,6 +1134,7 @@ func TestReverseProxyWebSocket(t *testing.T) {
1120
1134
1121
1135
c := frontendProxy .Client ()
1122
1136
res , err := c .Do (req )
1137
+ close (triggerCancel )
1123
1138
if err != nil {
1124
1139
t .Fatal (err )
1125
1140
}
@@ -1148,13 +1163,18 @@ func TestReverseProxyWebSocket(t *testing.T) {
1148
1163
1149
1164
io .WriteString (rwc , "Hello\n " )
1150
1165
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
+ }
1158
1178
}
1159
1179
}
1160
1180
0 commit comments