@@ -3,11 +3,11 @@ import RxSwift
3
3
4
4
/// Represents caching settings
5
5
public struct CacheMode {
6
- /// If true, response for GET request will be cached
6
+ /// If true, response for GET request will be cached
7
7
public let cacheResponse : Bool
8
- /// If true, HttpClient will immediately return cacged respons if it exists
8
+ /// If true, HttpClient will immediately return cacged respons if it exists
9
9
public let returnCachedResponse : Bool
10
- /// If true, HttpClient will invoke request
10
+ /// If true, HttpClient will invoke request
11
11
public let invokeRequest : Bool
12
12
13
13
public init ( cacheResponse: Bool = true , returnCachedResponse: Bool = true , invokeRequest: Bool = true ) {
@@ -16,15 +16,17 @@ public struct CacheMode {
16
16
self . invokeRequest = invokeRequest
17
17
}
18
18
19
- /// Only cached response will be returned
20
- public static let cacheOnly = { return CacheMode ( cacheResponse: false , returnCachedResponse: true , invokeRequest: false ) } ( )
21
- /// Cached response will not be returned even if exists
22
- public static let withoutCache = { return CacheMode ( cacheResponse: true , returnCachedResponse: false , invokeRequest: true ) } ( )
23
- /// Response will not be cached
24
- public static let notCacheResponse = { return CacheMode ( cacheResponse: false , returnCachedResponse: false , invokeRequest: true ) } ( )
19
+ /// Only cached response will be returned
20
+ public static let cacheOnly = CacheMode ( cacheResponse: false , returnCachedResponse: true , invokeRequest: false )
21
+ /// Cached response will not be returned even if exists
22
+ public static let withoutCache = CacheMode ( cacheResponse: true , returnCachedResponse: false , invokeRequest: true )
23
+ /// Response will not be cached
24
+ public static let notCacheResponse = CacheMode ( cacheResponse: false , returnCachedResponse: false , invokeRequest: true )
25
+ /// All conditions are true
26
+ public static let `default` = CacheMode ( cacheResponse: true , returnCachedResponse: true , invokeRequest: true )
25
27
}
26
28
27
- public extension HttpClientType {
29
+ public extension HttpClientType {
28
30
/**
29
31
Creates StreamDataTask
30
32
- parameter request: URL request
@@ -38,36 +40,73 @@ public extension HttpClientType {
38
40
/**
39
41
Creates streaming observable for URL
40
42
- parameter request: URL
43
+ - parameter method: HTTP method for request
44
+ - parameter body: Data that will be set to httpBody property of URLRequest
45
+ - parameter httpHeaders: HTTP headers for request
41
46
- parameter dataCacheProvider: Cache provider, that will be used to cache downloaded data
42
47
- returns: Created observable that emits stream events
43
48
*/
44
- func request( url: URL , dataCacheProvider: DataCacheProviderType ? = nil ) -> Observable < StreamTaskEvents > {
45
- return request ( URLRequest ( url: url) , dataCacheProvider: dataCacheProvider)
49
+ func request( url: URL , method: HttpMethod = . get, body: Data ? = nil , httpHeaders: [ String : String ] = [ : ] ,
50
+ dataCacheProvider: DataCacheProviderType ? = nil ) -> Observable < StreamTaskEvents > {
51
+ return request ( URLRequest ( url: url, method: method, body: body, headers: httpHeaders) , dataCacheProvider: dataCacheProvider)
46
52
}
47
-
53
+
48
54
/**
49
- Creates streaming observable for request
50
- - parameter request: URL request
55
+ Creates streaming observable for URL
56
+ - parameter request: URL
57
+ - parameter method: HTTP method for request
58
+ - parameter jsonBody: JSON object that will be serialized and send as HTTP Body
59
+ - parameter options: Options for JSON serialization
60
+ - parameter httpHeaders: HTTP headers for request
61
+ - parameter dataCacheProvider: Cache provider, that will be used to cache downloaded data
51
62
- returns: Created observable that emits stream events
52
63
*/
53
- func request( _ urlRequest: URLRequest ) -> Observable < StreamTaskEvents > {
54
- return request ( urlRequest, dataCacheProvider: nil )
64
+ func request( url: URL , method: HttpMethod = . get, jsonBody: Any , options: JSONSerialization . WritingOptions = [ ] , httpHeaders: [ String : String ] = [ : ] ,
65
+ dataCacheProvider: DataCacheProviderType ? = nil ) -> Observable < StreamTaskEvents > {
66
+ guard let req = URLRequest ( url: url, method: method, jsonBody: jsonBody, options: options, headers: httpHeaders) else {
67
+ return Observable . error ( HttpClientError . invalidJsonObject)
68
+ }
69
+
70
+ return request ( req, dataCacheProvider: dataCacheProvider)
55
71
}
56
72
57
73
/**
58
74
Creates streaming observable for URL
59
75
- parameter request: URL
60
- - parameter requestCacheMode: CacheMode for request
76
+ - parameter method: HTTP method for request
77
+ - parameter body: Data that will be set to httpBody property of URLRequest
78
+ - parameter httpHeaders: HTTP headers for request
79
+ - parameter requestCacheMode: CacheMode for request
61
80
- returns: Created observable that emits deserialized JSON object of HTTP request
62
81
*/
63
- func requestJson( url: URL , requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Any > {
64
- return requestJson ( URLRequest ( url: url) , requestCacheMode: requestCacheMode)
82
+ func requestJson( url: URL , method: HttpMethod = . get, body: Data ? = nil , httpHeaders: [ String : String ] = [ : ] ,
83
+ requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Any > {
84
+ return requestJson ( URLRequest ( url: url, method: method, body: body, headers: httpHeaders) , requestCacheMode: requestCacheMode)
85
+ }
86
+
87
+ /**
88
+ Creates streaming observable for URL
89
+ - parameter request: URL
90
+ - parameter method: HTTP method for request
91
+ - parameter jsonBody: JSON object that will be serialized and send as HTTP Body
92
+ - parameter options: Options for JSON serialization
93
+ - parameter httpHeaders: HTTP headers for request
94
+ - parameter requestCacheMode: CacheMode for request
95
+ - returns: Created observable that emits deserialized JSON object of HTTP request
96
+ */
97
+ func requestJson( url: URL , method: HttpMethod = . get, jsonBody: Any , options: JSONSerialization . WritingOptions = [ ] , httpHeaders: [ String : String ] = [ : ] ,
98
+ requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Any > {
99
+ guard let req = URLRequest ( url: url, method: method, jsonBody: jsonBody, options: options, headers: httpHeaders) else {
100
+ return Observable . error ( HttpClientError . invalidJsonObject)
101
+ }
102
+
103
+ return requestJson ( req, requestCacheMode: requestCacheMode)
65
104
}
66
105
67
106
/**
68
107
Creates streaming observable for request
69
108
- parameter request: URL request
70
- - parameter requestCacheMode: CacheMode for request
109
+ - parameter requestCacheMode: CacheMode for request
71
110
- returns: Created observable that emits deserialized JSON object of HTTP request
72
111
*/
73
112
func requestJson( _ urlRequest: URLRequest , requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Any > {
@@ -85,17 +124,40 @@ public extension HttpClientType {
85
124
/**
86
125
Creates an observable for URL
87
126
- parameter request: URL
88
- - parameter requestCacheMode: CacheMode for request
127
+ - parameter method: HTTP method for request
128
+ - parameter body: Data that will be set to httpBody property of URLRequest
129
+ - parameter httpHeaders: HTTP headers for request
130
+ - parameter requestCacheMode: CacheMode for request
131
+ - returns: Created observable that emits Data of HTTP request
132
+ */
133
+ func requestData( url: URL , method: HttpMethod = . get, body: Data ? = nil , httpHeaders: [ String : String ] = [ : ] ,
134
+ requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Data > {
135
+ return requestData ( URLRequest ( url: url, method: method, body: body, headers: httpHeaders) , requestCacheMode: requestCacheMode)
136
+ }
137
+
138
+ /**
139
+ Creates an observable for URL
140
+ - parameter request: URL
141
+ - parameter method: HTTP method for request
142
+ - parameter jsonBody: JSON object that will be serialized and send as HTTP Body
143
+ - parameter options: Options for JSON serialization
144
+ - parameter httpHeaders: HTTP headers for request
145
+ - parameter requestCacheMode: CacheMode for request
89
146
- returns: Created observable that emits Data of HTTP request
90
147
*/
91
- func requestData( url: URL , requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Data > {
92
- return requestData ( URLRequest ( url: url) , requestCacheMode: requestCacheMode)
148
+ func requestData( url: URL , method: HttpMethod = . get, jsonBody: Any , options: JSONSerialization . WritingOptions = [ ] , httpHeaders: [ String : String ] = [ : ] ,
149
+ requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Data > {
150
+ guard let req = URLRequest ( url: url, method: method, jsonBody: jsonBody, options: options, headers: httpHeaders) else {
151
+ return Observable . error ( HttpClientError . invalidJsonObject)
152
+ }
153
+
154
+ return requestData ( req, requestCacheMode: requestCacheMode)
93
155
}
94
156
95
157
/**
96
158
Creates an observable for request
97
159
- parameter request: URL request
98
- - parameter requestCacheMode: CacheMode for request
160
+ - parameter requestCacheMode: CacheMode for request
99
161
- returns: Created observable that emits Data of HTTP request
100
162
*/
101
163
func requestData( _ urlRequest: URLRequest , requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Data > {
@@ -105,7 +167,7 @@ public extension HttpClientType {
105
167
var errorResponse : HTTPURLResponse ? = nil
106
168
107
169
let cachedRequest : Observable < Data > = {
108
- if urlRequest. httpMethod == " GET " , requestCacheMode. returnCachedResponse, let url = urlRequest. url, let cached = urlRequestCacheProvider? . load ( resourceUrl: url) {
170
+ if urlRequest. httpMethod == HttpMethod . get . rawValue , requestCacheMode. returnCachedResponse, let url = urlRequest. url, let cached = urlRequestCacheProvider? . load ( resourceUrl: url) {
109
171
// return cached response
110
172
return Observable . just ( cached)
111
173
}
@@ -116,7 +178,7 @@ public extension HttpClientType {
116
178
// if we should not invoke request, simply return cache request
117
179
return cachedRequest
118
180
}
119
-
181
+
120
182
return cachedRequest. concat ( request ( urlRequest, dataCacheProvider: dataCacheProvider)
121
183
. flatMapLatest { [ weak self] result -> Observable < Data > in
122
184
switch result {
@@ -137,7 +199,7 @@ public extension HttpClientType {
137
199
guard let errorResponse = errorResponse else {
138
200
let requestData = dataCacheProvider. getData ( )
139
201
140
- if urlRequest. httpMethod == " GET " , requestCacheMode. cacheResponse, let url = urlRequest. url {
202
+ if urlRequest. httpMethod == HttpMethod . get . rawValue , requestCacheMode. cacheResponse, let url = urlRequest. url {
141
203
// sache response
142
204
self ? . urlRequestCacheProvider? . save ( resourceUrl: url, data: requestData)
143
205
}
0 commit comments