@@ -21,6 +21,7 @@ package transport
21
21
import (
22
22
"bytes"
23
23
"context"
24
+ "errors"
24
25
"fmt"
25
26
"io"
26
27
"math"
@@ -293,7 +294,7 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport,
293
294
294
295
defer func () {
295
296
if err != nil {
296
- t .Close ()
297
+ t .Close (err )
297
298
}
298
299
}()
299
300
@@ -331,10 +332,9 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport,
331
332
go func () {
332
333
t .loopy = newLoopyWriter (serverSide , t .framer , t .controlBuf , t .bdpEst )
333
334
t .loopy .ssGoAwayHandler = t .outgoingGoAwayHandler
334
- if err := t .loopy .run (); err != nil {
335
- if logger .V (logLevel ) {
336
- logger .Errorf ("transport: loopyWriter.run returning. Err: %v" , err )
337
- }
335
+ err := t .loopy .run ()
336
+ if logger .V (logLevel ) {
337
+ logger .Infof ("transport: loopyWriter exited. Closing connection. Err: %v" , err )
338
338
}
339
339
t .conn .Close ()
340
340
t .controlBuf .finish ()
@@ -344,8 +344,9 @@ func NewServerTransport(conn net.Conn, config *ServerConfig) (_ ServerTransport,
344
344
return t , nil
345
345
}
346
346
347
- // operateHeader takes action on the decoded headers.
348
- func (t * http2Server ) operateHeaders (frame * http2.MetaHeadersFrame , handle func (* Stream ), traceCtx func (context.Context , string ) context.Context ) (fatal bool ) {
347
+ // operateHeaders takes action on the decoded headers. Returns an error if fatal
348
+ // error encountered and transport needs to close, otherwise returns nil.
349
+ func (t * http2Server ) operateHeaders (frame * http2.MetaHeadersFrame , handle func (* Stream ), traceCtx func (context.Context , string ) context.Context ) error {
349
350
// Acquire max stream ID lock for entire duration
350
351
t .maxStreamMu .Lock ()
351
352
defer t .maxStreamMu .Unlock ()
@@ -361,15 +362,12 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
361
362
rstCode : http2 .ErrCodeFrameSize ,
362
363
onWrite : func () {},
363
364
})
364
- return false
365
+ return nil
365
366
}
366
367
367
368
if streamID % 2 != 1 || streamID <= t .maxStreamID {
368
369
// illegal gRPC stream id.
369
- if logger .V (logLevel ) {
370
- logger .Errorf ("transport: http2Server.HandleStreams received an illegal stream id: %v" , streamID )
371
- }
372
- return true
370
+ return fmt .Errorf ("received an illegal stream id: %v. headers frame: %+v" , streamID , frame )
373
371
}
374
372
t .maxStreamID = streamID
375
373
@@ -453,7 +451,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
453
451
status : status .New (codes .Internal , errMsg ),
454
452
rst : ! frame .StreamEnded (),
455
453
})
456
- return false
454
+ return nil
457
455
}
458
456
459
457
if ! isGRPC || headerError {
@@ -463,7 +461,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
463
461
rstCode : http2 .ErrCodeProtocol ,
464
462
onWrite : func () {},
465
463
})
466
- return false
464
+ return nil
467
465
}
468
466
469
467
// "If :authority is missing, Host must be renamed to :authority." - A41
@@ -503,7 +501,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
503
501
if t .state != reachable {
504
502
t .mu .Unlock ()
505
503
s .cancel ()
506
- return false
504
+ return nil
507
505
}
508
506
if uint32 (len (t .activeStreams )) >= t .maxStreams {
509
507
t .mu .Unlock ()
@@ -514,7 +512,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
514
512
onWrite : func () {},
515
513
})
516
514
s .cancel ()
517
- return false
515
+ return nil
518
516
}
519
517
if httpMethod != http .MethodPost {
520
518
t .mu .Unlock ()
@@ -530,7 +528,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
530
528
rst : ! frame .StreamEnded (),
531
529
})
532
530
s .cancel ()
533
- return false
531
+ return nil
534
532
}
535
533
if t .inTapHandle != nil {
536
534
var err error
@@ -550,7 +548,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
550
548
status : stat ,
551
549
rst : ! frame .StreamEnded (),
552
550
})
553
- return false
551
+ return nil
554
552
}
555
553
}
556
554
t .activeStreams [streamID ] = s
@@ -597,7 +595,7 @@ func (t *http2Server) operateHeaders(frame *http2.MetaHeadersFrame, handle func(
597
595
wq : s .wq ,
598
596
})
599
597
handle (s )
600
- return false
598
+ return nil
601
599
}
602
600
603
601
// HandleStreams receives incoming streams using the given handler. This is
@@ -630,19 +628,16 @@ func (t *http2Server) HandleStreams(handle func(*Stream), traceCtx func(context.
630
628
continue
631
629
}
632
630
if err == io .EOF || err == io .ErrUnexpectedEOF {
633
- t .Close ()
631
+ t .Close (err )
634
632
return
635
633
}
636
- if logger .V (logLevel ) {
637
- logger .Warningf ("transport: http2Server.HandleStreams failed to read frame: %v" , err )
638
- }
639
- t .Close ()
634
+ t .Close (err )
640
635
return
641
636
}
642
637
switch frame := frame .(type ) {
643
638
case * http2.MetaHeadersFrame :
644
- if t .operateHeaders (frame , handle , traceCtx ) {
645
- t .Close ()
639
+ if err := t .operateHeaders (frame , handle , traceCtx ); err != nil {
640
+ t .Close (err )
646
641
break
647
642
}
648
643
case * http2.DataFrame :
@@ -886,10 +881,7 @@ func (t *http2Server) handlePing(f *http2.PingFrame) {
886
881
887
882
if t .pingStrikes > maxPingStrikes {
888
883
// Send goaway and close the connection.
889
- if logger .V (logLevel ) {
890
- logger .Errorf ("transport: Got too many pings from the client, closing the connection." )
891
- }
892
- t .controlBuf .put (& goAway {code : http2 .ErrCodeEnhanceYourCalm , debugData : []byte ("too_many_pings" ), closeConn : true })
884
+ t .controlBuf .put (& goAway {code : http2 .ErrCodeEnhanceYourCalm , debugData : []byte ("too_many_pings" ), closeConn : errors .New ("got too many pings from the client" )})
893
885
}
894
886
}
895
887
@@ -1169,10 +1161,7 @@ func (t *http2Server) keepalive() {
1169
1161
continue
1170
1162
}
1171
1163
if outstandingPing && kpTimeoutLeft <= 0 {
1172
- if logger .V (logLevel ) {
1173
- logger .Infof ("transport: closing server transport due to idleness." )
1174
- }
1175
- t .Close ()
1164
+ t .Close (fmt .Errorf ("keepalive ping not acked within timeout %s" , t .kp .Time ))
1176
1165
return
1177
1166
}
1178
1167
if ! outstandingPing {
@@ -1199,12 +1188,15 @@ func (t *http2Server) keepalive() {
1199
1188
// Close starts shutting down the http2Server transport.
1200
1189
// TODO(zhaoq): Now the destruction is not blocked on any pending streams. This
1201
1190
// could cause some resource issue. Revisit this later.
1202
- func (t * http2Server ) Close () {
1191
+ func (t * http2Server ) Close (err error ) {
1203
1192
t .mu .Lock ()
1204
1193
if t .state == closing {
1205
1194
t .mu .Unlock ()
1206
1195
return
1207
1196
}
1197
+ if logger .V (logLevel ) {
1198
+ logger .Infof ("transport: closing: %v" , err )
1199
+ }
1208
1200
t .state = closing
1209
1201
streams := t .activeStreams
1210
1202
t .activeStreams = nil
@@ -1319,19 +1311,20 @@ func (t *http2Server) outgoingGoAwayHandler(g *goAway) (bool, error) {
1319
1311
// Stop accepting more streams now.
1320
1312
t .state = draining
1321
1313
sid := t .maxStreamID
1314
+ retErr := g .closeConn
1322
1315
if len (t .activeStreams ) == 0 {
1323
- g . closeConn = true
1316
+ retErr = errors . New ( "second GOAWAY written and no active streams left to process" )
1324
1317
}
1325
1318
t .mu .Unlock ()
1326
1319
t .maxStreamMu .Unlock ()
1327
1320
if err := t .framer .fr .WriteGoAway (sid , g .code , g .debugData ); err != nil {
1328
1321
return false , err
1329
1322
}
1330
- if g . closeConn {
1323
+ if retErr != nil {
1331
1324
// Abruptly close the connection following the GoAway (via
1332
1325
// loopywriter). But flush out what's inside the buffer first.
1333
1326
t .framer .writer .Flush ()
1334
- return false , fmt . Errorf ( "transport: Connection closing" )
1327
+ return false , retErr
1335
1328
}
1336
1329
return true , nil
1337
1330
}
0 commit comments