@@ -605,7 +605,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None:
605
605
606
606
@dataclass
607
607
class HTTPStringPayload :
608
- payload : str
608
+ payload : str | None = None
609
609
610
610
ID : ClassVar [ShapeID ] = ShapeID ("com.smithy#HTTPStringPayload" )
611
611
SCHEMA : ClassVar [Schema ] = Schema .collection (
@@ -620,7 +620,8 @@ def serialize(self, serializer: ShapeSerializer) -> None:
620
620
self .serialize_members (s )
621
621
622
622
def serialize_members (self , serializer : ShapeSerializer ) -> None :
623
- serializer .write_string (self .SCHEMA .members ["payload" ], self .payload )
623
+ if self .payload is not None :
624
+ serializer .write_string (self .SCHEMA .members ["payload" ], self .payload )
624
625
625
626
@classmethod
626
627
def deserialize (cls , deserializer : ShapeDeserializer ) -> Self :
@@ -713,7 +714,7 @@ def _consumer(schema: Schema, de: ShapeDeserializer) -> None:
713
714
714
715
@dataclass
715
716
class HTTPStructuredPayload :
716
- payload : HTTPStringPayload
717
+ payload : HTTPStringPayload | None = None
717
718
718
719
ID : ClassVar [ShapeID ] = ShapeID ("com.smithy#HTTPStructuredPayload" )
719
720
SCHEMA : ClassVar [Schema ] = Schema .collection (
@@ -732,7 +733,8 @@ def serialize(self, serializer: ShapeSerializer) -> None:
732
733
self .serialize_members (s )
733
734
734
735
def serialize_members (self , serializer : ShapeSerializer ) -> None :
735
- serializer .write_struct (self .SCHEMA .members ["payload" ], self .payload )
736
+ if self .payload is not None :
737
+ serializer .write_struct (self .SCHEMA .members ["payload" ], self .payload )
736
738
737
739
@classmethod
738
740
def deserialize (cls , deserializer : ShapeDeserializer ) -> Self :
@@ -1590,6 +1592,53 @@ def payload_cases() -> list[HTTPMessageTestCase]:
1590
1592
HTTPStructuredPayload (payload = HTTPStringPayload (payload = "foo" )),
1591
1593
HTTPMessage (body = BytesIO (b'{"payload":"foo"}' )),
1592
1594
),
1595
+ HTTPMessageTestCase (
1596
+ HTTPStructuredPayload (HTTPStringPayload ()),
1597
+ HTTPMessage (body = BytesIO (b"{}" )),
1598
+ ),
1599
+ ]
1600
+
1601
+
1602
+ class NonSeekableBytesReader :
1603
+ def __init__ (self , data : bytes ) -> None :
1604
+ self ._wrapped = BytesIO (data )
1605
+
1606
+ def read (self , size : int = - 1 , / ) -> bytes :
1607
+ return self ._wrapped .read (size )
1608
+
1609
+
1610
+ def response_payload_cases () -> list [HTTPMessageTestCase ]:
1611
+ return [
1612
+ HTTPMessageTestCase (
1613
+ HTTPStructuredPayload (),
1614
+ HTTPMessage (body = b"" ),
1615
+ ),
1616
+ HTTPMessageTestCase (
1617
+ HTTPStructuredPayload (),
1618
+ HTTPMessage (body = BytesIO (b"" )),
1619
+ ),
1620
+ HTTPMessageTestCase (
1621
+ HTTPStructuredPayload (),
1622
+ HTTPMessage (
1623
+ body = NonSeekableBytesReader (b"" ),
1624
+ fields = tuples_to_fields ([("content-length" , "0" )]),
1625
+ ),
1626
+ ),
1627
+ HTTPMessageTestCase (
1628
+ HTTPImplicitPayload (),
1629
+ HTTPMessage (body = b"" ),
1630
+ ),
1631
+ HTTPMessageTestCase (
1632
+ HTTPImplicitPayload (),
1633
+ HTTPMessage (body = BytesIO (b"" )),
1634
+ ),
1635
+ HTTPMessageTestCase (
1636
+ HTTPImplicitPayload (),
1637
+ HTTPMessage (
1638
+ body = NonSeekableBytesReader (b"" ),
1639
+ fields = tuples_to_fields ([("content-length" , "0" )]),
1640
+ ),
1641
+ ),
1593
1642
]
1594
1643
1595
1644
@@ -1706,7 +1755,10 @@ async def test_serialize_response_omitting_empty_payload() -> None:
1706
1755
1707
1756
1708
1757
RESPONSE_DESER_CASES : list [HTTPMessageTestCase ] = (
1709
- header_cases () + empty_prefix_header_deser_cases () + payload_cases ()
1758
+ header_cases ()
1759
+ + empty_prefix_header_deser_cases ()
1760
+ + payload_cases ()
1761
+ + response_payload_cases ()
1710
1762
)
1711
1763
1712
1764
0 commit comments