Skip to content

Commit 2c5f367

Browse files
author
Vladimir Enchev
committed
http request for android reworked
1 parent 58dd627 commit 2c5f367

File tree

2 files changed

+69
-65
lines changed

2 files changed

+69
-65
lines changed

declarations.android.d.ts

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,6 +352,16 @@ declare module com {
352352
}
353353

354354
export module async {
355+
356+
export module callback {
357+
export class DataCallback {
358+
constructor(params: any);
359+
}
360+
export class CompletedCallback {
361+
constructor(params: any);
362+
}
363+
}
364+
355365
export module future {
356366
export class FutureCallback {
357367
constructor(context: any);

http/http.android.ts

Lines changed: 59 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -12,83 +12,77 @@ export function request(options: http.HttpRequestOptions): promises.Promise<http
1212

1313
try {
1414

15-
var isImage = options.url.match(/\.(jpeg|jpg|gif|png)$/i) != null;
16-
1715
var context = require("application").android.context;
1816

19-
if (isImage && options.method && options.method.toLowerCase() == "get") {
20-
var request = com.koushikdutta.ion.Ion.with(context, options.url);
21-
request.asBitmap().setCallback(new com.koushikdutta.async.future.FutureCallback({
22-
onCompleted: function (error, data) {
23-
if (error) {
24-
d.reject(new Error(error.toString()));
25-
} else {
26-
d.resolve({
27-
content: {
28-
raw: data,
29-
toString: () => { return null },
30-
toJSON: () => { return null },
31-
toImage: () => { return require("image-source").fromNativeSource(data); }
32-
},
33-
statusCode: 0,
34-
headers: {}
35-
});
36-
}
37-
}
38-
}));
39-
}
40-
else {
41-
var request = com.koushikdutta.ion.Ion.getDefault(context).configure().getAsyncHttpRequestFactory()
42-
.createAsyncHttpRequest(java.net.URI.create(options.url), options.method, null);
17+
var request = com.koushikdutta.ion.Ion.getDefault(context).configure().getAsyncHttpRequestFactory()
18+
.createAsyncHttpRequest(java.net.URI.create(options.url), options.method, null);
4319

44-
if (options.headers) {
45-
for (var key in options.headers) {
46-
request.addHeader(key, options.headers[key])
47-
}
20+
if (options.headers) {
21+
for (var key in options.headers) {
22+
request.addHeader(key, options.headers[key])
4823
}
24+
}
4925

50-
if (typeof options.timeout == "number") {
51-
request.setTimeout(options.timeout);
52-
}
26+
if (typeof options.timeout == "number") {
27+
request.setTimeout(options.timeout);
28+
}
5329

54-
if (typeof options.content == "string") {
55-
request.setBody(new com.koushikdutta.async.http.body.StringBody(options.content));
56-
}
57-
else {
58-
// TODO: How to transfer everything else?
59-
}
30+
if (typeof options.content == "string") {
31+
request.setBody(new com.koushikdutta.async.http.body.StringBody(options.content));
32+
}
33+
else {
34+
// TODO: How to transfer everything else?
35+
}
36+
37+
var callback = new com.koushikdutta.async.http.callback.HttpConnectCallback({
38+
onConnectCompleted: function (error, response) {
39+
if (error) {
40+
d.reject(new Error(error.toString()));
41+
} else {
42+
var headers = {};
43+
var rawHeaders = response.getHeaders().headers;
44+
45+
for (var i = 0, l = rawHeaders.length(); i < l; i++) {
46+
var key = rawHeaders.getFieldName(i);
47+
headers[key] = rawHeaders.getValue(i);
48+
}
49+
50+
var outputStream = new java.io.ByteArrayOutputStream();
6051

61-
var StringCallback = com.koushikdutta.async.http.AsyncHttpClient.StringCallback.extends({
62-
onCompleted: function (error, response, result) {
63-
if (error) {
64-
d.reject(new Error(error.toString()));
65-
} else {
66-
var headers = {};
67-
var rawHeaders = response.getHeaders().headers;
52+
var dataCallback = new com.koushikdutta.async.callback.DataCallback({
53+
onDataAvailable: function (emitter, byteBufferList) {
54+
var bb = byteBufferList.getAll();
55+
outputStream.write(bb.array(), bb.arrayOffset() + bb.position(), bb.remaining());
56+
}
57+
});
6858

69-
for (var i = 0, l = rawHeaders.length(); i < l; i++) {
70-
var key = rawHeaders.getFieldName(i);
71-
headers[key] = rawHeaders.getValue(i);
59+
response.setDataCallback(dataCallback);
60+
61+
var endCallback = new com.koushikdutta.async.callback.CompletedCallback({
62+
onCompleted: function (error) {
63+
d.resolve({
64+
content: {
65+
raw: response,
66+
toString: () => { return outputStream.toString(); },
67+
toJSON: () => { return JSON.parse(outputStream.toString()); },
68+
toImage: () => {
69+
var bytes = outputStream.toByteArray();
70+
var bitmap = android.graphics.BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
71+
return require("image-source").fromNativeSource(bitmap);
72+
}
73+
},
74+
statusCode: rawHeaders.getResponseCode(),
75+
headers: headers
76+
});
7277
}
78+
});
7379

74-
d.resolve({
75-
content: {
76-
raw: result,
77-
toString: () => { return result },
78-
toJSON: () => { return JSON.parse(result) },
79-
toImage: () => {
80-
return null;
81-
}
82-
},
83-
statusCode: rawHeaders.getResponseCode(),
84-
headers: headers
85-
});
86-
}
80+
response.setEndCallback(endCallback);
8781
}
88-
});
82+
}
83+
});
8984

90-
com.koushikdutta.async.http.AsyncHttpClient.getDefaultInstance().execute(request, new StringCallback());
91-
}
85+
com.koushikdutta.async.http.AsyncHttpClient.getDefaultInstance().execute(request, callback);
9286

9387
} catch (ex) {
9488
d.reject(ex);

0 commit comments

Comments
 (0)