From f977894f7f26ed5fb15b1a3e40357b03cc1416f4 Mon Sep 17 00:00:00 2001 From: Fabian Fett Date: Sat, 1 Mar 2025 11:41:10 +0100 Subject: [PATCH 1/3] [TestServer] Fix 488 and add simple test lambda --- Package.swift | 6 ++++ .../Lambda+LocalServer.swift | 23 +++++++++++---- Sources/HelloWorldLambda/main.swift | 29 +++++++++++++++++++ 3 files changed, 52 insertions(+), 6 deletions(-) create mode 100644 Sources/HelloWorldLambda/main.swift diff --git a/Package.swift b/Package.swift index 9eac9771..68af1052 100644 --- a/Package.swift +++ b/Package.swift @@ -85,6 +85,12 @@ let package = Package( .byName(name: "AWSLambdaTesting") ] ), + .executableTarget( + name: "HelloWorldLambda", + dependencies: [ + "AWSLambdaRuntime", + ] + ), // for perf testing .executableTarget( name: "MockServer", diff --git a/Sources/AWSLambdaRuntimeCore/Lambda+LocalServer.swift b/Sources/AWSLambdaRuntimeCore/Lambda+LocalServer.swift index 4bb113a7..bee880cc 100644 --- a/Sources/AWSLambdaRuntimeCore/Lambda+LocalServer.swift +++ b/Sources/AWSLambdaRuntimeCore/Lambda+LocalServer.swift @@ -352,15 +352,15 @@ private struct LambdaHTTPServer { // :requestID/response endpoint is called by the lambda posting the response case (.POST, let url) where url.hasSuffix(Consts.postResponseURLSuffix): let parts = head.uri.split(separator: "/") - guard let requestId = parts.count > 2 ? String(parts[parts.count - 2]) : nil else { + guard let requestID = parts.count > 2 ? String(parts[parts.count - 2]) : nil else { // the request is malformed, since we were expecting a requestId in the path return .init(status: .badRequest) } // enqueue the lambda function response to be served as response to the client /invoke - logger.trace("/:requestID/response received response", metadata: ["requestId": "\(requestId)"]) + logger.trace("/:requestID/response received response", metadata: ["requestId": "\(requestID)"]) await self.responsePool.push( LocalServerResponse( - id: requestId, + id: requestID, status: .ok, headers: [("Content-Type", "application/json")], body: body @@ -368,17 +368,28 @@ private struct LambdaHTTPServer { ) // tell the Lambda function we accepted the response - return .init(id: requestId, status: .accepted) + return .init(id: requestID, status: .accepted) // :requestID/error endpoint is called by the lambda posting an error response // we accept all requestID and we do not handle the body, we just acknowledge the request case (.POST, let url) where url.hasSuffix(Consts.postErrorURLSuffix): let parts = head.uri.split(separator: "/") - guard let _ = parts.count > 2 ? String(parts[parts.count - 2]) : nil else { + guard let requestID = parts.count > 2 ? String(parts[parts.count - 2]) : nil else { // the request is malformed, since we were expecting a requestId in the path return .init(status: .badRequest) } - return .init(status: .ok) + // enqueue the lambda function response to be served as response to the client /invoke + logger.trace("/:requestID/response received response", metadata: ["requestId": "\(requestID)"]) + await self.responsePool.push( + LocalServerResponse( + id: requestID, + status: .internalServerError, + headers: [("Content-Type", "application/json")], + body: body + ) + ) + + return .init(status: .accepted) // unknown call default: diff --git a/Sources/HelloWorldLambda/main.swift b/Sources/HelloWorldLambda/main.swift new file mode 100644 index 00000000..77fa64f5 --- /dev/null +++ b/Sources/HelloWorldLambda/main.swift @@ -0,0 +1,29 @@ +//===----------------------------------------------------------------------===// +// +// This source file is part of the SwiftAWSLambdaRuntime open source project +// +// Copyright (c) 2025 Apple Inc. and the SwiftAWSLambdaRuntime project authors +// Licensed under Apache License v2.0 +// +// See LICENSE.txt for license information +// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors +// +// SPDX-License-Identifier: Apache-2.0 +// +//===----------------------------------------------------------------------===// + +import AWSLambdaRuntime + +struct Request: Codable { + var name: String +} + +struct Response: Codable { + var greeting: String +} + +let runtime = LambdaRuntime { (_ request: Request, context) -> Response in + Response(greeting: "Hello \(request.name)") +} + +try await runtime.run() From 8bbabe4848b0cd0fa0821853fd6b409e1c851ef1 Mon Sep 17 00:00:00 2001 From: Fabian Fett Date: Sat, 1 Mar 2025 11:47:36 +0100 Subject: [PATCH 2/3] Fix swift-format --- Package.swift | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Package.swift b/Package.swift index 68af1052..7d2a1cfb 100644 --- a/Package.swift +++ b/Package.swift @@ -88,7 +88,7 @@ let package = Package( .executableTarget( name: "HelloWorldLambda", dependencies: [ - "AWSLambdaRuntime", + "AWSLambdaRuntime" ] ), // for perf testing From 58d9b33d049ba2cea5aaba69bfd73e0d722312cc Mon Sep 17 00:00:00 2001 From: Fabian Fett Date: Sat, 1 Mar 2025 17:40:48 +0100 Subject: [PATCH 3/3] Remove HelloWorldLambda --- Package.swift | 6 ------ Sources/HelloWorldLambda/main.swift | 29 ----------------------------- 2 files changed, 35 deletions(-) delete mode 100644 Sources/HelloWorldLambda/main.swift diff --git a/Package.swift b/Package.swift index 7d2a1cfb..9eac9771 100644 --- a/Package.swift +++ b/Package.swift @@ -85,12 +85,6 @@ let package = Package( .byName(name: "AWSLambdaTesting") ] ), - .executableTarget( - name: "HelloWorldLambda", - dependencies: [ - "AWSLambdaRuntime" - ] - ), // for perf testing .executableTarget( name: "MockServer", diff --git a/Sources/HelloWorldLambda/main.swift b/Sources/HelloWorldLambda/main.swift deleted file mode 100644 index 77fa64f5..00000000 --- a/Sources/HelloWorldLambda/main.swift +++ /dev/null @@ -1,29 +0,0 @@ -//===----------------------------------------------------------------------===// -// -// This source file is part of the SwiftAWSLambdaRuntime open source project -// -// Copyright (c) 2025 Apple Inc. and the SwiftAWSLambdaRuntime project authors -// Licensed under Apache License v2.0 -// -// See LICENSE.txt for license information -// See CONTRIBUTORS.txt for the list of SwiftAWSLambdaRuntime project authors -// -// SPDX-License-Identifier: Apache-2.0 -// -//===----------------------------------------------------------------------===// - -import AWSLambdaRuntime - -struct Request: Codable { - var name: String -} - -struct Response: Codable { - var greeting: String -} - -let runtime = LambdaRuntime { (_ request: Request, context) -> Response in - Response(greeting: "Hello \(request.name)") -} - -try await runtime.run()