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(); +}