From 2e205327f842f808340e7e40eee3f9dec7e1f649 Mon Sep 17 00:00:00 2001 From: saltzmanjoelh Date: Tue, 11 Aug 2020 07:48:44 -0700 Subject: [PATCH] Make sure urls have trailing slashes (#6) * Make sure urls have trailing slashes * Cleaned up code Co-authored-by: Joel Saltzman <> --- Sources/AWSSigner/signer.swift | 7 ++++++- Tests/AWSSignerTests/AWSSignerTests.swift | 10 ++++++++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/Sources/AWSSigner/signer.swift b/Sources/AWSSigner/signer.swift index f94cc1d..915862b 100644 --- a/Sources/AWSSigner/signer.swift +++ b/Sources/AWSSigner/signer.swift @@ -120,7 +120,12 @@ public struct AWSSigner { var date : String { return String(datetime.prefix(8))} init(url: URL, method: HTTPMethod = .GET, headers: HTTPHeaders = HTTPHeaders(), body: BodyData? = nil, bodyHash: String? = nil, date: String, signer: AWSSigner) { - self.url = url + if url.path == "" { + //URL has to have trailing slash + self.url = url.appendingPathComponent("/") + } else { + self.url = url + } self.method = method self.datetime = date self.unsignedURL = self.url diff --git a/Tests/AWSSignerTests/AWSSignerTests.swift b/Tests/AWSSignerTests/AWSSignerTests.swift index 0c8a93b..dc393a6 100644 --- a/Tests/AWSSignerTests/AWSSignerTests.swift +++ b/Tests/AWSSignerTests/AWSSignerTests.swift @@ -66,11 +66,21 @@ final class AWSSignerTests: XCTestCase { } } + func testTrailingSlash() { + let signer = AWSSigner(credentials: credentials, name: "dynamodb", region:"us-west-1") + let url = URL(string: "https://dynamodb.us-west-1.amazonaws.com")! + let dateString = AWSSigner.timestamp(Date(timeIntervalSinceReferenceDate: 0)) + let signingData = AWSSigner.SigningData(url: url, method: .POST, date: dateString, signer: signer) + XCTAssertTrue(signingData.url.absoluteString.hasSuffix("amazonaws.com/")) + XCTAssertTrue(signingData.unsignedURL.absoluteString.hasSuffix("amazonaws.com/")) + } + static var allTests = [ ("testSignGetHeaders", testSignGetHeaders), ("testSignPutHeaders", testSignPutHeaders), ("testSignS3GetURL", testSignS3GetURL), ("testSignS3PutURL", testSignS3PutURL), ("testBodyData", testBodyData), + ("testTrailingSlash", testTrailingSlash), ] }