@@ -39,15 +39,15 @@ public GrpcWebMiddleware(IOptions<GrpcWebOptions> options, ILogger<GrpcWebMiddle
3939
4040 public Task Invoke ( HttpContext httpContext )
4141 {
42- var mode = GetGrpcWebMode ( httpContext ) ;
43- if ( mode != ServerGrpcWebMode . None )
42+ var grcpWebContext = GetGrpcWebContext ( httpContext ) ;
43+ if ( grcpWebContext . Request != ServerGrpcWebMode . None )
4444 {
4545 Log . DetectedGrpcWebRequest ( _logger , httpContext . Request . ContentType ! ) ;
4646
4747 var metadata = httpContext . GetEndpoint ( ) ? . Metadata . GetMetadata < IGrpcWebEnabledMetadata > ( ) ;
4848 if ( metadata ? . GrpcWebEnabled ?? _options . DefaultEnabled )
4949 {
50- return HandleGrpcWebRequest ( httpContext , mode ) ;
50+ return HandleGrpcWebRequest ( httpContext , grcpWebContext ) ;
5151 }
5252
5353 Log . GrpcWebRequestNotProcessed ( _logger ) ;
@@ -56,9 +56,9 @@ public Task Invoke(HttpContext httpContext)
5656 return _next ( httpContext ) ;
5757 }
5858
59- private async Task HandleGrpcWebRequest ( HttpContext httpContext , ServerGrpcWebMode mode )
59+ private async Task HandleGrpcWebRequest ( HttpContext httpContext , ServerGrpcWebContext grcpWebContext )
6060 {
61- var feature = new GrpcWebFeature ( mode , httpContext ) ;
61+ var feature = new GrpcWebFeature ( grcpWebContext , httpContext ) ;
6262
6363 var initialProtocol = httpContext . Request . Protocol ;
6464
@@ -75,7 +75,7 @@ private async Task HandleGrpcWebRequest(HttpContext httpContext, ServerGrpcWebMo
7575
7676 if ( CommonGrpcProtocolHelpers . IsContentType ( GrpcWebProtocolConstants . GrpcContentType , httpContext . Response . ContentType ! ) )
7777 {
78- var contentType = mode == ServerGrpcWebMode . GrpcWeb
78+ var contentType = grcpWebContext . Response == ServerGrpcWebMode . GrpcWeb
7979 ? GrpcWebProtocolConstants . GrpcWebContentType
8080 : GrpcWebProtocolConstants . GrpcWebTextContentType ;
8181 var responseContentType = ResolveContentType ( contentType , httpContext . Response . ContentType ) ;
@@ -111,21 +111,46 @@ private static string ResolveContentType(string newContentType, string originalC
111111 return newContentType ;
112112 }
113113
114- internal static ServerGrpcWebMode GetGrpcWebMode ( HttpContext httpContext )
114+ internal static ServerGrpcWebContext GetGrpcWebContext ( HttpContext httpContext )
115115 {
116- if ( HttpMethods . IsPost ( httpContext . Request . Method ) )
116+ var serverContext = new ServerGrpcWebContext ( ) ;
117+
118+ if ( TryGetWebMode ( httpContext . Request . ContentType , out var requestMode ) )
117119 {
118- if ( CommonGrpcProtocolHelpers . IsContentType ( GrpcWebProtocolConstants . GrpcWebContentType , httpContext . Request . ContentType ) )
120+ serverContext . Request = requestMode ;
121+
122+ if ( TryGetWebMode ( httpContext . Request . Headers [ "Accept" ] , out var responseMode ) )
119123 {
120- return ServerGrpcWebMode . GrpcWeb ;
124+ serverContext . Response = responseMode ;
121125 }
122- else if ( CommonGrpcProtocolHelpers . IsContentType ( GrpcWebProtocolConstants . GrpcWebTextContentType , httpContext . Request . ContentType ) )
126+ else
123127 {
124- return ServerGrpcWebMode . GrpcWebText ;
128+ // If there isn't a request 'accept' header then default to mode to 'application/grpc`.
129+ serverContext . Response = ServerGrpcWebMode . GrpcWeb ;
125130 }
126131 }
127-
128- return ServerGrpcWebMode . None ;
132+
133+ return serverContext ;
134+ }
135+
136+ private static bool TryGetWebMode ( string ? contentType , out ServerGrpcWebMode mode )
137+ {
138+ if ( ! string . IsNullOrEmpty ( contentType ) )
139+ {
140+ if ( CommonGrpcProtocolHelpers . IsContentType ( GrpcWebProtocolConstants . GrpcWebContentType , contentType ) )
141+ {
142+ mode = ServerGrpcWebMode . GrpcWeb ;
143+ return true ;
144+ }
145+ else if ( CommonGrpcProtocolHelpers . IsContentType ( GrpcWebProtocolConstants . GrpcWebTextContentType , contentType ) )
146+ {
147+ mode = ServerGrpcWebMode . GrpcWebText ;
148+ return true ;
149+ }
150+ }
151+
152+ mode = ServerGrpcWebMode . None ;
153+ return false ;
129154 }
130155
131156 private static class Log
0 commit comments