 	public let returnCachedResponse: Bool
 	/// If true, HttpClient will invoke request
 	public let invokeRequest: Bool
-	
-	public init(cacheResponse: Bool = true, returnCachedResponse: Bool = true, invokeRequest: Bool = true) {
+    /// Specifies which HTTP methods should be cached
+    public let cacheHttpMethods: Set<HttpMethod>
+	
+	public init(cacheResponse: Bool = true, returnCachedResponse: Bool = true, invokeRequest: Bool = true, cacheHttpMethods: [HttpMethod] = [.get]) {
 		self.cacheResponse = cacheResponse
 		self.returnCachedResponse = returnCachedResponse
 		self.invokeRequest = invokeRequest
+        self.cacheHttpMethods = Set(cacheHttpMethods)
 	}
 	
 	/// Only cached response will be returned

					guard let errorResponse = errorResponse else {
						let requestData = dataCacheProvider.getData()
						
						if urlRequest.httpMethod == HttpMethod.get.rawValue, requestCacheMode.cacheResponse, let url = urlRequest.url  {
							// sache response
							self?.urlRequestCacheProvider?.save(resourceUrl: url, data: requestData)
						}

	public static let `default` = CacheMode(cacheResponse: true, returnCachedResponse: true, invokeRequest: true)
}

extension CacheMode {
    func shouldCache(_ request: URLRequest) -> Bool {
        guard let raw = request.httpMethod else { return false }
        guard let method = HttpMethod(rawValue: raw) else { return false }
        return cacheHttpMethods.contains(method)
    }
}

public extension HttpClientType {
	/**
	Creates StreamDataTask
