Merge pull request #21266 from jtattermusch/fix_compression_empty

Fix C# sending empty payloads with gzip compression
pull/21310/head
Jan Tattermusch 5 years ago committed by GitHub
commit f0db108450
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 20
      src/csharp/Grpc.Core.Tests/CompressionTest.cs
  2. 15
      src/csharp/Grpc.Core.Tests/Internal/SliceBufferSafeHandleTest.cs
  3. 6
      src/csharp/Grpc.Core/Internal/SliceBufferSafeHandle.cs
  4. 6
      src/csharp/ext/grpc_csharp_ext.c

@ -129,5 +129,25 @@ namespace Grpc.Core.Tests
Assert.AreEqual(request, response);
}
[Test]
public void CanReadCompressedMessages_EmptyPayload()
{
var compressionMetadata = new Metadata
{
{ new Metadata.Entry(Metadata.CompressionRequestAlgorithmMetadataKey, "gzip") }
};
helper.UnaryHandler = new UnaryServerMethod<string, string>(async (req, context) =>
{
await context.WriteResponseHeadersAsync(compressionMetadata);
return req;
});
var request = "";
var response = Calls.BlockingUnaryCall(helper.CreateUnaryCall(new CallOptions(compressionMetadata)), request);
Assert.AreEqual(request, response);
}
}
}

@ -33,6 +33,21 @@ namespace Grpc.Core.Internal.Tests
{
sliceBuffer.Complete();
CollectionAssert.AreEqual(new byte[0], sliceBuffer.ToByteArray());
Assert.AreEqual(1, sliceBuffer.TestOnly_GetSliceCount());
}
}
[TestCase]
public void SliceBuffer_CompleteWithEmptyPayload()
{
using (var sliceBuffer = SliceBufferSafeHandle.Create())
{
var destSpan = sliceBuffer.GetSpan(0);
Assert.IsTrue(destSpan.Length > 0); // some non-zero size memory is made available
sliceBuffer.Advance(0);
sliceBuffer.Complete();
CollectionAssert.AreEqual(new byte[0], sliceBuffer.ToByteArray());
Assert.AreEqual(1, sliceBuffer.TestOnly_GetSliceCount());
}
}

@ -130,6 +130,12 @@ namespace Grpc.Core.Internal
return result;
}
// for testing only
public int TestOnly_GetSliceCount()
{
return (int) Native.grpcsharp_slice_buffer_slice_count(this).ToUInt64();
}
private void EnsureBufferSpace(int sizeHint)
{
GrpcPreconditions.CheckArgument(sizeHint >= 0);

@ -1244,7 +1244,11 @@ GPR_EXPORT void* GPR_CALLTYPE grpcsharp_slice_buffer_adjust_tail_space(
}
if (buffer->count == 0) {
return NULL;
// when sending messages, C-core requires that there
// is at least one slice, even for empty payload.
// TODO(jtattermusch): this fix can be removed once
// https://github.com/grpc/grpc/issues/21299 is fixed.
grpc_slice_buffer_add_indexed(buffer, grpc_empty_slice());
}
grpc_slice* last_slice = &(buffer->slices[buffer->count - 1]);
return GRPC_SLICE_END_PTR(*last_slice) - requested_tail_space;

Loading…
Cancel
Save