MCPcopy
hub / github.com/gin-gonic/gin / TestResponseWriterHijackAfterWriteHeaderNow

Function TestResponseWriterHijackAfterWriteHeaderNow

response_writer_test.go:198–253  ·  response_writer_test.go::TestResponseWriterHijackAfterWriteHeaderNow

Test: WebSocket compatibility - allow hijack after WriteHeaderNow(), but block after body data.

(t *testing.T)

Source from the content-addressed store, hash-verified

196
197// Test: WebSocket compatibility - allow hijack after WriteHeaderNow(), but block after body data.
198func TestResponseWriterHijackAfterWriteHeaderNow(t *testing.T) {
199 tests := []struct {
200 name string
201 action func(w ResponseWriter) error
202 expectWrittenBeforeHijack bool
203 expectHijackSuccess bool
204 expectWrittenAfterHijack bool
205 expectError error
206 }{
207 {
208 name: "hijack after WriteHeaderNow only should succeed (websocket pattern)",
209 action: func(w ResponseWriter) error {
210 w.WriteHeaderNow() // Simulate websocket.Accept() behavior
211 return nil
212 },
213 expectWrittenBeforeHijack: true,
214 expectHijackSuccess: true, // NEW BEHAVIOR: allow hijack after just header write
215 expectWrittenAfterHijack: true,
216 expectError: nil,
217 },
218 {
219 name: "hijack after WriteHeaderNow + Write should fail",
220 action: func(w ResponseWriter) error {
221 w.WriteHeaderNow()
222 _, err := w.Write([]byte("test"))
223 return err
224 },
225 expectWrittenBeforeHijack: true,
226 expectHijackSuccess: false,
227 expectWrittenAfterHijack: true,
228 expectError: errHijackAlreadyWritten,
229 },
230 }
231 for _, tc := range tests {
232 t.Run(tc.name, func(t *testing.T) {
233 hijacker := &mockHijacker{ResponseRecorder: httptest.NewRecorder()}
234 writer := &responseWriter{}
235 writer.reset(hijacker)
236 w := ResponseWriter(writer)
237
238 require.NoError(t, tc.action(w), "unexpected error during pre-hijack action")
239
240 assert.Equal(t, tc.expectWrittenBeforeHijack, w.Written(), "unexpected w.Written() state before hijack")
241
242 _, _, hijackErr := w.Hijack()
243
244 if tc.expectError == nil {
245 require.NoError(t, hijackErr, "expected hijack to succeed")
246 } else {
247 require.ErrorIs(t, hijackErr, tc.expectError, "unexpected error from Hijack()")
248 }
249 assert.Equal(t, tc.expectHijackSuccess, hijacker.hijacked, "unexpected hijacker.hijacked state")
250 assert.Equal(t, tc.expectWrittenAfterHijack, w.Written(), "unexpected w.Written() state after hijack")
251 })
252 }
253}
254
255func TestResponseWriterFlush(t *testing.T) {

Callers

nothing calls this directly

Calls 7

resetMethod · 0.95
ResponseWriterInterface · 0.85
RunMethod · 0.80
WriteHeaderNowMethod · 0.65
WrittenMethod · 0.65
WriteMethod · 0.45
HijackMethod · 0.45

Tested by

no test coverage detected