blob: 858b7e5e906c4753f6a94e3854078e092d686f7a [file] [log] [blame]
/*
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"
@interface CMISDefaultNetworkProvider ()
+ (NSMutableURLRequest *)createRequestForUrl:(NSURL *)url
httpMethod:(CMISHttpRequestMethod)httpRequestMethod
session:(CMISBindingSession *)session;
@end
@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
authenticationProvider:session.authenticationProvider
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
authenticationProvider:session.authenticationProvider
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
authenticationProvider:session.authenticationProvider
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
authenticationProvider:session.authenticationProvider
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
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:^(unsigned long long bytesDownloaded, unsigned long long bytesTotal) {
if (progressBlock) {
progressBlock(bytesDownloaded, bytesTotal);
}
}];
}
- (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
authenticationProvider:session.authenticationProvider
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
{
NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:url
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60];
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