|
49 | 49 | import software.amazon.smithy.model.shapes.ShapeId;
|
50 | 50 | import software.amazon.smithy.model.shapes.StructureShape;
|
51 | 51 | import software.amazon.smithy.model.traits.ErrorTrait;
|
| 52 | +import software.amazon.smithy.model.traits.HttpPrefixHeadersTrait; |
52 | 53 | import software.amazon.smithy.model.traits.IdempotencyTokenTrait;
|
53 | 54 | import software.amazon.smithy.protocoltests.traits.HttpMessageTestCase;
|
54 | 55 | import software.amazon.smithy.protocoltests.traits.HttpRequestTestCase;
|
@@ -557,7 +558,7 @@ public Void stringNode(StringNode node) {
|
557 | 558 | * type signatures.
|
558 | 559 | *
|
559 | 560 | * 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 |
561 | 562 | * types for blobs, and error Message field standardization.
|
562 | 563 | */
|
563 | 564 | private final class CommandOutputNodeVisitor implements NodeVisitor<Void> {
|
@@ -596,8 +597,8 @@ public Void booleanNode(BooleanNode node) {
|
596 | 597 |
|
597 | 598 | @Override
|
598 | 599 | 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,"); |
601 | 602 | return null;
|
602 | 603 | }
|
603 | 604 |
|
@@ -636,15 +637,28 @@ public Void objectNode(ObjectNode node) {
|
636 | 637 | writer.write("$S: ", validationName);
|
637 | 638 |
|
638 | 639 | 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)); |
641 | 646 | writer.write("\n");
|
642 | 647 | });
|
643 | 648 | this.workingShape = wrapperShape;
|
644 | 649 | });
|
645 | 650 | return null;
|
646 | 651 | }
|
647 | 652 |
|
| 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 | + |
648 | 662 | @Override
|
649 | 663 | public Void stringNode(StringNode node) {
|
650 | 664 | // Handle blobs needing to be converted from strings to their input type of UInt8Array.
|
|
0 commit comments