diff --git a/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift b/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift index 472aed8b..b197b82e 100644 --- a/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift +++ b/Sources/OpenAPIRuntime/URICoder/Decoding/URIValueFromNodeDecoder.swift @@ -294,6 +294,9 @@ extension URIValueFromNodeDecoder { array = try rootValue(in: values) } guard array.count == 1 else { + if style == .simple { + return Substring(array.joined(separator: ",")) + } let reason = array.isEmpty ? "an empty node" : "a node with multiple values" try throwMismatch("Cannot parse a value from \(reason).") } diff --git a/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIDecoder.swift b/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIDecoder.swift index fbc44d29..a98e91b5 100644 --- a/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIDecoder.swift +++ b/Tests/OpenAPIRuntimeTests/URICoder/Decoder/Test_URIDecoder.swift @@ -80,4 +80,30 @@ final class Test_URIDecoder: Test_Runtime { XCTAssertEqual(decodedValue, nil) } } + + func testDecoding_percentEncodedCommaToString() throws { + let decoder = URIDecoder(configuration: .simpleUnexplode) + + do { + let decodedValue = try decoder.decode( + String.self, + forKey: "", + from: "foo%2C%20bar" + ) + XCTAssertEqual(decodedValue, "foo, bar") + } + } + + func testDecoding_nonPercentEncodedCommaToString() throws { + let decoder = URIDecoder(configuration: .simpleUnexplode) + + do { + let decodedValue = try decoder.decode( + String.self, + forKey: "", + from: "foo, bar" + ) + XCTAssertEqual(decodedValue, "foo, bar") + } + } }