@@ -45,10 +45,8 @@ open class Client {
45
45
46
46
public init() {
47
47
http = Client.createHTTP()
48
-
49
- #if os(macOS) || os(iOS) || os(tvOS) || os(watchOS)
50
- addUserAgent()
51
- #endif
48
+ addUserAgentHeader()
49
+ addOriginHeader()
52
50
}
53
51
54
52
private static func createHTTP(
@@ -233,10 +231,6 @@ open class Client {
233
231
convert: (([String: Any]) -> T)? = nil,
234
232
completion: ((Result<T , {{ spec .title | caseUcfirst }}Error >) -> Void)? = nil
235
233
) {
236
- self.headers.merge(headers) { (_, new) in
237
- new
238
- }
239
-
240
234
let validParams = params.filter { $0.value != nil }
241
235
242
236
let queryParameters = method == "GET" && !validParams.isEmpty
@@ -258,7 +252,10 @@ open class Client {
258
252
return
259
253
}
260
254
261
- addHeaders(to: & request)
255
+ for (key, value) in self.headers.merging(headers, uniquingKeysWith: { $1 }) {
256
+ request.headers.add(name: key, value: value)
257
+ }
258
+
262
259
request.addDomainCookies()
263
260
264
261
if "GET" == method {
@@ -278,12 +275,6 @@ open class Client {
278
275
execute(request, withSink: sink, convert: convert, completion: completion)
279
276
}
280
277
281
- private func addHeaders(to request: inout HTTPClient.Request) {
282
- for (key, value) in self.headers {
283
- request.headers.add(name: key, value: value)
284
- }
285
- }
286
-
287
278
private func buildBody(
288
279
for request: inout HTTPClient.Request,
289
280
with params: [String: Any?]
@@ -534,50 +525,76 @@ open class Client {
534
525
535
526
request .headers .remove (name: " content-type" )
536
527
if !chunked {
537
- request .headers .add (name: " Content-Length" , value: bodyBuffer .readableBytes .description )
528
+ request .headers .add (name: " Content-Length" , value: bodyBuffer .readableBytes .description )
538
529
}
539
530
request .headers .add (name: " Content-Type" , value: " multipart/form-data;boundary=\" \(Client .boundary )\" " )
540
531
request .body = .byteBuffer (bodyBuffer )
541
532
}
542
533
543
- private func addUserAgent () {
534
+ private func addUserAgentHeader () {
544
535
let packageInfo = OSPackageInfo .get ()
545
- let deviceInfo = OSDeviceInfo ()
546
- var device = " " ;
547
- var operatingSystem = " "
536
+ let device = Client .getDevice ()
537
+
538
+ #if !os (Linux ) && !os (Windows )
539
+ _ = addHeader (
540
+ key: " user-agent" ,
541
+ value: " \(packageInfo.packageName)/\(packageInfo.version) \(device)"
542
+ )
543
+ #endif
544
+ }
545
+
546
+ private func addOriginHeader () {
547
+ let packageInfo = OSPackageInfo .get ()
548
+ let operatingSystem = Client .getOperatingSystem ()
549
+ _ = addHeader (
550
+ key: " origin" ,
551
+ value: " {{ spec .title | caseLower }}-\(operatingSystem)://\(packageInfo.packageName)"
552
+ )
553
+ }
554
+ }
548
555
556
+ extension Client {
557
+ private static func getOperatingSystem () -> String {
549
558
#if os(iOS)
550
- let iosinfo = deviceInfo .iOSInfo
551
- device = " \(iosinfo!.modelIdentifier) iOS/\(iosinfo!.systemVersion)" ;
552
- operatingSystem = " ios"
553
- #elseif os (tvOS )
554
- let iosinfo = deviceInfo .iOSInfo
555
- device = " \(iosinfo!.systemInfo.machine) tvOS/\(iosinfo!.systemVersion)" ;
556
- operatingSystem = " tvos"
559
+ return "ios"
557
560
#elseif os(watchOS)
558
- let iosinfo = deviceInfo . iOSInfo
559
- device = " \(iosinfo!.systemInfo.machine) watchOS/\(iosinfo!.systemVersion) " ;
560
- operatingSystem = " watchos "
561
+ return "watchos"
562
+ #elseif os(tvOS)
563
+ return "tvos "
561
564
#elseif os(macOS)
562
- let macinfo = deviceInfo .macOSInfo
563
- device = " (Macintosh; \(macinfo!.model))"
564
- operatingSystem = " macos"
565
+ return "macos"
565
566
#elseif os(Linux)
566
- let lininfo = deviceInfo .linuxInfo
567
- device = " (Linux; U; \(lininfo!.id) \(lininfo!.version))"
568
- operatingSystem = " linux"
567
+ return "linux"
569
568
#elseif os(Windows)
570
- let wininfo = deviceInfo .windowsInfo
571
- device = " (Windows NT; \(wininfo!.computerName))"
572
- operatingSystem = " windows"
569
+ return "windows"
573
570
#endif
571
+ }
574
572
575
- #if !os (Linux ) && !os (Windows )
576
- _ = addHeader (
577
- key: " user-agent" ,
578
- value: " \(packageInfo.packageName)/\(packageInfo.version) \(device)"
579
- )
573
+ private static func getDevice() -> String {
574
+ let deviceInfo = OSDeviceInfo()
575
+ var device = ""
576
+
577
+ #if os(iOS)
578
+ let info = deviceInfo.iOSInfo
579
+ device = "\(info!.modelIdentifier) iOS/\(info!.systemVersion)"
580
+ #elseif os(watchOS)
581
+ let info = deviceInfo.watchOSInfo
582
+ device = "\(info!.systemInfo.machine) watchOS/\(info!.systemVersion)"
583
+ #elseif os(tvOS)
584
+ let info = deviceInfo.tvOSInfo
585
+ device = "\(info!.systemInfo.machine) tvOS/\(info!.systemVersion)"
586
+ #elseif os(macOS)
587
+ let info = deviceInfo.macOSInfo
588
+ device = "(Macintosh; \(info!.model))"
589
+ #elseif os(Linux)
590
+ let info = deviceInfo.linuxInfo
591
+ device = "(Linux; U; \(info!.id) \(info!.version))"
592
+ #elseif os(Windows)
593
+ let info = deviceInfo.windowsInfo
594
+ device = "(Windows NT; \(info!.computerName))"
580
595
#endif
596
+
597
+ return device
581
598
}
582
599
}
583
600
0 commit comments