another.im-ios/Monal/Classes/MLHTTPRequest.m
2024-11-18 15:53:52 +01:00

108 lines
3.8 KiB
Objective-C

//
// MLHTTPRequest.h
//
//
// Created by Anurodh Pokharel on 9/16/15.
// Copyright © 2015 Anurodh Pokharel. All rights reserved.
//
#import "MLHTTPRequest.h"
#import "HelperTools.h"
@interface MLHTTPRequest ()
@end
@implementation MLHTTPRequest
+(NSData*) httpBodyForDictionary:(NSDictionary*) arguments
{
unsigned int keyCounter = 0;
if(arguments) {
NSMutableString* postString =[NSMutableString new];
for (NSString *key in arguments) {
NSString *value=[arguments objectForKey:key];
value= [value stringByAddingPercentEncodingWithAllowedCharacters:[NSCharacterSet URLQueryAllowedCharacterSet]];
[postString appendString:[NSString stringWithFormat:@"%@=%@", key, value]];
if(keyCounter < [arguments allKeys].count - 1)
{
[postString appendString:@"&"];
}
keyCounter++;
}
return [postString dataUsingEncoding:NSUTF8StringEncoding];
} else
{
return nil;
}
}
+(void) sendWithVerb:(NSString*) verb path:(NSString*) path headers:(NSDictionary*) headers withArguments:(NSDictionary*) arguments data:(NSData*) postedData andCompletionHandler:(void (^)(NSError *error, id result)) completion
{
NSMutableURLRequest* theRequest = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:path]
cachePolicy:NSURLRequestReloadIgnoringCacheData
timeoutInterval:60.0];
if([[HelperTools defaultsDB] boolForKey: @"useDnssecForAllConnections"])
theRequest.requiresDNSSECValidation = YES;
[theRequest setHTTPMethod:verb];
NSData* dataToSubmit = postedData;
[headers enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop __unused) {
[theRequest addValue:obj forHTTPHeaderField:key];
}];
if([verb isEqualToString:kPost]||[verb isEqualToString:kPut]) {
if(arguments && !postedData) {
NSData *jsonData = [NSJSONSerialization dataWithJSONObject:arguments options:0 error:nil];
// NSString* jsonString = [[NSString alloc] initWithBytes:[jsonData bytes] length:[jsonData length] encoding:NSUTF8StringEncoding];
[theRequest addValue:@"application/json" forHTTPHeaderField:@"Content-Type"];
dataToSubmit=jsonData;
}
else
{
dataToSubmit = postedData;
}
}
DDLogVerbose(@"Calling: %@ %@", verb, path);
NSURLSession* session = [HelperTools createEphemeralURLSession];
void (^completeBlock)(NSData*,NSURLResponse*,NSError*)= ^(NSData* data,NSURLResponse* response, NSError* connectionError)
{
NSError* errorReply;
if(connectionError)
{
errorReply = connectionError; //[NSError errorWithDomain:@"HTTP" code:0 userInfo:@{@"result":@"connection error"}];
}
else
{
NSHTTPURLResponse* httpResponse = (NSHTTPURLResponse*) response;
if(!(httpResponse.statusCode >= 200 && httpResponse.statusCode <= 399))
{
errorReply = [NSError errorWithDomain:@"HTTP" code:httpResponse.statusCode userInfo:@{@"result":[NSHTTPURLResponse localizedStringForStatusCode:httpResponse.statusCode]}];
}
}
completion(errorReply,data);
};
if(([verb isEqualToString:kPost]||[verb isEqualToString:kPut]) && dataToSubmit)
{
[[session uploadTaskWithRequest:theRequest fromData:dataToSubmit
completionHandler:completeBlock] resume];
}
else {
[[session dataTaskWithRequest:theRequest
completionHandler:completeBlock] resume];
}
}
@end