@@ -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+
2230public 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