Skip to content

Commit 4b48153

Browse files
authored
Merge pull request #5 from joemasilotti/user-agent
User agent
2 parents 7374507 + a9e9232 commit 4b48153

File tree

6 files changed

+35
-1
lines changed

6 files changed

+35
-1
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
## 2024
44

5+
* February 13 - Option to set a user agent for all request - [#5](https://github.com/joemasilotti/HTTP-Client/pull/5)
56
* February 13 - Expose status code when possible - [#4](https://github.com/joemasilotti/HTTP-Client/pull/4)
67

78
## 2022

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,16 @@ let request = URLRequest(
108108
_ = await client.request(request)
109109
```
110110

111+
### User agent
112+
113+
A user agent can also be set for all requests, assigning the `"User-Agent"` header.
114+
115+
```swift
116+
import HTTP
117+
118+
HTTP.Global.userAgent = "Custom User Agent"
119+
```
120+
111121
### Key encoding strategies
112122

113123
By default, all encoding and decoding of keys to JSON is done by converting to snake case.

Sources/HTTP/Global.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,13 @@ import Foundation
33
public enum Global {
44
public static var keyDecodingStrategy: JSONDecoder.KeyDecodingStrategy = .convertFromSnakeCase
55
public static var keyEncodingStrategy: JSONEncoder.KeyEncodingStrategy = .convertToSnakeCase
6+
public static var userAgent: String?
67
public static var requestLoader: RequestLoader = URLSession.shared
78

89
static func resetToDefaults() {
910
keyDecodingStrategy = .convertFromSnakeCase
1011
keyEncodingStrategy = .convertToSnakeCase
12+
userAgent = nil
1113
requestLoader = URLSession.shared
1214
}
1315
}

Sources/HTTP/Request.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,12 @@ public class Request {
66
public init(url: URL, method: Method = .get, headers: Headers = [:]) {
77
self.url = url
88
self.method = method
9-
self.headers = headers
9+
10+
if let userAgent = Global.userAgent {
11+
self.headers = headers.merging(["User-Agent": userAgent]) { _, new in new }
12+
} else {
13+
self.headers = headers
14+
}
1015
}
1116

1217
// MARK: Internal

Tests/HTTPTests/BodyRequestTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,14 @@ class BodyRequestTests: XCTestCase {
5252
XCTAssertEqual(json["secondProperty"], "value")
5353
}
5454

55+
func test_init_setsGlobalUserAgent() throws {
56+
Global.userAgent = "Custom User Agent"
57+
let request = BodyRequest(url: URL.test, body: TestObject())
58+
59+
let urlRequest = request.asURLRequest
60+
XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "User-Agent"), "Custom User Agent")
61+
}
62+
5563
private func decodeRequest(_ request: Request) throws -> [String: String] {
5664
let urlRequest = request.asURLRequest
5765
let data = try XCTUnwrap(urlRequest.httpBody)

Tests/HTTPTests/RequestTests.swift

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,4 +28,12 @@ class RequestTests: XCTestCase {
2828
let requestWithHeaders = Request(url: URL.test, headers: headers)
2929
XCTAssertEqual(requestWithHeaders.asURLRequest.allHTTPHeaderFields, headers)
3030
}
31+
32+
func test_init_setsGlobalUserAgent() throws {
33+
Global.userAgent = "Custom User Agent"
34+
let request = Request(url: URL.test)
35+
36+
let urlRequest = request.asURLRequest
37+
XCTAssertEqual(urlRequest.value(forHTTPHeaderField: "User-Agent"), "Custom User Agent")
38+
}
3139
}

0 commit comments

Comments
 (0)