(t *testing.T)
| 1418 | } |
| 1419 | |
| 1420 | func (s) TestServerWithMisbehavedClient(t *testing.T) { |
| 1421 | server := setUpServerOnly(t, 0, &ServerConfig{BufferPool: mem.DefaultBufferPool()}, suspended) |
| 1422 | defer server.stop() |
| 1423 | // Create a client that can override server stream quota. |
| 1424 | mconn, err := net.Dial("tcp", server.lis.Addr().String()) |
| 1425 | if err != nil { |
| 1426 | t.Fatalf("Clent failed to dial:%v", err) |
| 1427 | } |
| 1428 | defer mconn.Close() |
| 1429 | if err := mconn.SetWriteDeadline(time.Now().Add(time.Second * 10)); err != nil { |
| 1430 | t.Fatalf("Failed to set write deadline: %v", err) |
| 1431 | } |
| 1432 | if n, err := mconn.Write(clientPreface); err != nil || n != len(clientPreface) { |
| 1433 | t.Fatalf("mconn.Write(clientPreface) = %d, %v, want %d, <nil>", n, err, len(clientPreface)) |
| 1434 | } |
| 1435 | // success chan indicates that reader received a RSTStream from server. |
| 1436 | success := make(chan struct{}) |
| 1437 | var mu sync.Mutex |
| 1438 | framer := http2.NewFramer(mconn, mconn) |
| 1439 | if err := framer.WriteSettings(); err != nil { |
| 1440 | t.Fatalf("Error while writing settings: %v", err) |
| 1441 | } |
| 1442 | go func() { // Launch a reader for this misbehaving client. |
| 1443 | for { |
| 1444 | frame, err := framer.ReadFrame() |
| 1445 | if err != nil { |
| 1446 | return |
| 1447 | } |
| 1448 | switch frame := frame.(type) { |
| 1449 | case *http2.PingFrame: |
| 1450 | // Write ping ack back so that server's BDP estimation works right. |
| 1451 | mu.Lock() |
| 1452 | framer.WritePing(true, frame.Data) |
| 1453 | mu.Unlock() |
| 1454 | case *http2.RSTStreamFrame: |
| 1455 | if frame.Header().StreamID != 1 || http2.ErrCode(frame.ErrCode) != http2.ErrCodeFlowControl { |
| 1456 | t.Errorf("RST stream received with streamID: %d and code: %v, want streamID: 1 and code: http2.ErrCodeFlowControl", frame.Header().StreamID, http2.ErrCode(frame.ErrCode)) |
| 1457 | } |
| 1458 | close(success) |
| 1459 | return |
| 1460 | default: |
| 1461 | // Do nothing. |
| 1462 | } |
| 1463 | |
| 1464 | } |
| 1465 | }() |
| 1466 | // Create a stream. |
| 1467 | var buf bytes.Buffer |
| 1468 | henc := hpack.NewEncoder(&buf) |
| 1469 | // TODO(mmukhi): Remove unnecessary fields. |
| 1470 | if err := henc.WriteField(hpack.HeaderField{Name: ":method", Value: "POST"}); err != nil { |
| 1471 | t.Fatalf("Error while encoding header: %v", err) |
| 1472 | } |
| 1473 | if err := henc.WriteField(hpack.HeaderField{Name: ":path", Value: "foo"}); err != nil { |
| 1474 | t.Fatalf("Error while encoding header: %v", err) |
| 1475 | } |
| 1476 | if err := henc.WriteField(hpack.HeaderField{Name: ":authority", Value: "localhost"}); err != nil { |
| 1477 | t.Fatalf("Error while encoding header: %v", err) |
nothing calls this directly
no test coverage detected