From 66cd5249103cfe4638864f08462537504b07ff1d Mon Sep 17 00:00:00 2001 From: Menghan Li Date: Wed, 20 Mar 2019 13:32:46 -0700 Subject: [PATCH] transport: stop using http.CloseNotifier in handler server (#2697) --- internal/transport/handler_server.go | 13 ++----------- internal/transport/handler_server_test.go | 20 -------------------- 2 files changed, 2 insertions(+), 31 deletions(-) diff --git a/internal/transport/handler_server.go b/internal/transport/handler_server.go index 695490c4..f2de84d4 100644 --- a/internal/transport/handler_server.go +++ b/internal/transport/handler_server.go @@ -63,9 +63,6 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats sta if _, ok := w.(http.Flusher); !ok { return nil, errors.New("gRPC requires a ResponseWriter supporting http.Flusher") } - if _, ok := w.(http.CloseNotifier); !ok { - return nil, errors.New("gRPC requires a ResponseWriter supporting http.CloseNotifier") - } st := &serverHandlerTransport{ rw: w, @@ -308,19 +305,13 @@ func (ht *serverHandlerTransport) HandleStreams(startStream func(*Stream), trace ctx, cancel = context.WithCancel(ctx) } - // requestOver is closed when either the request's context is done - // or the status has been written via WriteStatus. + // requestOver is closed when the status has been written via WriteStatus. requestOver := make(chan struct{}) - - // clientGone receives a single value if peer is gone, either - // because the underlying connection is dead or because the - // peer sends an http2 RST_STREAM. - clientGone := ht.rw.(http.CloseNotifier).CloseNotify() go func() { select { case <-requestOver: case <-ht.closedCh: - case <-clientGone: + case <-ht.req.Context().Done(): } cancel() ht.Close() diff --git a/internal/transport/handler_server_test.go b/internal/transport/handler_server_test.go index cf989c76..737be7c7 100644 --- a/internal/transport/handler_server_test.go +++ b/internal/transport/handler_server_test.go @@ -98,26 +98,6 @@ func TestHandlerTransport_NewServerHandlerTransport(t *testing.T) { }, wantErr: "gRPC requires a ResponseWriter supporting http.Flusher", }, - { - name: "not closenotifier", - req: &http.Request{ - ProtoMajor: 2, - Method: "POST", - Header: http.Header{ - "Content-Type": {"application/grpc"}, - }, - RequestURI: "/service/foo.bar", - }, - modrw: func(w http.ResponseWriter) http.ResponseWriter { - // Return w without its CloseNotify method - type onlyFlusher interface { - http.ResponseWriter - http.Flusher - } - return struct{ onlyFlusher }{w.(onlyFlusher)} - }, - wantErr: "gRPC requires a ResponseWriter supporting http.CloseNotifier", - }, { name: "valid", req: &http.Request{