@@ -581,7 +581,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None:
581
581
582
582
@dataclass
583
583
class HTTPStringPayload :
584
- payload : str
584
+ payload : str | None = None
585
585
586
586
ID : ClassVar [ShapeID ] = ShapeID ("com.smithy#HTTPStringPayload" )
587
587
SCHEMA : ClassVar [Schema ] = Schema .collection (
@@ -594,7 +594,8 @@ def serialize(self, serializer: ShapeSerializer) -> None:
594
594
self .serialize_members (s )
595
595
596
596
def serialize_members (self , serializer : ShapeSerializer ) -> None :
597
- serializer .write_string (self .SCHEMA .members ["payload" ], self .payload )
597
+ if self .payload is not None :
598
+ serializer .write_string (self .SCHEMA .members ["payload" ], self .payload )
598
599
599
600
@classmethod
600
601
def deserialize (cls , deserializer : ShapeDeserializer ) -> Self :
@@ -684,7 +685,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None:
684
685
685
686
@dataclass
686
687
class HTTPStructuredPayload :
687
- payload : HTTPStringPayload
688
+ payload : HTTPStringPayload | None = None
688
689
689
690
ID : ClassVar [ShapeID ] = ShapeID ("com.smithy#HTTPStructuredPayload" )
690
691
SCHEMA : ClassVar [Schema ] = Schema .collection (
@@ -702,7 +703,8 @@ def serialize(self, serializer: ShapeSerializer) -> None:
702
703
self .serialize_members (s )
703
704
704
705
def serialize_members (self , serializer : ShapeSerializer ) -> None :
705
- serializer .write_struct (self .SCHEMA .members ["payload" ], self .payload )
706
+ if self .payload is not None :
707
+ serializer .write_struct (self .SCHEMA .members ["payload" ], self .payload )
706
708
707
709
@classmethod
708
710
def deserialize (cls , deserializer : ShapeDeserializer ) -> Self :
@@ -1548,6 +1550,53 @@ def payload_cases() -> list[HTTPMessageTestCase]:
1548
1550
HTTPStructuredPayload (payload = HTTPStringPayload (payload = "foo" )),
1549
1551
HTTPMessage (body = BytesIO (b'{"payload":"foo"}' )),
1550
1552
),
1553
+ HTTPMessageTestCase (
1554
+ HTTPStructuredPayload (HTTPStringPayload ()),
1555
+ HTTPMessage (body = BytesIO (b"{}" )),
1556
+ ),
1557
+ ]
1558
+
1559
+
1560
+ class NonSeekableBytesReader :
1561
+ def __init__ (self , data : bytes ) -> None :
1562
+ self ._wrapped = BytesIO (data )
1563
+
1564
+ def read (self , size : int = - 1 , / ) -> bytes :
1565
+ return self ._wrapped .read (size )
1566
+
1567
+
1568
+ def response_payload_cases () -> list [HTTPMessageTestCase ]:
1569
+ return [
1570
+ HTTPMessageTestCase (
1571
+ HTTPStructuredPayload (),
1572
+ HTTPMessage (body = b"" ),
1573
+ ),
1574
+ HTTPMessageTestCase (
1575
+ HTTPStructuredPayload (),
1576
+ HTTPMessage (body = BytesIO (b"" )),
1577
+ ),
1578
+ HTTPMessageTestCase (
1579
+ HTTPStructuredPayload (),
1580
+ HTTPMessage (
1581
+ body = NonSeekableBytesReader (b"" ),
1582
+ fields = tuples_to_fields ([("content-length" , "0" )]),
1583
+ ),
1584
+ ),
1585
+ HTTPMessageTestCase (
1586
+ HTTPImplicitPayload (),
1587
+ HTTPMessage (body = b"" ),
1588
+ ),
1589
+ HTTPMessageTestCase (
1590
+ HTTPImplicitPayload (),
1591
+ HTTPMessage (body = BytesIO (b"" )),
1592
+ ),
1593
+ HTTPMessageTestCase (
1594
+ HTTPImplicitPayload (),
1595
+ HTTPMessage (
1596
+ body = NonSeekableBytesReader (b"" ),
1597
+ fields = tuples_to_fields ([("content-length" , "0" )]),
1598
+ ),
1599
+ ),
1551
1600
]
1552
1601
1553
1602
@@ -1664,7 +1713,10 @@ async def test_serialize_response_omitting_empty_payload() -> None:
1664
1713
1665
1714
1666
1715
RESPONSE_DESER_CASES : list [HTTPMessageTestCase ] = (
1667
- header_cases () + empty_prefix_header_deser_cases () + payload_cases ()
1716
+ header_cases ()
1717
+ + empty_prefix_header_deser_cases ()
1718
+ + payload_cases ()
1719
+ + response_payload_cases ()
1668
1720
)
1669
1721
1670
1722
0 commit comments