Skip to content

Commit 0a37300

Browse files
authored
Don't write response grpc-encoding header when identity (#1047)
1 parent 84f6a3e commit 0a37300

File tree

4 files changed

+14
-22
lines changed

4 files changed

+14
-22
lines changed

src/Grpc.AspNetCore.Server/Internal/GrpcProtocolConstants.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,8 @@ internal static class GrpcProtocolConstants
3434
internal static readonly string Http2Protocol = HttpProtocol.Http2;
3535
#else
3636
internal const string Http2Protocol = "HTTP/2";
37-
#endif
3837
internal const string Http20Protocol = "HTTP/2.0"; // This is what IIS sets
38+
#endif
3939

4040
#if NET5_0
4141
internal static readonly string TimeoutHeader = HeaderNames.GrpcTimeout;

src/Grpc.AspNetCore.Server/Internal/HttpContextSerializationContext.cs

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -70,20 +70,11 @@ public void Reset()
7070

7171
private ICompressionProvider? ResolveCompressionProvider()
7272
{
73-
Debug.Assert(
74-
_serverCallContext.ResponseGrpcEncoding != null,
75-
"Response encoding should have been calculated at this point.");
76-
77-
var canCompress =
73+
if (_serverCallContext.ResponseGrpcEncoding != null &&
7874
GrpcProtocolHelpers.CanWriteCompressed(_serverCallContext.WriteOptions) &&
79-
!GrpcProtocolConstants.IsGrpcEncodingIdentity(_serverCallContext.ResponseGrpcEncoding);
80-
81-
if (canCompress)
75+
_serverCallContext.Options.CompressionProviders.TryGetValue(_serverCallContext.ResponseGrpcEncoding, out var compressionProvider))
8276
{
83-
if (_serverCallContext.Options.CompressionProviders.TryGetValue(_serverCallContext.ResponseGrpcEncoding, out var compressionProvider))
84-
{
85-
return compressionProvider;
86-
}
77+
return compressionProvider;
8778
}
8879

8980
return null;

src/Grpc.AspNetCore.Server/Internal/HttpContextServerCallContext.cs

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -382,12 +382,13 @@ public void Initialize(ISystemClock? clock = null)
382382
{
383383
ResponseGrpcEncoding = serviceDefaultCompression;
384384
}
385-
else
385+
386+
// grpc-encoding response header is optional and is inferred as 'identity' when not present.
387+
// Only write a non-identity value for performance.
388+
if (ResponseGrpcEncoding != null)
386389
{
387-
ResponseGrpcEncoding = GrpcProtocolConstants.IdentityGrpcEncoding;
390+
HttpContext.Response.Headers[GrpcProtocolConstants.MessageEncodingHeader] = ResponseGrpcEncoding;
388391
}
389-
390-
HttpContext.Response.Headers[GrpcProtocolConstants.MessageEncodingHeader] = ResponseGrpcEncoding;
391392
}
392393

393394
private Activity? GetHostActivity()
@@ -530,11 +531,11 @@ internal bool IsEncodingInRequestAcceptEncoding(string encoding)
530531

531532
internal void ValidateAcceptEncodingContainsResponseEncoding()
532533
{
533-
Debug.Assert(ResponseGrpcEncoding != null);
534+
var resolvedResponseGrpcEncoding = ResponseGrpcEncoding ?? GrpcProtocolConstants.IdentityGrpcEncoding;
534535

535-
if (!IsEncodingInRequestAcceptEncoding(ResponseGrpcEncoding))
536+
if (!IsEncodingInRequestAcceptEncoding(resolvedResponseGrpcEncoding))
536537
{
537-
GrpcServerLog.EncodingNotInAcceptEncoding(Logger, ResponseGrpcEncoding);
538+
GrpcServerLog.EncodingNotInAcceptEncoding(Logger, resolvedResponseGrpcEncoding);
538539
}
539540
}
540541
}

test/FunctionalTests/Server/CompressionTests.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -210,7 +210,7 @@ public async Task SendCompressedMessage_ServiceHasNoCompressionConfigured_Respon
210210

211211
// Assert
212212
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
213-
Assert.AreEqual("identity", response.Headers.GetValues(GrpcProtocolConstants.MessageEncodingHeader).Single());
213+
Assert.IsFalse(response.Headers.Contains(GrpcProtocolConstants.MessageEncodingHeader));
214214

215215
var responseMessage = MessageHelpers.AssertReadMessage<HelloReply>(await response.Content.ReadAsByteArrayAsync().DefaultTimeout());
216216
Assert.AreEqual("Hello World", responseMessage.Message);
@@ -490,7 +490,7 @@ public async Task SendIdentityGrpcAcceptEncodingToServiceWithCompression_Respons
490490

491491
// Assert
492492
Assert.AreEqual(HttpStatusCode.OK, response.StatusCode);
493-
Assert.AreEqual("identity", response.Headers.GetValues(GrpcProtocolConstants.MessageEncodingHeader).Single());
493+
Assert.IsFalse(response.Headers.Contains(GrpcProtocolConstants.MessageEncodingHeader));
494494

495495
var responseMessage = MessageHelpers.AssertReadMessage<HelloReply>(await response.Content.ReadAsByteArrayAsync().DefaultTimeout());
496496
Assert.AreEqual("Hello World", responseMessage.Message);

0 commit comments

Comments
 (0)