Skip to content

Commit

Permalink
Percent encode query parameters when rebuilding URI (#11)
Browse files Browse the repository at this point in the history
  • Loading branch information
adam-fowler committed Jan 16, 2024
1 parent 20f38ab commit f454c62
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 4 deletions.
19 changes: 16 additions & 3 deletions Sources/HummingbirdLambda/Request+APIGateway.swift
Expand Up @@ -15,6 +15,7 @@
import AWSLambdaEvents
import AWSLambdaRuntime
import ExtrasBase64
import Foundation
import Hummingbird
import NIOHTTP1

Expand All @@ -36,6 +37,9 @@ extension LambdaContext: HBRequestContext {
extension HBRequest {
/// Specialization of HBLambda.request where `In` is `APIGateway.Request`
init<Request: APIRequest>(context: LambdaContext, application: HBApplication, from: Request) throws {
func urlPercentEncoded(_ string: String) -> String {
return string.addingPercentEncoding(withAllowedCharacters: .urlQueryComponentAllowed) ?? string
}
// construct URI with query parameters
var uri = from.path
var queryParams: [String] = []
Expand All @@ -44,13 +48,14 @@ extension HBRequest {
// from the single value list if they are found in the multi value list
from.multiValueQueryStringParameters?.forEach { multiValueQuery in
queryStringParameters[multiValueQuery.key] = nil
queryParams += multiValueQuery.value.map { "\(multiValueQuery.key)=\($0)" }
queryParams += multiValueQuery.value.map { "\(urlPercentEncoded(multiValueQuery.key))=\(urlPercentEncoded($0))" }
}
queryParams += queryStringParameters.map {
"\(urlPercentEncoded($0.key))=\(urlPercentEncoded($0.value))"
}
queryParams += queryStringParameters.map { "\($0.key)=\($0.value)" }
if queryParams.count > 0 {
uri += "?\(queryParams.joined(separator: "&"))"
}

// construct headers
var headers = NIOHTTP1.HTTPHeaders(from.headers.map { ($0.key, $0.value) })
from.multiValueHeaders.forEach { multiValueHeader in
Expand Down Expand Up @@ -86,3 +91,11 @@ extension HBRequest {
)
}
}

extension CharacterSet {
static var urlQueryComponentAllowed: CharacterSet = {
var cs = CharacterSet.urlQueryAllowed
cs.remove(charactersIn: "&=")
return cs
}()
}
2 changes: 1 addition & 1 deletion scripts/deploy.sh
Expand Up @@ -22,4 +22,4 @@ if [ ! $(which sam) ]; then
fi

cd "$here"/..
sam deploy --template scripts/sam.yml $@
sam deploy --stack-name hb-lambda-test --resolve-s3 --template scripts/sam.yml $@

0 comments on commit f454c62

Please sign in to comment.