Skip to content

Commit 34e9136

Browse files
AllanZhengYPsrchase
authored andcommitted
fix: populate content-type header for all events (smithy-lang#567)
1 parent acc2a6e commit 34e9136

File tree

1 file changed

+32
-10
lines changed

1 file changed

+32
-10
lines changed

smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/integration/HttpBindingProtocolGenerator.java

Lines changed: 32 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,6 @@
1515

1616
package software.amazon.smithy.typescript.codegen.integration;
1717

18-
import static software.amazon.smithy.model.knowledge.HttpBinding.Location;
19-
2018
import java.nio.file.Paths;
2119
import java.util.Collection;
2220
import java.util.Collections;
@@ -37,6 +35,7 @@
3735
import software.amazon.smithy.codegen.core.SymbolReference;
3836
import software.amazon.smithy.model.Model;
3937
import software.amazon.smithy.model.knowledge.HttpBinding;
38+
import software.amazon.smithy.model.knowledge.HttpBinding.Location;
4039
import software.amazon.smithy.model.knowledge.HttpBindingIndex;
4140
import software.amazon.smithy.model.knowledge.OperationIndex;
4241
import software.amazon.smithy.model.knowledge.TopDownIndex;
@@ -1584,7 +1583,8 @@ private void generateEventSerializer(GenerationContext context, StructureShape e
15841583
writer.openBlock("headers: {", "},", () -> {
15851584
//fix headers required by event stream
15861585
writer.write("\":event-type\": { type: \"string\", value: $S },", symbol.getName());
1587-
writer.write("\":message-type\": { type: \"string\", value: \"event\" }");
1586+
writer.write("\":message-type\": { type: \"string\", value: \"event\" },");
1587+
writeEventContentTypeHeader(context, event);
15881588
});
15891589
writer.write("body: new Uint8Array()");
15901590
});
@@ -1594,6 +1594,31 @@ private void generateEventSerializer(GenerationContext context, StructureShape e
15941594
});
15951595
}
15961596

1597+
private void writeEventContentTypeHeader(GenerationContext context, StructureShape event) {
1598+
TypeScriptWriter writer = context.getWriter();
1599+
Shape payloadShape = getEventPayloadShape(context, event);
1600+
if (payloadShape instanceof BlobShape) {
1601+
writer.write("\":content-type\": { type: \"string\", value: \"application/octet-stream\" },");
1602+
} else if (payloadShape instanceof StringShape) {
1603+
writer.write("\":content-type\": { type: \"string\", value: \"text/plain\" },");
1604+
} else if (payloadShape instanceof StructureShape || payloadShape instanceof UnionShape) {
1605+
writer.write("\":content-type\": { type: \"string\", value: $S },", getDocumentContentType());
1606+
} else {
1607+
throw new CodegenException(String.format("Unexpected shape type bound to event payload: `%s`",
1608+
payloadShape.getType()));
1609+
}
1610+
}
1611+
1612+
private Shape getEventPayloadShape(GenerationContext context, StructureShape event) {
1613+
Model model = context.getModel();
1614+
List<MemberShape> payloadMembers = event.getAllMembers().values().stream()
1615+
.filter(member -> member.hasTrait(EventPayloadTrait.class))
1616+
.collect(Collectors.toList());
1617+
return payloadMembers.isEmpty()
1618+
? event // implicit payload
1619+
: model.expectShape(payloadMembers.get(0).getTarget());
1620+
}
1621+
15971622
private void writeEventHeaders(GenerationContext context, StructureShape event) {
15981623
TypeScriptWriter writer = context.getWriter();
15991624
Model model = context.getModel();
@@ -1633,16 +1658,13 @@ private String getEventHeaderType(Shape shape) {
16331658
private void writeEventBody(GenerationContext context, StructureShape event) {
16341659
TypeScriptWriter writer = context.getWriter();
16351660
Model model = context.getModel();
1636-
List<MemberShape> payloadMembers = event.getAllMembers().values().stream()
1637-
.filter(member -> member.hasTrait(EventPayloadTrait.class))
1638-
.collect(Collectors.toList());
1639-
Shape payloadShape = payloadMembers.isEmpty()
1640-
? event // implicit payload
1641-
: model.expectShape(payloadMembers.get(0).getTarget());
1661+
Shape payloadShape = getEventPayloadShape(context, event);
16421662
if (payloadShape instanceof BlobShape || payloadShape instanceof StringShape) {
16431663
// Since event itself must be a structure shape, so string or blob payload member must has eventPayload
16441664
// trait explicitly.
1645-
MemberShape payloadMember = payloadMembers.get(0);
1665+
MemberShape payloadMember = event.getAllMembers().values().stream()
1666+
.filter(member -> member.hasTrait(EventPayloadTrait.class))
1667+
.collect(Collectors.toList()).get(0);
16461668
String payloadMemberName = payloadMember.getMemberName();
16471669
writer.write("message.body = $L || message.body;",
16481670
getInputValue(context, Location.PAYLOAD, "input." + payloadMemberName, payloadMember,

0 commit comments

Comments
 (0)