/* Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ #import "CMISDefaultNetworkProvider.h" #import "CMISErrors.h" #import "CMISHttpRequest.h" #import "CMISHttpDownloadRequest.h" #import "CMISHttpUploadRequest.h" #import "CMISLog.h" @implementation CMISDefaultNetworkProvider #pragma mark block based methods - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session body:(NSData *)body headers:(NSDictionary *)additionalHeaders cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock { NSMutableURLRequest *urlRequest = [CMISDefaultNetworkProvider createRequestForUrl:url httpMethod:httpRequestMethod session:session]; if (!cmisRequest.isCancelled) { CMISHttpRequest* request = [CMISHttpRequest startRequest:urlRequest httpMethod:httpRequestMethod requestBody:body headers:additionalHeaders session:session completionBlock:completionBlock]; if (request) { cmisRequest.httpRequest = request; } } else { if (completionBlock) { completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"]); } } } - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session inputStream:(NSInputStream *)inputStream headers:(NSDictionary *)additionalHeaders cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock { if (!cmisRequest.isCancelled) { NSMutableURLRequest *urlRequest = [CMISDefaultNetworkProvider createRequestForUrl:url httpMethod:httpRequestMethod session:session]; CMISHttpUploadRequest* request = [CMISHttpUploadRequest startRequest:urlRequest httpMethod:httpRequestMethod inputStream:inputStream headers:additionalHeaders bytesExpected:0 session:session completionBlock:completionBlock progressBlock:nil]; if (request) { cmisRequest.httpRequest = request; } } else { if (completionBlock) { completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"]); } } } - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session inputStream:(NSInputStream *)inputStream headers:(NSDictionary *)additionalHeaders bytesExpected:(unsigned long long)bytesExpected cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock { if (!cmisRequest.isCancelled) { NSMutableURLRequest *urlRequest = [CMISDefaultNetworkProvider createRequestForUrl:url httpMethod:httpRequestMethod session:session]; CMISHttpUploadRequest* request = [CMISHttpUploadRequest startRequest:urlRequest httpMethod:httpRequestMethod inputStream:inputStream headers:additionalHeaders bytesExpected:bytesExpected session:session completionBlock:completionBlock progressBlock:progressBlock]; if (request){ cmisRequest.httpRequest = request; } } else { if (completionBlock) { completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"]); } } } - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session inputStream:(NSInputStream *)inputStream headers:(NSDictionary *)additionalHeaders bytesExpected:(unsigned long long)bytesExpected cmisRequest:(CMISRequest *)cmisRequest startData:(NSData *)startData endData:(NSData *)endData useBase64Encoding:(BOOL)useBase64Encoding completionBlock:(void (^)(CMISHttpResponse *, NSError *))completionBlock progressBlock:(void (^)(unsigned long long, unsigned long long))progressBlock { if (!cmisRequest.isCancelled) { NSMutableURLRequest *urlRequest = [CMISDefaultNetworkProvider createRequestForUrl:url httpMethod:httpRequestMethod session:session]; CMISHttpUploadRequest* request = [CMISHttpUploadRequest startRequest:urlRequest httpMethod:httpRequestMethod inputStream:inputStream headers:additionalHeaders bytesExpected:bytesExpected session:session startData:startData endData:endData useBase64Encoding:useBase64Encoding completionBlock:completionBlock progressBlock:progressBlock]; if (request){ cmisRequest.httpRequest = request; } } else { if (completionBlock) { completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"]); } } } - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session outputFilePath:(NSString *)outputFilePath bytesExpected:(unsigned long long)bytesExpected cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock { if (!cmisRequest.isCancelled) { NSMutableURLRequest *urlRequest = [CMISDefaultNetworkProvider createRequestForUrl:url httpMethod:HTTP_GET session:session]; CMISHttpDownloadRequest* request = [CMISHttpDownloadRequest startRequest:urlRequest httpMethod:httpRequestMethod outputFilePath:outputFilePath bytesExpected:bytesExpected session:session completionBlock:completionBlock progressBlock:progressBlock]; if (request) { cmisRequest.httpRequest = request; } } else { if (completionBlock) { completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"]); } } } - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session outputStream:(NSOutputStream *)outputStream bytesExpected:(unsigned long long)bytesExpected cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock { [self invoke:url httpMethod:httpRequestMethod session:session outputStream:outputStream bytesExpected:bytesExpected offset:nil length:nil cmisRequest:cmisRequest completionBlock:completionBlock progressBlock:progressBlock]; } - (void)invoke:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session outputStream:(NSOutputStream *)outputStream bytesExpected:(unsigned long long)bytesExpected offset:(NSDecimalNumber*)offset length:(NSDecimalNumber*)length cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock progressBlock:(void (^)(unsigned long long bytesDownloaded, unsigned long long bytesTotal))progressBlock { if (!cmisRequest.isCancelled) { NSMutableURLRequest *urlRequest = [CMISDefaultNetworkProvider createRequestForUrl:url httpMethod:HTTP_GET session:session]; CMISHttpDownloadRequest* request = [CMISHttpDownloadRequest startRequest:urlRequest httpMethod:httpRequestMethod outputStream:outputStream bytesExpected:bytesExpected offset:offset length:length session:session completionBlock:completionBlock progressBlock:progressBlock]; if (request) { cmisRequest.httpRequest = request; } } else { if (completionBlock) { completionBlock(nil, [CMISErrors createCMISErrorWithCode:kCMISErrorCodeCancelled detailedDescription:@"Request was cancelled"]); } } } - (void)invokeGET:(NSURL *)url session:(CMISBindingSession *)session cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock { return [self invoke:url httpMethod:HTTP_GET session:session body:nil headers:nil cmisRequest:cmisRequest completionBlock:completionBlock]; } - (void)invokePOST:(NSURL *)url session:(CMISBindingSession *)session body:(NSData *)body headers:(NSDictionary *)additionalHeaders cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock { return [self invoke:url httpMethod:HTTP_POST session:session body:body headers:additionalHeaders cmisRequest:cmisRequest completionBlock:completionBlock]; } - (void)invokePUT:(NSURL *)url session:(CMISBindingSession *)session body:(NSData *)body headers:(NSDictionary *)additionalHeaders cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock { return [self invoke:url httpMethod:HTTP_PUT session:session body:body headers:additionalHeaders cmisRequest:cmisRequest completionBlock:completionBlock]; } - (void)invokeDELETE:(NSURL *)url session:(CMISBindingSession *)session cmisRequest:(CMISRequest *)cmisRequest completionBlock:(void (^)(CMISHttpResponse *httpResponse, NSError *error))completionBlock { return [self invoke:url httpMethod:HTTP_DELETE session:session body:nil headers:nil cmisRequest:cmisRequest completionBlock:completionBlock]; } #pragma mark Helper methods + (NSMutableURLRequest *)createRequestForUrl:(NSURL *)url httpMethod:(CMISHttpRequestMethod)httpRequestMethod session:(CMISBindingSession *)session { NSNumber *timeout = [session objectForKey:kCMISSessionParameterRequestTimeout defaultValue:@(60)]; NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url cachePolicy:NSURLRequestReloadIgnoringCacheData timeoutInterval:[timeout doubleValue]]; NSString *httpMethod; switch (httpRequestMethod) { case HTTP_GET: httpMethod = @"GET"; break; case HTTP_POST: httpMethod = @"POST"; break; case HTTP_DELETE: httpMethod = @"DELETE"; break; case HTTP_PUT: httpMethod = @"PUT"; break; default: CMISLogError(@"Invalid http request method: %d", (int)httpRequestMethod); return nil; } [request setHTTPMethod:httpMethod]; CMISLogDebug(@"HTTP %@: %@", httpMethod, [url absoluteString]); // turn off cookies if configured to do so id sendCookies = [session objectForKey:kCMISSessionParameterSendCookies]; if (sendCookies && ![sendCookies boolValue]) { request.HTTPShouldHandleCookies = NO; } return request; } @end