@@ -19,7 +19,7 @@ type streamHandler interface {
1919 handlePushStream (* stream ) error
2020 handleEncoderStream (* stream ) error
2121 handleDecoderStream (* stream ) error
22- handleRequestStream (* stream )
22+ handleRequestStream (* stream ) error
2323 abort (error )
2424}
2525
@@ -43,7 +43,7 @@ func (c *genericConn) acceptStreams(qconn *quic.Conn, h streamHandler) {
4343 if st .IsReadOnly () {
4444 go c .handleUnidirectionalStream (newStream (st ), h )
4545 } else {
46- go h .handleRequestStream (newStream (st ))
46+ go c .handleRequestStream (newStream (st ), h )
4747 }
4848 }
4949}
@@ -81,7 +81,6 @@ func (c *genericConn) handleUnidirectionalStream(st *stream, h streamHandler) {
8181 // but the quic package currently doesn't allow setting error codes
8282 // for STOP_SENDING frames.
8383 // TODO: Should CloseRead take an error code?
84- st .stream .CloseRead ()
8584 err = nil
8685 }
8786 if err == io .EOF {
@@ -90,8 +89,26 @@ func (c *genericConn) handleUnidirectionalStream(st *stream, h streamHandler) {
9089 message : streamType (stype ).String () + " stream closed" ,
9190 }
9291 }
93- if err != nil {
92+ c .handleStreamError (st , h , err )
93+ }
94+
95+ func (c * genericConn ) handleRequestStream (st * stream , h streamHandler ) {
96+ c .handleStreamError (st , h , h .handleRequestStream (st ))
97+ }
98+
99+ func (c * genericConn ) handleStreamError (st * stream , h streamHandler , err error ) {
100+ switch err := err .(type ) {
101+ case * connectionError :
94102 h .abort (err )
103+ case nil :
104+ st .stream .CloseRead ()
105+ st .stream .CloseWrite ()
106+ case * streamError :
107+ st .stream .CloseRead ()
108+ st .stream .Reset (uint64 (err .code ))
109+ default :
110+ st .stream .CloseRead ()
111+ st .stream .Reset (uint64 (errH3InternalError ))
95112 }
96113}
97114
0 commit comments