@@ -35,7 +35,20 @@ internal sealed class GrpcCallSerializationContext : SerializationContext, IBuff
3535 private int ? _payloadLength ;
3636 private ICompressionProvider ? _compressionProvider ;
3737
38- private bool DirectSerializationSupported => _compressionProvider == null && _payloadLength != null ;
38+ private bool IsDirectSerializationSupported ( out int payloadLength )
39+ {
40+ // Message can be written directly to the buffer if:
41+ // - Its length is known.
42+ // - There is no compression.
43+ if ( _payloadLength != null )
44+ {
45+ payloadLength = _payloadLength . Value ;
46+ return _compressionProvider == null ;
47+ }
48+
49+ payloadLength = 0 ;
50+ return false ;
51+ }
3952
4053 private ArrayBufferWriter < byte > ? _bufferWriter ;
4154 private byte [ ] ? _buffer ;
@@ -172,13 +185,11 @@ public override IBufferWriter<byte> GetBufferWriter()
172185 var bufferWriter = ResolveBufferWriter ( ) ;
173186
174187 // When writing directly to the buffer the header with message size needs to be written first
175- if ( DirectSerializationSupported )
188+ if ( IsDirectSerializationSupported ( out var payloadLength ) )
176189 {
177- CompatibilityHelpers . Assert ( _payloadLength != null , "A payload length is required for direct serialization." ) ;
178-
179- EnsureMessageSizeAllowed ( _payloadLength . Value ) ;
190+ EnsureMessageSizeAllowed ( payloadLength ) ;
180191
181- WriteHeader ( _buffer , _payloadLength . Value , compress : false ) ;
192+ WriteHeader ( _buffer , payloadLength , compress : false ) ;
182193 _bufferPosition += GrpcProtocolConstants . HeaderSize ;
183194 }
184195
@@ -194,11 +205,11 @@ public override IBufferWriter<byte> GetBufferWriter()
194205
195206 private IBufferWriter < byte > ResolveBufferWriter ( )
196207 {
197- if ( DirectSerializationSupported )
208+ if ( IsDirectSerializationSupported ( out var payloadLength ) )
198209 {
199210 if ( _buffer == null )
200211 {
201- _buffer = ArrayPool < byte > . Shared . Rent ( GrpcProtocolConstants . HeaderSize + _payloadLength . GetValueOrDefault ( ) ) ;
212+ _buffer = ArrayPool < byte > . Shared . Rent ( GrpcProtocolConstants . HeaderSize + payloadLength ) ;
202213 }
203214
204215 return this ;
@@ -207,8 +218,8 @@ private IBufferWriter<byte> ResolveBufferWriter()
207218 {
208219 // Initialize buffer writer with exact length if available.
209220 // ArrayBufferWriter doesn't allow zero initial length.
210- _bufferWriter = _payloadLength > 0
211- ? new ArrayBufferWriter < byte > ( _payloadLength . GetValueOrDefault ( ) )
221+ _bufferWriter = payloadLength > 0
222+ ? new ArrayBufferWriter < byte > ( payloadLength )
212223 : new ArrayBufferWriter < byte > ( ) ;
213224 }
214225
@@ -234,7 +245,11 @@ public override void Complete()
234245 case InternalState . IncompleteBufferWriter :
235246 _state = InternalState . CompleteBufferWriter ;
236247
237- if ( ! DirectSerializationSupported )
248+ if ( IsDirectSerializationSupported ( out var payloadLength ) )
249+ {
250+ GrpcCallLog . SerializedMessage ( _call . Logger , _call . RequestType , payloadLength ) ;
251+ }
252+ else
238253 {
239254 CompatibilityHelpers . Assert ( _bufferWriter != null , "Buffer writer has been set to get to this state." ) ;
240255
@@ -243,10 +258,6 @@ public override void Complete()
243258 GrpcCallLog . SerializedMessage ( _call . Logger , _call . RequestType , data . Length ) ;
244259 WriteMessage ( data ) ;
245260 }
246- else
247- {
248- GrpcCallLog . SerializedMessage ( _call . Logger , _call . RequestType , _payloadLength . GetValueOrDefault ( ) ) ;
249- }
250261 break ;
251262 default :
252263 ThrowInvalidState ( _state ) ;
0 commit comments