@@ -129,6 +129,7 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
129
129
)
130
130
yield binding_serializer
131
131
content_length = payload .tell ()
132
+ payload .seek (0 )
132
133
else :
133
134
payload = BytesIO ()
134
135
payload_serializer = self ._payload_codec .create_serializer (payload )
@@ -154,8 +155,8 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
154
155
binding_matcher ,
155
156
)
156
157
yield binding_serializer
158
+ payload .seek (0 )
157
159
158
- self ._seek (payload , 0 )
159
160
headers = binding_serializer .header_serializer .headers
160
161
if content_type is not None :
161
162
headers .append (("content-type" , content_type ))
@@ -165,7 +166,7 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
165
166
166
167
fields = tuples_to_fields (headers )
167
168
if content_length_required and "content-length" not in fields :
168
- content_length = self . _compute_content_length (payload )
169
+ content_length = _compute_content_length (payload )
169
170
if content_length is None :
170
171
raise SerializationError (
171
172
"This operation requires the the content length of the input "
@@ -187,17 +188,24 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
187
188
body = payload ,
188
189
)
189
190
190
- def _seek (self , payload : Any , pos : int , whence : int = 0 ) -> None :
191
- if (
192
- seek := getattr (payload , "seek" , None )
193
- ) is not None and not iscoroutinefunction (seek ):
194
- seek (pos , whence )
195
191
196
- def _compute_content_length (self , payload : Any ) -> int | None :
197
- content_length = self ._seek (payload , 0 , 2 )
198
- if content_length is not None :
199
- self ._seek (payload , 0 , 0 )
192
+ def _compute_content_length (payload : Any ) -> int | None :
193
+ if (tell := getattr (payload , "tell" , None )) is not None and not iscoroutinefunction (
194
+ tell
195
+ ):
196
+ start : int = tell ()
197
+ if (end := _seek (payload , 0 , 2 )) is not None :
198
+ content_length : int = end - start
199
+ _seek (payload , start , 0 )
200
200
return content_length
201
+ return None
202
+
203
+
204
+ def _seek (payload : Any , pos : int , whence : int = 0 ) -> None :
205
+ if (seek := getattr (payload , "seek" , None )) is not None and not iscoroutinefunction (
206
+ seek
207
+ ):
208
+ seek (pos , whence )
201
209
202
210
203
211
class HTTPRequestBindingSerializer (InterceptingSerializer ):
@@ -303,6 +311,7 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
303
311
)
304
312
yield binding_serializer
305
313
content_length = payload .tell ()
314
+ payload .seek (0 )
306
315
else :
307
316
payload = BytesIO ()
308
317
payload_serializer = self ._payload_codec .create_serializer (payload )
@@ -323,8 +332,8 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
323
332
binding_matcher ,
324
333
)
325
334
yield binding_serializer
335
+ payload .seek (0 )
326
336
327
- self ._seek (payload , 0 )
328
337
headers = binding_serializer .header_serializer .headers
329
338
if content_type is not None :
330
339
headers .append (("content-type" , content_type ))
@@ -334,7 +343,7 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
334
343
335
344
fields = tuples_to_fields (headers )
336
345
if content_length_required and "content-length" not in fields :
337
- content_length = self . _compute_content_length (payload )
346
+ content_length = _compute_content_length (payload )
338
347
if content_length is None :
339
348
raise SerializationError (
340
349
"This operation requires the the content length of the input "
@@ -355,18 +364,6 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
355
364
status = status ,
356
365
)
357
366
358
- def _seek (self , payload : Any , pos : int , whence : int = 0 ) -> int | None :
359
- if (
360
- seek := getattr (payload , "seek" , None )
361
- ) is not None and not iscoroutinefunction (seek ):
362
- return seek (pos , whence )
363
-
364
- def _compute_content_length (self , payload : Any ) -> int | None :
365
- content_length = self ._seek (payload , 0 , 2 )
366
- if content_length is not None :
367
- self ._seek (payload , 0 , 0 )
368
- return content_length
369
-
370
367
371
368
class HTTPResponseBindingSerializer (InterceptingSerializer ):
372
369
"""Delegates HTTP response bindings to binding-location-specific serializers."""
0 commit comments