Skip to content

Commit caf29b4

Browse files
committed
guard against multiple iterations
1 parent d5ac556 commit caf29b4

File tree

2 files changed

+18
-11
lines changed

2 files changed

+18
-11
lines changed

Package.swift

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,16 @@ let package = Package(
1515
],
1616
dependencies: [
1717
.package(url: "https://github.com/apple/swift-openapi-runtime.git", .upToNextMinor(from: "0.3.0")),
18-
.package(url: "https://github.com/vapor/vapor.git", from: "4.0.0")
18+
.package(url: "https://github.com/vapor/vapor.git", from: "4.84.4"),
19+
.package(url: "https://github.com/apple/swift-atomics", from: "1.2.0")
1920
],
2021
targets: [
2122
.target(
2223
name: "OpenAPIVapor",
2324
dependencies: [
2425
.product(name: "Vapor", package: "vapor"),
25-
.product(name: "OpenAPIRuntime", package: "swift-openapi-runtime")
26+
.product(name: "OpenAPIRuntime", package: "swift-openapi-runtime"),
27+
.product(name: "Atomics", package: "swift-atomics")
2628
]
2729
),
2830
.testTarget(

Sources/OpenAPIVapor/VaporTransport.swift

Lines changed: 14 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ import OpenAPIRuntime
1717
import HTTPTypes
1818
import Vapor
1919
import NIOFoundationCompat
20+
import Atomics
2021

2122
public final class VaporTransport {
2223

@@ -58,6 +59,7 @@ enum VaporTransportError: Error {
5859
case unsupportedHTTPMethod(String)
5960
case duplicatePathParameter([String])
6061
case missingRequiredPathParameter(String)
62+
case multipleBodyIteration
6163
}
6264

6365
extension [Vapor.PathComponent] {
@@ -143,21 +145,24 @@ extension Vapor.Response.Body {
143145
self = .empty
144146
return
145147
}
148+
let iterated = ManagedAtomic(false)
146149
let stream: @Sendable (any Vapor.BodyStreamWriter) -> () = { writer in
150+
guard iterated.compareExchange(
151+
expected: false,
152+
desired: true,
153+
ordering: .relaxed
154+
).exchanged else {
155+
_ = writer.write(.error(VaporTransportError.multipleBodyIteration))
156+
return
157+
}
147158
_ = writer.eventLoop.makeFutureWithTask {
148159
do {
149160
for try await chunk in body {
150-
try await writer.eventLoop.flatSubmit {
151-
writer.write(.buffer(ByteBuffer(bytes: chunk)))
152-
}.get()
161+
try await writer.write(.buffer(ByteBuffer(bytes: chunk))).get()
153162
}
154-
try await writer.eventLoop.flatSubmit {
155-
writer.write(.end)
156-
}.get()
163+
try await writer.write(.end).get()
157164
} catch {
158-
try await writer.eventLoop.flatSubmit {
159-
writer.write(.error(error))
160-
}.get()
165+
try await writer.write(.error(error)).get()
161166
}
162167
}
163168
}

0 commit comments

Comments
 (0)