@@ -35,7 +35,20 @@ internal sealed class GrpcCallSerializationContext : SerializationContext, IBuff
35
35
private int ? _payloadLength ;
36
36
private ICompressionProvider ? _compressionProvider ;
37
37
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
+ }
39
52
40
53
private ArrayBufferWriter < byte > ? _bufferWriter ;
41
54
private byte [ ] ? _buffer ;
@@ -172,13 +185,11 @@ public override IBufferWriter<byte> GetBufferWriter()
172
185
var bufferWriter = ResolveBufferWriter ( ) ;
173
186
174
187
// 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 ) )
176
189
{
177
- CompatibilityHelpers . Assert ( _payloadLength != null , "A payload length is required for direct serialization." ) ;
178
-
179
- EnsureMessageSizeAllowed ( _payloadLength . Value ) ;
190
+ EnsureMessageSizeAllowed ( payloadLength ) ;
180
191
181
- WriteHeader ( _buffer , _payloadLength . Value , compress : false ) ;
192
+ WriteHeader ( _buffer , payloadLength , compress : false ) ;
182
193
_bufferPosition += GrpcProtocolConstants . HeaderSize ;
183
194
}
184
195
@@ -194,11 +205,11 @@ public override IBufferWriter<byte> GetBufferWriter()
194
205
195
206
private IBufferWriter < byte > ResolveBufferWriter ( )
196
207
{
197
- if ( DirectSerializationSupported )
208
+ if ( IsDirectSerializationSupported ( out var payloadLength ) )
198
209
{
199
210
if ( _buffer == null )
200
211
{
201
- _buffer = ArrayPool < byte > . Shared . Rent ( GrpcProtocolConstants . HeaderSize + _payloadLength . GetValueOrDefault ( ) ) ;
212
+ _buffer = ArrayPool < byte > . Shared . Rent ( GrpcProtocolConstants . HeaderSize + payloadLength ) ;
202
213
}
203
214
204
215
return this ;
@@ -207,8 +218,8 @@ private IBufferWriter<byte> ResolveBufferWriter()
207
218
{
208
219
// Initialize buffer writer with exact length if available.
209
220
// 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 )
212
223
: new ArrayBufferWriter < byte > ( ) ;
213
224
}
214
225
@@ -234,7 +245,11 @@ public override void Complete()
234
245
case InternalState . IncompleteBufferWriter :
235
246
_state = InternalState . CompleteBufferWriter ;
236
247
237
- if ( ! DirectSerializationSupported )
248
+ if ( IsDirectSerializationSupported ( out var payloadLength ) )
249
+ {
250
+ GrpcCallLog . SerializedMessage ( _call . Logger , _call . RequestType , payloadLength ) ;
251
+ }
252
+ else
238
253
{
239
254
CompatibilityHelpers . Assert ( _bufferWriter != null , "Buffer writer has been set to get to this state." ) ;
240
255
@@ -243,10 +258,6 @@ public override void Complete()
243
258
GrpcCallLog . SerializedMessage ( _call . Logger , _call . RequestType , data . Length ) ;
244
259
WriteMessage ( data ) ;
245
260
}
246
- else
247
- {
248
- GrpcCallLog . SerializedMessage ( _call . Logger , _call . RequestType , _payloadLength . GetValueOrDefault ( ) ) ;
249
- }
250
261
break ;
251
262
default :
252
263
ThrowInvalidState ( _state ) ;
0 commit comments