From 2c5f36761bc1e5863552c2c9493f076bd30909d3 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Wed, 21 May 2014 10:34:12 +0300 Subject: [PATCH] http request for android reworked --- declarations.android.d.ts | 10 +++ http/http.android.ts | 138 ++++++++++++++++++-------------------- 2 files changed, 76 insertions(+), 72 deletions(-) diff --git a/declarations.android.d.ts b/declarations.android.d.ts index a1a673d0c..40e840704 100644 --- a/declarations.android.d.ts +++ b/declarations.android.d.ts @@ -352,6 +352,16 @@ declare module com { } export module async { + + export module callback { + export class DataCallback { + constructor(params: any); + } + export class CompletedCallback { + constructor(params: any); + } + } + export module future { export class FutureCallback { constructor(context: any); diff --git a/http/http.android.ts b/http/http.android.ts index 862bce5ba..24774f23a 100644 --- a/http/http.android.ts +++ b/http/http.android.ts @@ -12,84 +12,78 @@ export function request(options: http.HttpRequestOptions): promises.Promise { return null }, - toJSON: () => { return null }, - toImage: () => { return require("image-source").fromNativeSource(data); } - }, - statusCode: 0, - headers: {} - }); - } - } - })); + var request = com.koushikdutta.ion.Ion.getDefault(context).configure().getAsyncHttpRequestFactory() + .createAsyncHttpRequest(java.net.URI.create(options.url), options.method, null); + + if (options.headers) { + for (var key in options.headers) { + request.addHeader(key, options.headers[key]) + } + } + + if (typeof options.timeout == "number") { + request.setTimeout(options.timeout); + } + + if (typeof options.content == "string") { + request.setBody(new com.koushikdutta.async.http.body.StringBody(options.content)); } else { - var request = com.koushikdutta.ion.Ion.getDefault(context).configure().getAsyncHttpRequestFactory() - .createAsyncHttpRequest(java.net.URI.create(options.url), options.method, null); - - if (options.headers) { - for (var key in options.headers) { - request.addHeader(key, options.headers[key]) - } - } - - if (typeof options.timeout == "number") { - request.setTimeout(options.timeout); - } - - if (typeof options.content == "string") { - request.setBody(new com.koushikdutta.async.http.body.StringBody(options.content)); - } - else { - // TODO: How to transfer everything else? - } - - var StringCallback = com.koushikdutta.async.http.AsyncHttpClient.StringCallback.extends({ - onCompleted: function (error, response, result) { - if (error) { - d.reject(new Error(error.toString())); - } else { - var headers = {}; - var rawHeaders = response.getHeaders().headers; - - for (var i = 0, l = rawHeaders.length(); i < l; i++) { - var key = rawHeaders.getFieldName(i); - headers[key] = rawHeaders.getValue(i); - } - - d.resolve({ - content: { - raw: result, - toString: () => { return result }, - toJSON: () => { return JSON.parse(result) }, - toImage: () => { - return null; - } - }, - statusCode: rawHeaders.getResponseCode(), - headers: headers - }); - } - } - }); - - com.koushikdutta.async.http.AsyncHttpClient.getDefaultInstance().execute(request, new StringCallback()); + // TODO: How to transfer everything else? } + var callback = new com.koushikdutta.async.http.callback.HttpConnectCallback({ + onConnectCompleted: function (error, response) { + if (error) { + d.reject(new Error(error.toString())); + } else { + var headers = {}; + var rawHeaders = response.getHeaders().headers; + + for (var i = 0, l = rawHeaders.length(); i < l; i++) { + var key = rawHeaders.getFieldName(i); + headers[key] = rawHeaders.getValue(i); + } + + var outputStream = new java.io.ByteArrayOutputStream(); + + var dataCallback = new com.koushikdutta.async.callback.DataCallback({ + onDataAvailable: function (emitter, byteBufferList) { + var bb = byteBufferList.getAll(); + outputStream.write(bb.array(), bb.arrayOffset() + bb.position(), bb.remaining()); + } + }); + + response.setDataCallback(dataCallback); + + var endCallback = new com.koushikdutta.async.callback.CompletedCallback({ + onCompleted: function (error) { + d.resolve({ + content: { + raw: response, + toString: () => { return outputStream.toString(); }, + toJSON: () => { return JSON.parse(outputStream.toString()); }, + toImage: () => { + var bytes = outputStream.toByteArray(); + var bitmap = android.graphics.BitmapFactory.decodeByteArray(bytes, 0, bytes.length); + return require("image-source").fromNativeSource(bitmap); + } + }, + statusCode: rawHeaders.getResponseCode(), + headers: headers + }); + } + }); + + response.setEndCallback(endCallback); + } + } + }); + + com.koushikdutta.async.http.AsyncHttpClient.getDefaultInstance().execute(request, callback); + } catch (ex) { d.reject(ex); }