From 2a7b98bc861a175072dc32a3deb01fb06fb03d15 Mon Sep 17 00:00:00 2001 From: Landon James Date: Sat, 19 Oct 2024 20:31:45 -0700 Subject: [PATCH] Update header serialization to include empty headers --- .../generators/http/HttpBindingGenerator.kt | 45 +++++++++++-------- 1 file changed, 26 insertions(+), 19 deletions(-) diff --git a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt index c9997ba67a..de2be8dca1 100644 --- a/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt +++ b/codegen-core/src/main/kotlin/software/amazon/smithy/rust/codegen/core/smithy/generators/http/HttpBindingGenerator.kt @@ -617,17 +617,26 @@ class HttpBindingGenerator( )(this) } - rustBlock("for ${loopVariable.name} in ${context.valueExpression.asRef()}") { - this.renderHeaderValue( - headerName, - loopVariable, - model.expectShape(shape.member.target), - isMultiValuedHeader = true, - timestampFormat, - renderErrorMessage, - serializeIfDefault = true, - shape.member, - ) + rustTemplate( + """ + // Empty vecs in headers are serialized as the empty string + if ${context.valueExpression.asRef()}.len() == 0 { + builder = builder.header("$headerName", ""); + }""", + ) + rustBlock("else") { + rustBlock("for ${loopVariable.name} in ${context.valueExpression.asRef()}") { + this.renderHeaderValue( + headerName, + loopVariable, + model.expectShape(shape.member.target), + isMultiValuedHeader = true, + timestampFormat, + renderErrorMessage, + serializeIfDefault = true, + shape.member, + ) + } } } @@ -671,14 +680,12 @@ class HttpBindingGenerator( val safeName = safeName("formatted") rustTemplate( """ - let $safeName = $formatted; - if !$safeName.is_empty() { - let header_value = $safeName; - let header_value: #{HeaderValue} = header_value.parse().map_err(|err| { - #{invalid_field_error:W} - })?; - builder = builder.header("$headerName", header_value); - } + let header_value = $formatted; + let header_value: #{HeaderValue} = header_value.parse().map_err(|err| { + #{invalid_field_error:W} + })?; + builder = builder.header("$headerName", header_value); + """, "HeaderValue" to RuntimeType.Http.resolve("HeaderValue"), "invalid_field_error" to renderErrorMessage("header_value"),