Skip to content

Commit f2fab73

Browse files
committed
Fix issues with output node visitor
This commit updates the CommandOutputNodeVisitor to downcase any keys in ObjectNode that represent HttpPrefixHeaders. It also fixes an issue writing NullNode entries.
1 parent a78b6fd commit f2fab73

File tree

1 file changed

+19
-5
lines changed

1 file changed

+19
-5
lines changed

Diff for: smithy-typescript-codegen/src/main/java/software/amazon/smithy/typescript/codegen/HttpProtocolTestGenerator.java

+19-5
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
import software.amazon.smithy.model.shapes.ShapeId;
5050
import software.amazon.smithy.model.shapes.StructureShape;
5151
import software.amazon.smithy.model.traits.ErrorTrait;
52+
import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait;
5253
import software.amazon.smithy.model.traits.IdempotencyTokenTrait;
5354
import software.amazon.smithy.protocoltests.traits.HttpMessageTestCase;
5455
import software.amazon.smithy.protocoltests.traits.HttpRequestTestCase;
@@ -557,7 +558,7 @@ public Void stringNode(StringNode node) {
557558
* type signatures.
558559
*
559560
* This handles properly generating Date types for numbers that are
560-
* Timestamp shapes, "undefined" for nulls, boolean values, and Uint8Array
561+
* Timestamp shapes, downcasing prefix headers, boolean values, Uint8Array
561562
* types for blobs, and error Message field standardization.
562563
*/
563564
private final class CommandOutputNodeVisitor implements NodeVisitor<Void> {
@@ -596,8 +597,8 @@ public Void booleanNode(BooleanNode node) {
596597

597598
@Override
598599
public Void nullNode(NullNode node) {
599-
// Handle nulls being literal "undefined" in JS.
600-
writer.write("undefined,");
600+
// Nulls on the wire are nulls in parsed content.
601+
writer.write("null,");
601602
return null;
602603
}
603604

@@ -636,15 +637,28 @@ public Void objectNode(ObjectNode node) {
636637
writer.write("$S: ", validationName);
637638

638639
this.workingShape = model.expectShape(memberShape.getTarget());
639-
// TODO Alter valueNode to downcase keys if it's a map for prefixHeaders?
640-
writer.call(() -> valueNode.accept(this));
640+
// Alter valueNode to downcase keys if it's a map for prefixHeaders.
641+
// This is an enforced behavior of the fetch handler.
642+
Node renderNode = memberShape.hasTrait(HttpPrefixHeadersTrait.class)
643+
? downcaseNodeKeys(valueNode.expectObjectNode())
644+
: valueNode;
645+
writer.call(() -> renderNode.accept(this));
641646
writer.write("\n");
642647
});
643648
this.workingShape = wrapperShape;
644649
});
645650
return null;
646651
}
647652

653+
private ObjectNode downcaseNodeKeys(ObjectNode startingNode) {
654+
ObjectNode downcasedNode = Node.objectNode();
655+
for (Map.Entry<StringNode, Node> entry : startingNode.getMembers().entrySet()) {
656+
downcasedNode = downcasedNode.withMember(entry.getKey().getValue().toLowerCase(Locale.US),
657+
entry.getValue());
658+
}
659+
return downcasedNode;
660+
}
661+
648662
@Override
649663
public Void stringNode(StringNode node) {
650664
// Handle blobs needing to be converted from strings to their input type of UInt8Array.

0 commit comments

Comments
 (0)