Skip to content

Commit bdfed1c

Browse files
committed
Add validation for @httpLabel inputs
This commit adds runtime validation of operation inputs that are bound to HTTP path labels. Errors are thrown when a value is not set or set to a value that resolves to an empty string.
1 parent 38e1f20 commit bdfed1c

File tree

1 file changed

+15
-7
lines changed

1 file changed

+15
-7
lines changed

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

Lines changed: 15 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -224,15 +224,23 @@ private List<HttpBinding> writeRequestLabels(
224224

225225
if (!labelBindings.isEmpty()) {
226226
ShapeIndex index = context.getModel().getShapeIndex();
227-
writer.write("const resolvedPath = $S;", trait.getUri());
227+
writer.write("let resolvedPath = $S;", trait.getUri());
228228
for (HttpBinding binding : labelBindings) {
229229
String memberName = symbolProvider.toMemberName(binding.getMember());
230-
writer.openBlock("if (input.$L !== undefined) {", "}", memberName, () -> {
231-
Shape target = index.getShape(binding.getMember().getTarget()).get();
232-
String labelValue = getInputValue(context, binding.getLocation(), "input." + memberName,
233-
binding.getMember(), target);
234-
writer.write("resolvedPath = resolvedPath.replace('{$S}', $L);", memberName, labelValue);
235-
});
230+
Shape target = index.getShape(binding.getMember().getTarget()).get();
231+
String labelValue = getInputValue(context, binding.getLocation(), "input." + memberName,
232+
binding.getMember(), target);
233+
234+
// Set the label's value and throw a clear error if empty or undefined.
235+
writer.write("if (input.$L !== undefined) {", memberName).indent()
236+
.write("const labelValue: any = $L;", labelValue)
237+
.openBlock("if (labelValue.length <= 0) {", "}", () -> {
238+
writer.write("throw new Error('Empty value provided for input HTTP label: $L.');", memberName);
239+
})
240+
.write("resolvedPath = resolvedPath.replace('{$L}', labelValue);", memberName).dedent()
241+
.write("} else {").indent()
242+
.write("throw new Error('No value provided for input HTTP label: $L.');", memberName).dedent()
243+
.write("}");
236244
}
237245
}
238246

0 commit comments

Comments
 (0)