@@ -46,24 +46,32 @@ import (
46
46
"google.golang.org/grpc/status"
47
47
)
48
48
49
- // NewServerHandlerTransport returns a ServerTransport handling gRPC
50
- // from inside an http.Handler. It requires that the http Server
51
- // supports HTTP/2.
49
+ // NewServerHandlerTransport returns a ServerTransport handling gRPC from
50
+ // inside an http.Handler, or writes an HTTP error to w and returns an error.
51
+ // It requires that the http Server supports HTTP/2.
52
52
func NewServerHandlerTransport (w http.ResponseWriter , r * http.Request , stats []stats.Handler ) (ServerTransport , error ) {
53
53
if r .ProtoMajor != 2 {
54
- return nil , errors .New ("gRPC requires HTTP/2" )
54
+ msg := "gRPC requires HTTP/2"
55
+ http .Error (w , msg , http .StatusBadRequest )
56
+ return nil , errors .New (msg )
55
57
}
56
58
if r .Method != "POST" {
57
- return nil , errors .New ("invalid gRPC request method" )
59
+ msg := fmt .Sprintf ("invalid gRPC request method %q" , r .Method )
60
+ http .Error (w , msg , http .StatusBadRequest )
61
+ return nil , errors .New (msg )
58
62
}
59
63
contentType := r .Header .Get ("Content-Type" )
60
64
// TODO: do we assume contentType is lowercase? we did before
61
65
contentSubtype , validContentType := grpcutil .ContentSubtype (contentType )
62
66
if ! validContentType {
63
- return nil , errors .New ("invalid gRPC request content-type" )
67
+ msg := fmt .Sprintf ("invalid gRPC request content-type %q" , contentType )
68
+ http .Error (w , msg , http .StatusBadRequest )
69
+ return nil , errors .New (msg )
64
70
}
65
71
if _ , ok := w .(http.Flusher ); ! ok {
66
- return nil , errors .New ("gRPC requires a ResponseWriter supporting http.Flusher" )
72
+ msg := "gRPC requires a ResponseWriter supporting http.Flusher"
73
+ http .Error (w , msg , http .StatusInternalServerError )
74
+ return nil , errors .New (msg )
67
75
}
68
76
69
77
st := & serverHandlerTransport {
@@ -79,7 +87,9 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s
79
87
if v := r .Header .Get ("grpc-timeout" ); v != "" {
80
88
to , err := decodeTimeout (v )
81
89
if err != nil {
82
- return nil , status .Errorf (codes .Internal , "malformed time-out: %v" , err )
90
+ msg := fmt .Sprintf ("malformed time-out: %v" , err )
91
+ http .Error (w , msg , http .StatusBadRequest )
92
+ return nil , status .Error (codes .Internal , msg )
83
93
}
84
94
st .timeoutSet = true
85
95
st .timeout = to
@@ -97,7 +107,9 @@ func NewServerHandlerTransport(w http.ResponseWriter, r *http.Request, stats []s
97
107
for _ , v := range vv {
98
108
v , err := decodeMetadataHeader (k , v )
99
109
if err != nil {
100
- return nil , status .Errorf (codes .Internal , "malformed binary metadata: %v" , err )
110
+ msg := fmt .Sprintf ("malformed binary metadata %q in header %q: %v" , v , k , err )
111
+ http .Error (w , msg , http .StatusBadRequest )
112
+ return nil , status .Error (codes .Internal , msg )
101
113
}
102
114
metakv = append (metakv , k , v )
103
115
}
0 commit comments