Skip to content

Commit f5c173c

Browse files
Decode query params for WebSocket APIs (#107)
APIGatewayWebSocketRequest was not decoding url query parameters from event payloads. ### Motivation: API Gateway WebSocket endpoints do support capturing and forwarding query parameters. Probably just omitted because it isn't particularly common. ### Modifications: Added the field. Added a test. Verified against a real system that uses the feature. ### Result: Query parameters for APIGatewayWebSocketRequest will be available to clients.
1 parent a7f7cf4 commit f5c173c

File tree

2 files changed

+57
-0
lines changed

2 files changed

+57
-0
lines changed

Sources/AWSLambdaEvents/APIGateway+WebSockets.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,15 @@ public struct APIGatewayWebSocketRequest: Codable {
3939
}
4040

4141
public let headers: HTTPHeaders?
42+
public let queryStringParameters: [String: String]?
4243
public let multiValueHeaders: HTTPMultiValueHeaders?
4344
public let context: Context
4445
public let body: String?
4546
public let isBase64Encoded: Bool?
4647

4748
enum CodingKeys: String, CodingKey {
4849
case headers
50+
case queryStringParameters
4951
case multiValueHeaders
5052
case context = "requestContext"
5153
case body

Tests/AWSLambdaEventsTests/APIGateway+WebsocketsTests.swift

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,54 @@ class APIGatewayWebSocketsTests {
6565
}
6666
"""
6767

68+
static let exampleConnectEventBodyWithQueryParams = """
69+
{
70+
"headers": {
71+
"Host": "lqrlmblaa2.execute-api.us-east-1.amazonaws.com",
72+
"Origin": "wss://lqrlmblaa2.execute-api.us-east-1.amazonaws.com",
73+
"Sec-WebSocket-Extensions": "",
74+
"Sec-WebSocket-Key": "am5ubWVpbHd3bmNyYXF0ag==",
75+
"Sec-WebSocket-Version": "13",
76+
"X-Amzn-Trace-Id": "Root=1-64b83950-42de8e247b4c2b43091ef67c",
77+
"X-Forwarded-For": "24.148.42.16",
78+
"X-Forwarded-Port": "443",
79+
"X-Forwarded-Proto": "https"
80+
},
81+
"queryStringParameters":{
82+
"foo":"bar"
83+
},
84+
"multiValueHeaders": {
85+
"Host": [ "lqrlmblaa2.execute-api.us-east-1.amazonaws.com" ],
86+
"Origin": [ "wss://lqrlmblaa2.execute-api.us-east-1.amazonaws.com" ],
87+
"Sec-WebSocket-Extensions": [
88+
"permessage-deflate; client_max_window_bits; server_max_window_bits=15"
89+
],
90+
"Sec-WebSocket-Key": [ "am5ubWVpbHd3bmNyYXF0ag==" ],
91+
"Sec-WebSocket-Version": [ "13" ],
92+
"X-Amzn-Trace-Id": [ "Root=1-64b83950-42de8e247b4c2b43091ef67c" ],
93+
"X-Forwarded-For": [ "24.148.42.16" ],
94+
"X-Forwarded-Port": [ "443" ],
95+
"X-Forwarded-Proto": [ "https" ]
96+
},
97+
"requestContext": {
98+
"routeKey": "$connect",
99+
"eventType": "CONNECT",
100+
"extendedRequestId": "IU3kkGyEoAMFwZQ=",
101+
"requestTime": "19/Jul/2023:19:28:16 +0000",
102+
"messageDirection": "IN",
103+
"stage": "dev",
104+
"connectedAt": 1689794896145,
105+
"requestTimeEpoch": 1689794896162,
106+
"identity": { "sourceIp": "24.148.42.16" },
107+
"requestId": "IU3kkGyEoAMFwZQ=",
108+
"domainName": "lqrlmblaa2.execute-api.us-east-1.amazonaws.com",
109+
"connectionId": "IU3kkeN4IAMCJwA=",
110+
"apiId": "lqrlmblaa2"
111+
},
112+
"isBase64Encoded": false
113+
}
114+
"""
115+
68116
// MARK: - Request -
69117

70118
// MARK: Decoding
@@ -76,4 +124,11 @@ class APIGatewayWebSocketsTests {
76124
#expect(req.context.connectionId == "IU3kkeN4IAMCJwA=")
77125
#expect(req.body == nil)
78126
}
127+
128+
@Test func testRequestDecodingExampleWithQueryParams() async throws {
129+
let data = APIGatewayWebSocketsTests.exampleConnectEventBodyWithQueryParams.data(using: .utf8)!
130+
let req = try JSONDecoder().decode(APIGatewayWebSocketRequest.self, from: data)
131+
132+
#expect(req.queryStringParameters?["foo"] == "bar")
133+
}
79134
}

0 commit comments

Comments
 (0)