@@ -950,6 +950,8 @@ func (sc *serverConn) serve() {
950950 }
951951 case * startPushRequest :
952952 sc .startPush (v )
953+ case func (* serverConn ):
954+ v (sc )
953955 default :
954956 panic (fmt .Sprintf ("unexpected type %T" , v ))
955957 }
@@ -2686,23 +2688,85 @@ func (rws *responseWriterState) promoteUndeclaredTrailers() {
26862688 }
26872689}
26882690
2691+ func (w * responseWriter ) SetReadDeadline (deadline time.Time ) error {
2692+ st := w .rws .stream
2693+ if ! deadline .IsZero () && deadline .Before (time .Now ()) {
2694+ // If we're setting a deadline in the past, reset the stream immediately
2695+ // so writes after SetWriteDeadline returns will fail.
2696+ st .onReadTimeout ()
2697+ return nil
2698+ }
2699+ w .rws .conn .sendServeMsg (func (sc * serverConn ) {
2700+ if st .readDeadline != nil {
2701+ if ! st .readDeadline .Stop () {
2702+ // Deadline already exceeded, or stream has been closed.
2703+ return
2704+ }
2705+ }
2706+ if deadline .IsZero () {
2707+ st .readDeadline = nil
2708+ } else if st .readDeadline == nil {
2709+ st .readDeadline = time .AfterFunc (deadline .Sub (time .Now ()), st .onReadTimeout )
2710+ } else {
2711+ st .readDeadline .Reset (deadline .Sub (time .Now ()))
2712+ }
2713+ })
2714+ return nil
2715+ }
2716+
2717+ func (w * responseWriter ) SetWriteDeadline (deadline time.Time ) error {
2718+ st := w .rws .stream
2719+ if ! deadline .IsZero () && deadline .Before (time .Now ()) {
2720+ // If we're setting a deadline in the past, reset the stream immediately
2721+ // so writes after SetWriteDeadline returns will fail.
2722+ st .onWriteTimeout ()
2723+ return nil
2724+ }
2725+ w .rws .conn .sendServeMsg (func (sc * serverConn ) {
2726+ if st .writeDeadline != nil {
2727+ if ! st .writeDeadline .Stop () {
2728+ // Deadline already exceeded, or stream has been closed.
2729+ return
2730+ }
2731+ }
2732+ if deadline .IsZero () {
2733+ st .writeDeadline = nil
2734+ } else if st .writeDeadline == nil {
2735+ st .writeDeadline = time .AfterFunc (deadline .Sub (time .Now ()), st .onWriteTimeout )
2736+ } else {
2737+ st .writeDeadline .Reset (deadline .Sub (time .Now ()))
2738+ }
2739+ })
2740+ return nil
2741+ }
2742+
26892743func (w * responseWriter ) Flush () {
2744+ w .FlushError ()
2745+ }
2746+
2747+ func (w * responseWriter ) FlushError () error {
26902748 rws := w .rws
26912749 if rws == nil {
26922750 panic ("Header called after Handler finished" )
26932751 }
2752+ var err error
26942753 if rws .bw .Buffered () > 0 {
2695- if err := rws .bw .Flush (); err != nil {
2696- // Ignore the error. The frame writer already knows.
2697- return
2698- }
2754+ err = rws .bw .Flush ()
26992755 } else {
27002756 // The bufio.Writer won't call chunkWriter.Write
27012757 // (writeChunk with zero bytes, so we have to do it
27022758 // ourselves to force the HTTP response header and/or
27032759 // final DATA frame (with END_STREAM) to be sent.
2704- rws .writeChunk (nil )
2760+ _ , err = chunkWriter {rws }.Write (nil )
2761+ if err == nil {
2762+ select {
2763+ case <- rws .stream .cw :
2764+ err = rws .stream .closeErr
2765+ default :
2766+ }
2767+ }
27052768 }
2769+ return err
27062770}
27072771
27082772func (w * responseWriter ) CloseNotify () <- chan bool {
0 commit comments