@@ -21,10 +21,11 @@ open class Client {
21
21
open var headers: [String: String] = [
22
22
"content-type": "",
23
23
"x-sdk-version": "{{spec .title | caseDash }}:{{ language .name | caseLower }}:{{ sdk .version }}"{% if spec .global .defaultHeaders | length > 0 %},{% endif %}
24
+
24
25
{% for key ,header in spec .global .defaultHeaders %}
25
26
"{{key }}": "{{header }}"{% if not loop .last %},{% endif %}
26
- {% endfor %}
27
27
28
+ {% endfor %}
28
29
]
29
30
30
31
open var config: [String: String] = [:]
@@ -228,7 +229,7 @@ open class Client {
228
229
headers: [String: String] = [:],
229
230
params: [String: Any?] = [:],
230
231
sink: ((ByteBuffer) -> Void)? = nil,
231
- convert : (([String: Any]) -> T)? = nil,
232
+ converter : (([String: Any]) -> T)? = nil,
232
233
completion: ((Result<T , {{ spec .title | caseUcfirst }}Error >) -> Void)? = nil
233
234
) {
234
235
let validParams = params.filter { $0.value != nil }
@@ -259,7 +260,7 @@ open class Client {
259
260
request.addDomainCookies()
260
261
261
262
if "GET" == method {
262
- execute(request, convert: convert , completion: completion)
263
+ execute(request, converter: converter , completion: completion)
263
264
return
264
265
}
265
266
@@ -272,7 +273,7 @@ open class Client {
272
273
return
273
274
}
274
275
275
- execute(request, withSink: sink, convert: convert , completion: completion)
276
+ execute(request, withSink: sink, converter: converter , completion: completion)
276
277
}
277
278
278
279
private func buildBody(
@@ -289,7 +290,7 @@ open class Client {
289
290
private func execute<T >(
290
291
_ request: HTTPClient.Request,
291
292
withSink bufferSink: ((ByteBuffer) -> Void)? = nil,
292
- convert : (([String: Any]) -> T)? = nil,
293
+ converter : (([String: Any]) -> T)? = nil,
293
294
completion: ((Result<T , {{ spec .title | caseUcfirst }}Error >) -> Void)? = nil
294
295
) {
295
296
if bufferSink == nil {
@@ -341,7 +342,7 @@ open class Client {
341
342
let dict = try! JSONSerialization
342
343
.jsonObject(with: response.body!) as? [String: Any]
343
344
344
- completion(.success(convert ?(dict!) ?? dict! as! T))
345
+ completion(.success(converter ?(dict!) ?? dict! as! T))
345
346
}
346
347
default:
347
348
var message = ""
@@ -384,7 +385,8 @@ open class Client {
384
385
headers: inout [String: String],
385
386
params: inout [String: Any?],
386
387
paramName: String,
387
- convert: (([String: Any]) -> T)? = nil,
388
+ idParamName: String? = nil,
389
+ converter: (([String: Any]) -> T)? = nil,
388
390
onProgress: ((UploadProgress) -> Void)? = nil,
389
391
completion: ((Result<T , {{ spec .title | caseUcfirst }}Error >) -> Void)? = nil
390
392
) {
@@ -397,20 +399,44 @@ open class Client {
397
399
path: path,
398
400
headers: headers,
399
401
params: params,
400
- convert: convert ,
402
+ converter: converter ,
401
403
completion: completion
402
404
)
403
405
return
404
406
}
405
407
406
- var input = file.buffer
408
+ let input = file.buffer
407
409
var offset = 0
408
410
var result = [String:Any]()
409
411
let group = DispatchGroup()
410
412
413
+ if idParamName != nil && params[idParamName!] as! String != "unique()" {
414
+ // Make a request to check if a file already exists
415
+ group.enter()
416
+ call(
417
+ method: "GET",
418
+ path: path + "/" + (params[idParamName!] as! String),
419
+ headers: headers,
420
+ params: [:],
421
+ converter: { return $0 }
422
+ ) { response in
423
+ switch response {
424
+ case let .success(map):
425
+ let chunksUploaded = map["chunksUploaded"] as! Int
426
+ offset = min(size, (chunksUploaded * Client.chunkSize))
427
+ group.leave()
428
+ case let .failure(error):
429
+ completion?(.failure(error))
430
+ group.leave()
431
+ return
432
+ }
433
+ }
434
+ group.wait()
435
+ }
436
+
411
437
while offset < size {
412
- let slice = input.readSlice( length: Client.chunkSize)
413
- ?? input.readSlice( length: Int(size - offset))
438
+ let slice = input.getSlice(at: offset, length: Client.chunkSize)
439
+ ?? input.getSlice(at: offset, length: Int(size - offset))
414
440
415
441
params[paramName] = File(
416
442
name: file.name,
@@ -426,7 +452,7 @@ open class Client {
426
452
path: path,
427
453
headers: headers,
428
454
params: params,
429
- convert : { return $0 }
455
+ converter : { return $0 }
430
456
) { response in
431
457
switch response {
432
458
case let .success(map):
@@ -451,7 +477,7 @@ open class Client {
451
477
))
452
478
}
453
479
454
- completion?(.success(convert !(result)))
480
+ completion?(.success(converter !(result)))
455
481
}
456
482
457
483
0 commit comments