Files
NativeScript/http/http.ios.ts
PanayotCankov 9dd3ba70c5 Added "External Ambient Module Declarations" for most modules.
Now they are required by module name e.g require("file-system") instead of by file name.
2014-05-21 12:23:19 +03:00

78 lines
2.8 KiB
TypeScript

/**
* iOS specific http request implementation.
*/
import promises = require("promises/promises");
import http = require("http");
declare var exports;
require("utils/module-merge").merge(require("http/http-common"), exports);
export function request(options: http.HttpRequestOptions): promises.Promise<http.HttpResponse> {
var d = promises.defer<http.HttpResponse>();
try {
var sessionConfig = Foundation.NSURLSessionConfiguration.defaultSessionConfiguration();
var queue = Foundation.NSOperationQueue.mainQueue();
var session = Foundation.NSURLSession.sessionWithConfigurationDelegateDelegateQueue(
sessionConfig, null, queue);
var urlRequest = Foundation.NSMutableURLRequest.requestWithURL(
Foundation.NSURL.URLWithString(options.url));
urlRequest.setHTTPMethod(typeof options.method !== "undefined" ? options.method : "GET");
if (options.headers) {
for (var header in options.headers) {
urlRequest.setValueForHTTPHeaderField(options.headers[header], header);
}
}
if (typeof options.timeout == "number") {
urlRequest.setTimeoutInterval(options.timeout * 1000);
}
if (typeof options.content == "string") {
urlRequest.setHTTPBody(Foundation.NSString.initWithString(options.content).dataUsingEncoding(4));
}
else {
urlRequest.setHTTPBody(options.content);
}
var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest,
function (data, response, error) {
if (error) {
d.reject(new Error(error.localizedDescription()));
} else {
var headers = {};
var headerFields = response.allHeaderFields();
var keys = headerFields.allKeys();
for (var i = 0, l = keys.count(); i < l; i++) {
var key = keys.objectAtIndex(i);
headers[key] = headerFields.valueForKey(key);
}
d.resolve({
content: {
raw: data,
toString: () => { return NSDataToString(data); },
toJSON: () => { return JSON.parse(NSDataToString(data)); },
toImage: () => { return require("image-source").fromData(data); }
},
statusCode: response.statusCode(),
headers: headers
});
}
});
dataTask.resume();
} catch (ex) {
d.reject(ex);
}
return d.promise();
}
function NSDataToString(data: any): string {
return Foundation.NSString.initWithDataEncoding(data, 4).toString();
}