forked from nativescript-community/https
-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhttps.ios.ts
More file actions
113 lines (86 loc) · 4.2 KB
/
https.ios.ts
File metadata and controls
113 lines (86 loc) · 4.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
//
import * as application from 'tns-core-modules/application'
import {HttpRequestOptions, Headers, HttpResponse} from 'tns-core-modules/http'
import {isDefined, isNullOrUndefined, isObject} from 'tns-core-modules/utils/types'
import * as Https from './https.common'
import {HttpsResponse} from "./https.common";
interface Ipolicies {
def: AFSecurityPolicy
secured: boolean
secure?: AFSecurityPolicy
}
let policies: Ipolicies = {
def: AFSecurityPolicy.defaultPolicy(),
secured: false,
};
policies.def.allowInvalidCertificates = true;
policies.def.validatesDomainName = false;
export function enableSSLPinning(options: Https.HttpsSSLPinningOptions) {
// console.log('options', options)
if (!policies.secure) {
policies.secure = AFSecurityPolicy.policyWithPinningMode(AFSSLPinningMode.PublicKey);
let allowInvalidCertificates = (isDefined(options.allowInvalidCertificates)) ? options.allowInvalidCertificates : false;
policies.secure.allowInvalidCertificates = allowInvalidCertificates;
let validatesDomainName = (isDefined(options.validatesDomainName)) ? options.validatesDomainName : true;
policies.secure.validatesDomainName = validatesDomainName;
let data = NSData.dataWithContentsOfFile(options.certificate);
// console.log('data.description', data.description)
// console.log('data.bytes', data.bytes)
// console.log('data.base64Encoding()', data.base64Encoding())
// console.log('data.length', data.length)
policies.secure.pinnedCertificates = NSSet.setWithObject(data)
}
policies.secured = true;
console.log('nativescript-https > Enabled SSL pinning')
}
export function disableSSLPinning() {
policies.secured = false;
console.log('nativescript-https > Disabled SSL pinning')
}
export function request(options: Https.HttpsRequestOptions): Promise<Https.HttpsResponse> {
console.log("nativescript-https: (request) Request: ", options);
return new Promise(function (resolve, reject) {
try {
let request = NSMutableURLRequest.requestWithURL(
NSURL.URLWithString(options.url));
request.HTTPMethod = options.method;
let headers = options.headers;
if (headers) {
Object.keys(headers).forEach(function (key) {
request.setValueForHTTPHeaderField(headers[key] as any, key);
});
}
let jsonString = NSString.stringWithString(JSON.stringify(options.body));
request.HTTPBody = jsonString.dataUsingEncoding(NSUTF8StringEncoding);
let manager = AFHTTPSessionManager.manager();
manager.requestSerializer.allowsCellularAccess = true;
manager.securityPolicy = (policies.secured == true) ? policies.secure : policies.def;
console.log("nativescript-https: (request) AF Send: ", request);
manager.session.dataTaskWithRequestCompletionHandler(request, function (data: NSData, response: NSHTTPURLResponse, error: NSError) {
if (error) {
console.log("nativescript-https: (request) AF Send Error", error);
reject(new Error(error.localizedDescription));
} else {
console.log("nativescript-https: (request) AF Send Response", data);
resolve({
content: (data: NSData) => {
let content = NSString.alloc().initWithDataEncoding(data, NSASCIIStringEncoding).toString();
try {
content = JSON.parse(content);
} catch (e) {
console.log("nativescript-https: Response JSON Parse Error", e, e.stack, content);
}
return <HttpsResponse>{
content: content
};
}
})
}
}).resume();
} catch (error) {
console.log("nativescript-https: (request) AF Error", error, error.stack);
reject(error)
}
});
}
export * from './https.common'