Skip to content

Commit 74d09cf

Browse files
meili-bors[bot]ppamorimbidoubiwa
authored
Merge #283
283: Refactor the request function to use a simple request builder r=bidoubiwa a=ppamorim # Pull Request ## What does this PR do? Fixes issue pointed on #272 <!-- Please link the issue you're trying to fix with this PR, if none then please create an issue first. --> ## PR checklist Please check if your PR fulfills the following requirements: - [X] Does this PR fix an existing issue? - [X] Have you read the contributing guidelines? - [X] Have you made sure that the title is accurate and descriptive of the changes? Thank you so much for contributing to Meilisearch! Co-authored-by: Pedro Paulo de Amorim <pp.amorim@hotmail.com> Co-authored-by: Charlotte Vermandel <charlottevermandel@gmail.com>
2 parents 05279fe + 486d24c commit 74d09cf

File tree

1 file changed

+44
-66
lines changed

1 file changed

+44
-66
lines changed

Sources/MeiliSearch/Request.swift

Lines changed: 44 additions & 66 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,14 @@ public protocol URLSessionDataTaskProtocol {
1919
func resume()
2020
}
2121

22+
private enum HTTPMethod: String {
23+
case get = "GET"
24+
case put = "PUT"
25+
case post = "POST"
26+
case patch = "PATCH"
27+
case delete = "DELETE"
28+
}
29+
2230
public final class Request {
2331
private let config: Config
2432
private let session: URLSessionProtocol
@@ -28,6 +36,33 @@ public final class Request {
2836
self.session = config.session ?? URLSession.shared
2937
}
3038

39+
private func request(
40+
_ httpMethod: HTTPMethod,
41+
_ url: URL,
42+
_ headers: [String: String] = [:],
43+
data: Data? = nil
44+
) -> URLRequest {
45+
var request = URLRequest(url: url)
46+
request.httpMethod = httpMethod.rawValue
47+
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
48+
49+
if httpMethod != .get {
50+
request.httpBody = data
51+
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
52+
}
53+
54+
if let apiKey: String = config.apiKey {
55+
let bearer = "Bearer \(apiKey)"
56+
request.setValue(bearer, forHTTPHeaderField: "Authorization")
57+
}
58+
59+
headers.forEach { key, value in
60+
request.addValue(value, forHTTPHeaderField: key)
61+
}
62+
63+
return request
64+
}
65+
3166
func get(
3267
api: String,
3368
param: String? = nil,
@@ -38,24 +73,11 @@ public final class Request {
3873
if let param: String = param, !param.isEmpty {
3974
urlString += param
4075
}
41-
4276
guard let url = URL(string: urlString) else {
4377
completion(.failure(MeiliSearch.Error.invalidURL(url: urlString)))
4478
return
4579
}
46-
47-
var request = URLRequest(url: url)
48-
request.httpMethod = "GET"
49-
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
50-
headers.forEach { key, value in
51-
request.addValue(value, forHTTPHeaderField: key)
52-
}
53-
54-
if let apiKey = config.apiKey {
55-
let bearer = "Bearer \(apiKey)"
56-
request.addValue(bearer, forHTTPHeaderField: "Authorization")
57-
}
58-
80+
let request = self.request(.get, url, headers)
5981
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
6082
do {
6183
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
@@ -73,25 +95,15 @@ public final class Request {
7395

7496
func post(
7597
api: String,
98+
headers: [String: String] = [:],
7699
_ data: Data,
77100
_ completion: @escaping (Result<Data, Swift.Error>) -> Void) {
78101
guard let url = URL(string: config.url(api: api)) else {
79102
completion(.failure(MeiliSearch.Error.invalidURL()))
80103
return
81104
}
82105

83-
var request = URLRequest(url: url)
84-
request.httpMethod = "POST"
85-
request.httpBody = data
86-
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
87-
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
88-
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
89-
90-
if let apiKey: String = config.apiKey {
91-
let bearer = "Bearer \(apiKey)"
92-
request.addValue(bearer, forHTTPHeaderField: "Authorization")
93-
}
94-
106+
let request = self.request(.post, url, headers, data: data)
95107
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
96108
do {
97109
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
@@ -111,25 +123,14 @@ public final class Request {
111123

112124
func put(
113125
api: String,
126+
headers: [String: String] = [:],
114127
_ data: Data,
115128
_ completion: @escaping (Result<Data, Swift.Error>) -> Void) {
116129
guard let url = URL(string: config.url(api: api)) else {
117130
completion(.failure(MeiliSearch.Error.invalidURL()))
118131
return
119132
}
120-
121-
var request = URLRequest(url: url)
122-
request.httpMethod = "PUT"
123-
request.httpBody = data
124-
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
125-
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
126-
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
127-
128-
if let apiKey: String = config.apiKey {
129-
let bearer = "Bearer \(apiKey)"
130-
request.addValue(bearer, forHTTPHeaderField: "Authorization")
131-
}
132-
133+
let request = self.request(.put, url, headers, data: data)
133134
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
134135
do {
135136
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
@@ -144,31 +145,19 @@ public final class Request {
144145
return
145146
}
146147
}
147-
148148
task.resume()
149149
}
150150

151151
func patch(
152152
api: String,
153+
headers: [String: String] = [:],
153154
_ data: Data,
154155
_ completion: @escaping (Result<Data, Swift.Error>) -> Void) {
155156
guard let url = URL(string: config.url(api: api)) else {
156157
completion(.failure(MeiliSearch.Error.invalidURL()))
157158
return
158159
}
159-
160-
var request = URLRequest(url: url)
161-
request.httpMethod = "PATCH"
162-
request.httpBody = data
163-
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
164-
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
165-
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
166-
167-
if let apiKey: String = config.apiKey {
168-
let bearer = "Bearer \(apiKey)"
169-
request.setValue(bearer, forHTTPHeaderField: "Authorization")
170-
}
171-
160+
let request = self.request(.patch, url, headers, data: data)
172161
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
173162
do {
174163
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)
@@ -183,29 +172,18 @@ public final class Request {
183172
return
184173
}
185174
}
186-
187175
task.resume()
188176
}
189177

190178
func delete(
191179
api: String,
180+
headers: [String: String] = [:],
192181
_ completion: @escaping (Result<Data?, Swift.Error>) -> Void) {
193182
guard let url = URL(string: config.url(api: api)) else {
194183
completion(.failure(MeiliSearch.Error.invalidURL()))
195184
return
196185
}
197-
198-
var request = URLRequest(url: url)
199-
request.httpMethod = "DELETE"
200-
request.setValue("application/json", forHTTPHeaderField: "Content-Type")
201-
request.setValue("application/json; charset=utf-8", forHTTPHeaderField: "Accept")
202-
request.setValue(PackageVersion.qualifiedVersion(), forHTTPHeaderField: "User-Agent")
203-
204-
if let apiKey: String = config.apiKey {
205-
let bearer = "Bearer \(apiKey)"
206-
request.addValue(bearer, forHTTPHeaderField: "Authorization")
207-
}
208-
186+
let request = self.request(.delete, url, headers)
209187
let task: URLSessionDataTaskProtocol = session.execute(with: request) { data, response, error in
210188
do {
211189
try MeiliSearch.errorHandler(url: url, data: data, response: response, error: error)

0 commit comments

Comments
 (0)