Skip to content

Commit 759bf43

Browse files
authored
feat: automatic idempotency tokens for header values (#1327)
1 parent 8654804 commit 759bf43

File tree

1 file changed

+27
-4
lines changed

1 file changed

+27
-4
lines changed

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

Lines changed: 27 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1010,30 +1010,53 @@ private void writeNormalHeader(GenerationContext context, HttpBinding binding) {
10101010
binding.getMember(),
10111011
target
10121012
);
1013+
boolean isIdempotencyToken = binding.getMember().hasTrait(IdempotencyTokenTrait.class);
1014+
if (isIdempotencyToken) {
1015+
context.getWriter()
1016+
.addImport("v4", "generateIdempotencyToken", TypeScriptDependency.UUID);
1017+
}
1018+
1019+
boolean headerAssertion = headerValue.endsWith("!");
1020+
String headerBaseValue = (headerAssertion
1021+
? headerValue.substring(0, headerValue.length() - 1)
1022+
: headerValue);
10131023

10141024
if (!Objects.equals(memberLocation + "!", headerValue)) {
10151025
String defaultValue = "";
10161026
if (headerBuffer.containsKey(headerKey)) {
10171027
String s = headerBuffer.get(headerKey);
10181028
defaultValue = " || " + s.substring(s.indexOf(": ") + 2, s.length() - 1);
1029+
} else if (isIdempotencyToken) {
1030+
defaultValue = " ?? generateIdempotencyToken()";
10191031
}
1032+
1033+
String headerValueExpression = headerAssertion && !defaultValue.isEmpty()
1034+
? headerBaseValue + defaultValue
1035+
: headerValue + defaultValue;
1036+
10201037
// evaluated value has a function or method call attached
10211038
headerBuffer.put(headerKey, String.format(
10221039
"[%s]: [() => isSerializableHeaderValue(%s), () => %s],",
10231040
context.getStringStore().var(headerKey),
10241041
memberLocation + defaultValue,
1025-
headerValue + defaultValue
1042+
headerValueExpression
10261043
));
10271044
} else {
1028-
String value = headerValue;
1045+
String constructedHeaderValue = (headerAssertion
1046+
? headerBaseValue
1047+
: headerValue);
10291048
if (headerBuffer.containsKey(headerKey)) {
10301049
String s = headerBuffer.get(headerKey);
1031-
value = headerValue + " || " + s.substring(s.indexOf(": ") + 2, s.length() - 1);
1050+
constructedHeaderValue += " || " + s.substring(s.indexOf(": ") + 2, s.length() - 1);
1051+
} else if (isIdempotencyToken) {
1052+
constructedHeaderValue += " ?? generateIdempotencyToken()";
1053+
} else {
1054+
constructedHeaderValue = headerValue;
10321055
}
10331056
headerBuffer.put(headerKey, String.format(
10341057
"[%s]: %s,",
10351058
context.getStringStore().var(headerKey),
1036-
value
1059+
constructedHeaderValue
10371060
));
10381061
}
10391062
}

0 commit comments

Comments
 (0)