@@ -17,6 +17,26 @@ class TestResponseResolver: HTTPResponseWriter {
17
17
18
18
var response : ( status: HTTPResponseStatus , headers: HTTPHeaders ) ?
19
19
var responseBody : HTTPResponseBody ?
20
+
21
+ ///Flag to track whether our handler has told us not to call it anymore
22
+ private let _shouldStopProcessingBodyLock = DispatchSemaphore ( value: 1 )
23
+ private var _shouldStopProcessingBody : Bool = false
24
+ private var shouldStopProcessingBody : Bool {
25
+ get {
26
+ _shouldStopProcessingBodyLock. wait ( )
27
+ defer {
28
+ _shouldStopProcessingBodyLock. signal ( )
29
+ }
30
+ return _shouldStopProcessingBody
31
+ }
32
+ set {
33
+ _shouldStopProcessingBodyLock. wait ( )
34
+ defer {
35
+ _shouldStopProcessingBodyLock. signal ( )
36
+ }
37
+ _shouldStopProcessingBody = newValue
38
+ }
39
+ }
20
40
21
41
init ( request: HTTPRequest , requestBody: Data ) {
22
42
self . request = request
@@ -31,18 +51,17 @@ class TestResponseResolver: HTTPResponseWriter {
31
51
32
52
func resolveHandler( _ handler: HTTPRequestHandler ) {
33
53
let chunkHandler = handler ( request, self )
34
- var stop = false
35
- var finished = false
36
- while !stop && !finished {
37
- switch chunkHandler {
54
+ if shouldStopProcessingBody {
55
+ return
56
+ }
57
+ switch chunkHandler {
38
58
case . processBody( let handler) :
39
- handler ( . chunk ( data : self . requestBody , finishedProcessing : {
40
- finished = true
41
- } ) , & stop )
42
- handler ( . end, & stop )
59
+ _shouldStopProcessingBodyLock . wait ( )
60
+ handler ( . chunk ( data : self . requestBody , finishedProcessing : { self . _shouldStopProcessingBodyLock . signal ( ) } ) , & _shouldStopProcessingBody )
61
+ var dummy = false
62
+ handler ( . end, & dummy )
43
63
case . discardBody:
44
- finished = true
45
- }
64
+ break
46
65
}
47
66
}
48
67
0 commit comments