@@ -82,15 +82,20 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
8282 host_prefix = self ._endpoint_trait .host_prefix
8383
8484 content_type = self ._payload_codec .media_type
85-
8685 binding_matcher = RequestBindingMatcher (schema )
8786 if (payload_member := binding_matcher .payload_member ) is not None :
88- if payload_member .shape_type in (ShapeType .BLOB , ShapeType .STRING ):
89- content_type = (
90- "application/octet-stream"
91- if payload_member .shape_type is ShapeType .BLOB
92- else "text/plain"
93- )
87+ if payload_member .shape_type in (
88+ ShapeType .BLOB ,
89+ ShapeType .STRING ,
90+ ShapeType .ENUM ,
91+ ):
92+ if (media_type := payload_member .get_trait (MediaTypeTrait )) is not None :
93+ content_type = media_type .value
94+ elif payload_member .shape_type is ShapeType .BLOB :
95+ content_type = "application/octet-stream"
96+ else :
97+ content_type = "text/plain"
98+
9499 payload_serializer = RawPayloadSerializer ()
95100 binding_serializer = HTTPRequestBindingSerializer (
96101 payload_serializer ,
@@ -113,11 +118,11 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
113118 )
114119 yield binding_serializer
115120 else :
116- if binding_matcher .event_stream_member is not None :
117- content_type = "application/vnd.amazon.eventstream"
118121 payload = BytesIO ()
119122 payload_serializer = self ._payload_codec .create_serializer (payload )
120123 if binding_matcher .should_write_body (self ._omit_empty_payload ):
124+ if binding_matcher .event_stream_member is not None :
125+ content_type = "application/vnd.amazon.eventstream"
121126 with payload_serializer .begin_struct (schema ) as body_serializer :
122127 binding_serializer = HTTPRequestBindingSerializer (
123128 body_serializer ,
@@ -127,6 +132,7 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
127132 )
128133 yield binding_serializer
129134 else :
135+ content_type = None
130136 binding_serializer = HTTPRequestBindingSerializer (
131137 payload_serializer ,
132138 self ._http_trait .path ,
@@ -140,9 +146,9 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
140146 ) is not None and not iscoroutinefunction (seek ):
141147 seek (0 )
142148
143- # TODO: conditional on empty-ness and based on the protocol
144149 headers = binding_serializer .header_serializer .headers
145- headers .append (("content-type" , content_type ))
150+ if content_type is not None :
151+ headers .append (("content-type" , content_type ))
146152
147153 self .result = _HTTPRequest (
148154 method = self ._http_trait .method ,
@@ -228,16 +234,25 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
228234 payload : Any
229235 binding_serializer : HTTPResponseBindingSerializer
230236
237+ content_type : str | None = self ._payload_codec .media_type
231238 binding_matcher = ResponseBindingMatcher (schema )
232239 if (payload_member := binding_matcher .payload_member ) is not None :
233240 if payload_member .shape_type in (ShapeType .BLOB , ShapeType .STRING ):
241+ if (media_type := payload_member .get_trait (MediaTypeTrait )) is not None :
242+ content_type = media_type .value
243+ elif payload_member .shape_type is ShapeType .BLOB :
244+ content_type = "application/octet-stream"
245+ else :
246+ content_type = "text/plain"
234247 payload_serializer = RawPayloadSerializer ()
235248 binding_serializer = HTTPResponseBindingSerializer (
236249 payload_serializer , binding_matcher
237250 )
238251 yield binding_serializer
239252 payload = payload_serializer .payload
240253 else :
254+ if (media_type := payload_member .get_trait (MediaTypeTrait )) is not None :
255+ content_type = media_type .value
241256 payload = BytesIO ()
242257 payload_serializer = self ._payload_codec .create_serializer (payload )
243258 binding_serializer = HTTPResponseBindingSerializer (
@@ -248,12 +263,15 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
248263 payload = BytesIO ()
249264 payload_serializer = self ._payload_codec .create_serializer (payload )
250265 if binding_matcher .should_write_body (self ._omit_empty_payload ):
266+ if binding_matcher .event_stream_member is not None :
267+ content_type = "application/vnd.amazon.eventstream"
251268 with payload_serializer .begin_struct (schema ) as body_serializer :
252269 binding_serializer = HTTPResponseBindingSerializer (
253270 body_serializer , binding_matcher
254271 )
255272 yield binding_serializer
256273 else :
274+ content_type = None
257275 binding_serializer = HTTPResponseBindingSerializer (
258276 payload_serializer ,
259277 binding_matcher ,
@@ -265,6 +283,10 @@ def begin_struct(self, schema: Schema) -> Iterator[ShapeSerializer]:
265283 ) is not None and not iscoroutinefunction (seek ):
266284 seek (0 )
267285
286+ headers = binding_serializer .header_serializer .headers
287+ if content_type is not None :
288+ headers .append (("content-type" , content_type ))
289+
268290 status = binding_serializer .response_code_serializer .response_code
269291 if status is None :
270292 if binding_matcher .response_status > 0 :
0 commit comments