diff --git a/BCL.csproj b/BCL.csproj
index 9295c9243..827d748d1 100644
--- a/BCL.csproj
+++ b/BCL.csproj
@@ -148,6 +148,7 @@
+
console.d.ts
diff --git a/declarations.android.d.ts b/declarations.android.d.ts
index c6b1ff145..441688267 100644
--- a/declarations.android.d.ts
+++ b/declarations.android.d.ts
@@ -346,7 +346,8 @@ declare module com {
export module ion {
export class Ion {
- static with(context: any, url : string) : any;
+ static with(context: any, url: string): any;
+ static getDefault(context: any): any;
}
}
@@ -356,6 +357,26 @@ declare module com {
constructor(context: any);
}
}
+
+ export module http {
+
+ export module libcore {
+ export class RawHeaders {
+ constructor();
+ add(name: string, v: string);
+ }
+ }
+
+ export class AsyncHttpClient {
+ static getDefaultInstance(): any;
+ }
+
+ export module callback {
+ export class HttpConnectCallback {
+ constructor(params: any);
+ }
+ }
+ }
}
}
}
\ No newline at end of file
diff --git a/net/http_client.android.ts b/net/http_client.android.ts
index 337852033..5551295e2 100644
--- a/net/http_client.android.ts
+++ b/net/http_client.android.ts
@@ -1,66 +1,61 @@
/**
* Android specific http client implementation.
*/
-
import image_module = require("Image/image");
import app_module = require("Application/application");
import promises = require("promises/promises");
-export class http {
- /**
- * Gets string from url.
- */
- public static getString(url: string): promises.Promise {
- var d = promises.defer();
- http.get(url, r => d.resolve(r), e => d.reject(e));
- return d.promise();
- }
+import http = require("net/http_client");
- /**
- * Gets JSON from url.
- */
- public static getJSON(url: string): promises.Promise {
- var d = promises.defer();
- http.get(url, r => d.resolve(JSON.parse(r)), e => d.reject(e));
- return d.promise();
- }
+/*
+// merge common
+import http_common = require("net/http_common");
+declare var exports;
+exports.getString = http_common.getString;
+exports.getJSON = http_common.getJSON;
+exports.getImage = http_common.getImage;
+*/
- /**
- * Gets image from url.
- */
- public static getImage(url: string): promises.Promise {
- var d = promises.defer();
- http.get(url, r => {
- var image = new image_module.Image();
- image.loadFromNativeBitmap(r);
- d.resolve(image);
- }, e => d.reject(e));
- return d.promise();
- }
+// TODO: Replace with similar to iOS implementation!
+export function request(options: http.HttpRequestOptions): promises.Promise {
+ var d = promises.defer();
- // TODO: Accept: application/json header for JSON calls and check the response for Image not url!
- private static get(url: string, successCallback: (result: any) => void, errorCallback?: (e: Error) => void) {
- try {
- var isImage = url.match(/\.(jpeg|jpg|gif|png)$/i) != null;
+ try {
+ var headers = new com.koushikdutta.async.http.libcore.RawHeaders();
- var context = app_module.Application.current.android.context;
- var request = com.koushikdutta.ion.Ion.with(context, url);
-
- request = isImage ? request.asBitmap() : request.asString();
-
- request.setCallback(new com.koushikdutta.async.future.FutureCallback({
- onCompleted: function (error, data) {
- if (error && errorCallback) {
- errorCallback(new Error(error.toString()));
- } else if (successCallback) {
- successCallback(data);
- }
+ if (options.headers && options.headers.length) {
+ for (var i = 0, l = options.headers.length; i < l; i++) {
+ var header = options.headers[i];
+ headers.add(header.name, header.value)
}
- }));
- } catch (ex) {
- if (errorCallback) {
- errorCallback(ex);
- }
}
+
+ var isImage = options.url.match(/\.(jpeg|jpg|gif|png)$/i) != null;
+
+ var context = app_module.Application.current.android.context;
+ var request = com.koushikdutta.ion.Ion.with(context, options.url);
+
+ request = isImage ? request.asBitmap() : request.asString();
+
+ request.setCallback(new com.koushikdutta.async.future.FutureCallback({
+ onCompleted: function (error, data) {
+ if (error) {
+ d.reject(error);
+ } else {
+ d.resolve({
+ body: {
+ toString: () => { return data },
+ toJSON: () => { return JSON.parse(data) },
+ toImage: () => { return image_module.Image.imageFromNativeBitmap(data); }
+ },
+ statusCode: 0,
+ headers: []
+ });
+ }
+ }
+ }));
+ } catch (ex) {
+ d.reject(ex);
}
+ return d.promise();
}
diff --git a/net/http_client.d.ts b/net/http_client.d.ts
index 27cddc358..e31741056 100644
--- a/net/http_client.d.ts
+++ b/net/http_client.d.ts
@@ -4,28 +4,32 @@
import image_module = require("Image/image");
import promises = require("promises/promises");
-export declare class http {
- static getString(url: string): promises.Promise;
- static getJSON(url: string): promises.Promise;
- static getImage(url: string): promises.Promise;
+export declare function getString(url: string): promises.Promise;
+export declare function getJSON(url: string): promises.Promise;
+export declare function getImage(url: string): promises.Promise;
- static request(options: IHttpRequestOptions, successCallback: (r: IHttpResponse) => void, errorCallback?: (e: Error) => void);
-}
+export declare function request(options: HttpRequestOptions): promises.Promise;
-export interface IHttpRequestOptions {
+export interface HttpRequestOptions {
url: string;
method: string;
- headers?: IHttpHeader[];
- body?: string;
+ headers?: HttpHeader[];
+ body?: any;
}
-export interface IHttpHeader {
+export interface HttpHeader {
name: string;
value: string;
}
-export interface IHttpResponse {
+export interface HttpResponse {
statusCode: number;
- headers: IHttpHeader[];
- body: any;
+ headers: HttpHeader[];
+ body: HttpContent;
+}
+
+export interface HttpContent {
+ toString: () => string;
+ toJSON: () => any;
+ toImage: () => image_module.Image;
}
\ No newline at end of file
diff --git a/net/http_client.ios.ts b/net/http_client.ios.ts
index 7be07a94f..22c9ef2a1 100644
--- a/net/http_client.ios.ts
+++ b/net/http_client.ios.ts
@@ -1,114 +1,80 @@
/**
* iOS specific http client implementation.
*/
-import http_client = require("net/http_client");
-import image_module = require("Image/image");
+import image = require("Image/image");
import promises = require("promises/promises");
+import http = require("net/http_client");
-export class http {
- /**
- * Gets string from url.
- */
- public static getString(url: string): promises.Promise {
- var d = promises.defer();
+/*
+// merge common
+import http_common = require("net/http_common");
+declare var exports;
+exports.getString = http_common.getString;
+exports.getJSON = http_common.getJSON;
+exports.getImage = http_common.getImage;
+*/
- http.request({ url: url, method: "GET" },
- r => d.resolve(Foundation.NSString.initWithDataEncoding(r.body, 4).toString()),
- e => d.reject(e));
+export function request(options: http.HttpRequestOptions): promises.Promise {
+ var d = promises.defer();
- return d.promise();
- }
+ try {
+ var sessionConfig = Foundation.NSURLSessionConfiguration.defaultSessionConfiguration();
+ var queue = Foundation.NSOperationQueue.mainQueue();
+ var session = Foundation.NSURLSession.sessionWithConfigurationDelegateDelegateQueue(
+ sessionConfig, null, queue);
- /**
- * Gets JSON from url.
- */
- public static getJSON(url: string): promises.Promise {
- var d = promises.defer();
+ var urlRequest = Foundation.NSMutableURLRequest.requestWithURL(
+ Foundation.NSURL.URLWithString(options.url));
- http.request({ url: url, method: "GET" },
- r => d.resolve(JSON.parse(Foundation.NSString.initWithDataEncoding(r.body, 4).toString())),
- e => d.reject(e));
+ urlRequest.setHTTPMethod(options.method);
- return d.promise();
- }
+ if (options.headers && options.headers.length) {
+ for (var i = 0, l = options.headers.length; i < l; i++) {
+ var header = options.headers[i];
- /**
- * Gets image from url.
- */
- public static getImage(url: string): promises.Promise {
- var d = promises.defer();
-
- http.request({ url: url, method: "GET" },
- r => {
- var image = new image_module.Image();
- image.loadFromData(r.body);
- d.resolve(image);
- },
- e => d.reject(e));
-
- return d.promise();
- }
-
- private static request(options: http_client.IHttpRequestOptions,
- successCallback: (r: http_client.IHttpResponse) => void,
- errorCallback?: (e: Error) => void) {
-
- 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(options.method);
-
- if (options.headers && options.headers.length) {
- for (var i = 0, l = options.headers.length; i < l; i++) {
- var header = options.headers[i];
-
- urlRequest.setValueForHTTPHeaderField(header.name, header.value);
- }
- }
-
- if (typeof (options.body) == "string") {
- urlRequest.setHTTPBody(Foundation.NSString.initWithString(options.body).dataUsingEncoding(4));
- }
-
- var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest,
- function (data, response, error) {
- if (error) {
- if (errorCallback) {
- errorCallback(new Error(error.localizedDescription()));
- }
- } else if (successCallback) {
-
- var headers = new Array();
- var headerFields = response.allHeaderFields();
- var keys = headerFields.allKeys();
-
- for (var i = 0, l = keys.count(); i < l; i++) {
- var key = keys.objectAtIndex(i);
-
- headers.push({ name: key, value: headerFields.valueForKey(key) });
- }
-
- successCallback(
- {
- body: data,
- statusCode: response.statusCode,
- headers: headers
- });
- }
- });
-
- dataTask.resume();
- } catch (ex) {
- if (errorCallback) {
- errorCallback(ex);
+ urlRequest.setValueForHTTPHeaderField(header.name, header.value);
}
}
+ if (typeof (options.body) == "string") {
+ urlRequest.setHTTPBody(Foundation.NSString.initWithString(options.body).dataUsingEncoding(4));
+ }
+
+ var dataTask = session.dataTaskWithRequestCompletionHandler(urlRequest,
+ function (data, response, error) {
+ if (error) {
+ d.reject(error);
+ } else {
+
+ var headers = new Array();
+ var headerFields = response.allHeaderFields();
+ var keys = headerFields.allKeys();
+
+ for (var i = 0, l = keys.count(); i < l; i++) {
+ var key = keys.objectAtIndex(i);
+
+ headers.push({ name: key, value: headerFields.valueForKey(key) });
+ }
+
+ d.resolve({
+ body: {
+ toString: () => { return NSDataToString(data); },
+ toJSON: () => { return JSON.parse(NSDataToString(data)); },
+ toImage: () => { return image.Image.imageFromData(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();
}
diff --git a/net/http_common.ts b/net/http_common.ts
new file mode 100644
index 000000000..8f1eaf58b
--- /dev/null
+++ b/net/http_common.ts
@@ -0,0 +1,42 @@
+import image_module = require("Image/image");
+import promises = require("promises/promises");
+import http = require("net/http_client");
+
+/**
+ * Gets string from url.
+ */
+export function getString(url: string): promises.Promise {
+ var d = promises.defer();
+
+ http.request({ url: url, method: "GET" })
+ .then(r => d.resolve(r.body.toString()))
+ .fail(e => d.reject(e));
+
+ return d.promise();
+}
+
+/**
+ * Gets JSON from url.
+ */
+export function getJSON(url: string): promises.Promise {
+ var d = promises.defer();
+
+ http.request({ url: url, method: "GET" })
+ .then(r => d.resolve(r.body.toJSON()))
+ .fail(e => d.reject(e));
+
+ return d.promise();
+}
+
+/**
+ * Gets image from url.
+ */
+export function getImage(url: string): promises.Promise {
+ var d = promises.defer();
+
+ http.request({ url: url, method: "GET" })
+ .then(r => d.resolve(r.body.toImage()))
+ .fail(e => d.reject(e));
+
+ return d.promise();
+}