@@ -3,11 +3,11 @@ import RxSwift
33
44/// Represents caching settings
55public struct CacheMode {
6- /// If true, response for GET request will be cached
6+ /// If true, response for GET request will be cached
77 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
99 public let returnCachedResponse : Bool
10- /// If true, HttpClient will invoke request
10+ /// If true, HttpClient will invoke request
1111 public let invokeRequest : Bool
1212
1313 public init ( cacheResponse: Bool = true , returnCachedResponse: Bool = true , invokeRequest: Bool = true ) {
@@ -16,15 +16,17 @@ public struct CacheMode {
1616 self . invokeRequest = invokeRequest
1717 }
1818
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 )
2527}
2628
27- public extension HttpClientType {
29+ public extension HttpClientType {
2830 /**
2931 Creates StreamDataTask
3032 - parameter request: URL request
@@ -38,36 +40,73 @@ public extension HttpClientType {
3840 /**
3941 Creates streaming observable for URL
4042 - 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
4146 - parameter dataCacheProvider: Cache provider, that will be used to cache downloaded data
4247 - returns: Created observable that emits stream events
4348 */
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)
4652 }
47-
53+
4854 /**
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
5162 - returns: Created observable that emits stream events
5263 */
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)
5571 }
5672
5773 /**
5874 Creates streaming observable for URL
5975 - 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
6180 - returns: Created observable that emits deserialized JSON object of HTTP request
6281 */
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)
65104 }
66105
67106 /**
68107 Creates streaming observable for request
69108 - parameter request: URL request
70- - parameter requestCacheMode: CacheMode for request
109+ - parameter requestCacheMode: CacheMode for request
71110 - returns: Created observable that emits deserialized JSON object of HTTP request
72111 */
73112 func requestJson( _ urlRequest: URLRequest , requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Any > {
@@ -85,17 +124,40 @@ public extension HttpClientType {
85124 /**
86125 Creates an observable for URL
87126 - 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
89146 - returns: Created observable that emits Data of HTTP request
90147 */
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)
93155 }
94156
95157 /**
96158 Creates an observable for request
97159 - parameter request: URL request
98- - parameter requestCacheMode: CacheMode for request
160+ - parameter requestCacheMode: CacheMode for request
99161 - returns: Created observable that emits Data of HTTP request
100162 */
101163 func requestData( _ urlRequest: URLRequest , requestCacheMode: CacheMode = CacheMode ( ) ) -> Observable < Data > {
@@ -105,7 +167,7 @@ public extension HttpClientType {
105167 var errorResponse : HTTPURLResponse ? = nil
106168
107169 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) {
109171 // return cached response
110172 return Observable . just ( cached)
111173 }
@@ -116,7 +178,7 @@ public extension HttpClientType {
116178 // if we should not invoke request, simply return cache request
117179 return cachedRequest
118180 }
119-
181+
120182 return cachedRequest. concat ( request ( urlRequest, dataCacheProvider: dataCacheProvider)
121183 . flatMapLatest { [ weak self] result -> Observable < Data > in
122184 switch result {
@@ -137,7 +199,7 @@ public extension HttpClientType {
137199 guard let errorResponse = errorResponse else {
138200 let requestData = dataCacheProvider. getData ( )
139201
140- if urlRequest. httpMethod == " GET " , requestCacheMode. cacheResponse, let url = urlRequest. url {
202+ if urlRequest. httpMethod == HttpMethod . get . rawValue , requestCacheMode. cacheResponse, let url = urlRequest. url {
141203 // sache response
142204 self ? . urlRequestCacheProvider? . save ( resourceUrl: url, data: requestData)
143205 }
0 commit comments