Skip to content

Commit 1ea155b

Browse files
authored
Merge pull request #45 from ProxymanApp/bug/request-data-missing
[BUG] Missing Request's Body in some scenario
2 parents bfc1b75 + f0a19fc commit 1ea155b

File tree

3 files changed

+32
-32
lines changed

3 files changed

+32
-32
lines changed

Atlantis-Example/Atlantis-Example/ViewController.swift

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,11 @@ class ViewController: UIViewController, URLSessionDataDelegate {
2121
}
2222

2323
func makeSimpleRequest() {
24-
let url = URL(string: "https://httpbin.org/get?name=proxyman&id=\(UUID().uuidString)&randon=\(Int.random(in: 0..<10000))")!
25-
let task = URLSession.shared.dataTask(with: url) { (data, response, error) in
24+
let url = URL(string: "https://httpbin.org/post?name=proxyman&id=\(UUID().uuidString)&randon=\(Int.random(in: 0..<10000))")!
25+
var request = URLRequest(url: url)
26+
request.httpMethod = "POST"
27+
request.httpBody = "it's raw text".data(using: .utf8)
28+
let task = URLSession.shared.dataTask(with: request) { (data, response, error) in
2629
if let error = error {
2730
print(error)
2831
return

Atlantis-Example/Podfile.lock

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
PODS:
2-
- atlantis-proxyman (1.0.4)
2+
- atlantis-proxyman (1.4.2)
33

44
DEPENDENCIES:
55
- atlantis-proxyman (from `../atlantis-proxyman.podspec`)
@@ -9,7 +9,7 @@ EXTERNAL SOURCES:
99
:path: "../atlantis-proxyman.podspec"
1010

1111
SPEC CHECKSUMS:
12-
atlantis-proxyman: 7f8b7c9bb1edc3f80e48de52cf88a5eb7ee55dcf
12+
atlantis-proxyman: 3fb72c5f5e1406ee707d86c362ee5514012911e4
1313

1414
PODFILE CHECKSUM: 5e671eaef5969ada29220d36ba9fc9831b2c62c3
1515

Sources/Atlantis.swift

Lines changed: 25 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -172,31 +172,31 @@ extension Atlantis {
172172
extension Atlantis: InjectorDelegate {
173173

174174
func injectorSessionDidCallResume(task: URLSessionTask) {
175-
// Since it's not possible to revert the Method Swizzling change
176-
// We use isEnable instead
177-
guard Atlantis.isEnabled.value else { return }
178-
queue.async {[weak self] in
179-
guard let strongSelf = self else { return }
175+
// Use sync to prevent task.currentRequest.httpBody is nil
176+
// If we use async, sometime the httpbody is released -> Atlantis could get the Request's body
177+
// It's safe to use sync here because URL has their own background queue
178+
queue.sync {
179+
// Since it's not possible to revert the Method Swizzling change
180+
// We use isEnable instead
181+
guard Atlantis.isEnabled.value else { return }
180182

181183
// Cache
182-
_ = strongSelf.getPackage(task)
184+
_ = getPackage(task)
183185
}
184186
}
185187

186188
func injectorSessionDidReceiveResponse(dataTask: URLSessionTask, response: URLResponse) {
187-
guard Atlantis.isEnabled.value else { return }
188-
queue.async {[weak self] in
189-
guard let strongSelf = self else { return }
190-
let package = strongSelf.getPackage(dataTask)
189+
queue.sync {
190+
guard Atlantis.isEnabled.value else { return }
191+
let package = getPackage(dataTask)
191192
package?.updateResponse(response)
192193
}
193194
}
194195

195196
func injectorSessionDidReceiveData(dataTask: URLSessionTask, data: Data) {
196-
guard Atlantis.isEnabled.value else { return }
197-
queue.async {[weak self] in
198-
guard let strongSelf = self else { return }
199-
let package = strongSelf.getPackage(dataTask)
197+
queue.sync {
198+
guard Atlantis.isEnabled.value else { return }
199+
let package = getPackage(dataTask)
200200
package?.append(data)
201201
}
202202
}
@@ -206,21 +206,19 @@ extension Atlantis: InjectorDelegate {
206206
}
207207

208208
func injectorConnectionDidReceive(connection: NSURLConnection, response: URLResponse) {
209-
guard Atlantis.isEnabled.value else { return }
210-
queue.async {[weak self] in
211-
guard let strongSelf = self else { return }
209+
queue.sync {
210+
guard Atlantis.isEnabled.value else { return }
212211

213212
// Cache
214-
let package = strongSelf.getPackage(connection)
213+
let package = getPackage(connection)
215214
package?.updateResponse(response)
216215
}
217216
}
218217

219218
func injectorConnectionDidReceive(connection: NSURLConnection, data: Data) {
220-
guard Atlantis.isEnabled.value else { return }
221-
queue.async {[weak self] in
222-
guard let strongSelf = self else { return }
223-
let package = strongSelf.getPackage(connection)
219+
queue.sync {
220+
guard Atlantis.isEnabled.value else { return }
221+
let package = getPackage(connection)
224222
package?.append(data)
225223
}
226224
}
@@ -239,10 +237,9 @@ extension Atlantis: InjectorDelegate {
239237
extension Atlantis {
240238

241239
private func handleDidFinish(_ taskOrConnection: AnyObject, error: Error?) {
242-
guard Atlantis.isEnabled.value else { return }
243-
queue.async {[weak self] in
244-
guard let strongSelf = self else { return }
245-
guard let package = strongSelf.getPackage(taskOrConnection) else {
240+
queue.sync {
241+
guard Atlantis.isEnabled.value else { return }
242+
guard let package = getPackage(taskOrConnection) else {
246243
return
247244
}
248245

@@ -251,10 +248,10 @@ extension Atlantis {
251248

252249
// At this time, the package has all the data
253250
// It's time to send it
254-
strongSelf.startSendingMessage(package: package)
251+
startSendingMessage(package: package)
255252

256253
// Then remove it from our cache
257-
strongSelf.packages.removeValue(forKey: package.id)
254+
packages.removeValue(forKey: package.id)
258255
}
259256
}
260257

0 commit comments

Comments
 (0)