Skip to content

Commit 0d07e49

Browse files
committed
fix(): android
1 parent a9ec255 commit 0d07e49

File tree

5 files changed

+282
-178
lines changed

5 files changed

+282
-178
lines changed

src/http/http.android.ts

Lines changed: 213 additions & 145 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,17 @@
1-
import { Headers, HttpError, HttpRequestOptions } from './http-request-common';
1+
import {
2+
fileNameFromPath,
3+
Headers,
4+
HttpError,
5+
HttpRequestOptions,
6+
isImageUrl,
7+
SaveImageStorageKey,
8+
TNSHttpSettings
9+
} from './http-request-common';
210
import * as types from 'tns-core-modules/utils/types';
311
import { NetworkAgent } from 'tns-core-modules/debugger';
12+
import { getString, setString } from 'tns-core-modules/application-settings';
13+
import { File, knownFolders, path } from 'tns-core-modules/file-system';
14+
import { FileManager } from '..';
415

516
export type CancellablePromise = Promise<any> & { cancel: () => void };
617

@@ -150,172 +161,229 @@ export class Http {
150161
// initialize the options
151162
const javaOptions = this.buildJavaOptions(options);
152163

153-
// @ts-ignore
154-
if (global.__inspector && global.__inspector.isConnected) {
155-
NetworkAgent.requestWillBeSent(requestIdCounter, options);
164+
if (TNSHttpSettings.debug) {
165+
// @ts-ignore
166+
if (global.__inspector && global.__inspector.isConnected) {
167+
NetworkAgent.requestWillBeSent(requestIdCounter, options);
168+
}
156169
}
157170

158-
const callback = new com.github.triniwiz.async.Async.Http.Callback({
159-
onCancel(param: any): void {
160-
reject({
161-
type: HttpError.Cancelled,
162-
result: param
163-
});
164-
requestCallbacks.delete(id);
165-
},
166-
onComplete(result: any): void {
167-
let content;
168-
let responseText;
169-
let isString = false;
170-
if (result.content instanceof org.json.JSONObject || result.content instanceof org.json.JSONArray) {
171-
content = deserialize(result.content);
172-
try {
173-
responseText = JSON.stringify(content);
174-
} catch (err) {
175-
this._reject({
176-
type: HttpError.Error,
177-
ios: null,
178-
message: err
179-
});
180-
return;
171+
const makeRemoteRequest = () => {
172+
const callback = new com.github.triniwiz.async.Async.Http.Callback({
173+
onCancel(param: any): void {
174+
reject({
175+
type: HttpError.Cancelled,
176+
result: param
177+
});
178+
requestCallbacks.delete(id);
179+
},
180+
onComplete(result: any): void {
181+
let content;
182+
let responseText;
183+
let isString = false;
184+
if (result.content instanceof org.json.JSONObject || result.content instanceof org.json.JSONArray) {
185+
content = deserialize(result.content);
186+
responseText = result.contentText;
187+
isString = true;
188+
} else {
189+
content = result.content;
190+
responseText = result.contentText;
181191
}
182-
isString = true;
183-
} else {
184-
content = result.content;
185-
if (content instanceof java.lang.String || types.isString(content)) {
186-
try {
187-
responseText = JSON.stringify(content);
188-
} catch (err) {
189-
this._reject({
190-
type: HttpError.Error,
191-
ios: null,
192-
message: err
193-
});
194-
return;
192+
if (result && result.headers) {
193+
const length = result.headers.size();
194+
let pair;
195+
for (let i = 0; i < length; i++) {
196+
pair = result.headers.get(i);
197+
addHeader(headers, pair.key, pair.value);
195198
}
196199
}
197-
}
198-
if (result && result.headers) {
199-
const length = result.headers.size();
200-
let pair;
201-
for (let i = 0; i < length; i++) {
202-
pair = result.headers.get(i);
203-
addHeader(headers, pair.key, pair.value);
200+
// send response data (for requestId) to network debugger
201+
202+
203+
let contentType = headers['Content-Type'];
204+
if (types.isNullOrUndefined(contentType)) {
205+
contentType = headers['content-type'];
204206
}
205-
}
206-
// send response data (for requestId) to network debugger
207+
let acceptHeader;
207208

209+
if (types.isNullOrUndefined(contentType)) {
210+
acceptHeader = headers['Accept'];
211+
if (types.isNullOrUndefined(acceptHeader)) {
212+
acceptHeader = headers['accept'];
213+
}
214+
} else {
215+
acceptHeader = contentType;
216+
}
208217

209-
let contentType = headers['Content-Type'];
210-
if (contentType == null) {
211-
contentType = headers['content-type'];
212-
}
213-
let acceptHeader;
218+
let returnType = 'text/plain';
219+
if (!types.isNullOrUndefined(acceptHeader) && types.isString(acceptHeader)) {
220+
let acceptValues = acceptHeader.split(',');
221+
let quality = [];
222+
let defaultQuality = [];
223+
let customQuality = [];
224+
for (let value of acceptValues) {
225+
if (value.indexOf(';q=') > -1) {
226+
customQuality.push(value);
227+
} else {
228+
defaultQuality.push(value);
229+
}
230+
}
231+
customQuality = customQuality.sort((a, b) => {
232+
const a_quality = parseFloat(a.substring(a.indexOf(';q=')).replace(';q=', ''));
233+
const b_quality = parseFloat(b.substring(b.indexOf(';q=')).replace(';q=', ''));
234+
return (b_quality - a_quality);
235+
});
236+
quality.push(...defaultQuality);
237+
quality.push(...customQuality);
238+
returnType = quality[0];
239+
}
214240

215-
if (contentType == null) {
216-
acceptHeader = headers['Accept'];
217-
} else {
218-
acceptHeader = contentType;
219-
}
241+
result['statusCode'] = statusCode;
242+
243+
if (TNSHttpSettings.debug) {
244+
// send response data (for requestId) to network debugger
245+
// @ts-ignore
246+
if (global.__inspector && global.__inspector.isConnected) {
247+
NetworkAgent.responseReceived(counter, {
248+
url: result.url,
249+
statusCode,
250+
headers,
251+
responseAsString: isString ? (result.contentText ? result.contentText : result.content.toString()) : null,
252+
responseAsImage: null // TODO needs base64 Image
253+
}, headers);
254+
}
255+
256+
}
220257

221-
let returnType = 'text/plain';
222-
if (!types.isNullOrUndefined(acceptHeader) && types.isString(acceptHeader)) {
223-
let acceptValues = acceptHeader.split(',');
224-
let quality = [];
225-
let defaultQuality = [];
226-
let customQuality = [];
227-
for (let value of acceptValues) {
228-
if (value.indexOf(';q=') > -1) {
229-
customQuality.push(value);
230-
} else {
231-
defaultQuality.push(value);
258+
if (isTextContentType(returnType) && types.isNullOrUndefined(responseText)) {
259+
responseText = result.contentText;
260+
}
261+
262+
263+
if (TNSHttpSettings.saveImage && TNSHttpSettings.currentlySavedImages && TNSHttpSettings.currentlySavedImages[this._url]) {
264+
// ensure saved to disk
265+
if (TNSHttpSettings.currentlySavedImages[this._url].localPath) {
266+
FileManager.writeFile(content, TNSHttpSettings.currentlySavedImages[this._url].localPath, function (error, result) {
267+
if (TNSHttpSettings.debug) {
268+
console.log('http image save:', error ? error : result);
269+
}
270+
});
232271
}
233272
}
234-
customQuality = customQuality.sort((a, b) => {
235-
const a_quality = parseFloat(a.substring(a.indexOf(';q=')).replace(';q=', ''));
236-
const b_quality = parseFloat(b.substring(b.indexOf(';q=')).replace(';q=', ''));
237-
return (b_quality - a_quality);
238-
});
239-
quality.push(...defaultQuality);
240-
quality.push(...customQuality);
241-
returnType = quality[0];
242-
}
243273

244-
result['statusCode'] = statusCode;
245-
// send response data (for requestId) to network debugger
246-
// @ts-ignore
247-
if (global.__inspector && global.__inspector.isConnected) {
248-
NetworkAgent.responseReceived(counter, {
274+
resolve({
249275
url: result.url,
250-
statusCode,
251-
headers,
252-
responseAsString: isString ? result.content.toString() : null,
253-
responseAsImage: null // TODO needs base64 Image
254-
}, headers);
276+
content,
277+
responseText,
278+
statusCode: statusCode,
279+
headers: headers
280+
});
281+
requestCallbacks.delete(id);
282+
},
283+
onError(param0: string, param1: java.lang.Exception): void {
284+
reject({
285+
type: HttpError.Error,
286+
message: param0
287+
});
288+
requestCallbacks.delete(id);
289+
},
290+
onHeaders(jHeaders: any, status: number): void {
291+
statusCode = status;
292+
const length = jHeaders.size();
293+
let pair;
294+
for (let i = 0; i < length; i++) {
295+
pair = jHeaders.get(i);
296+
addHeader(headers, pair.key, pair.value);
297+
}
298+
if (options.onHeaders) {
299+
options.onHeaders(headers, statusCode);
300+
}
301+
requestCallbacks.delete(id);
302+
}, onLoading(): void {
303+
options.onLoading();
304+
requestCallbacks.delete(id);
305+
}, onProgress(lengthComputable: boolean, loaded: number, total: number): void {
306+
if (options.onProgress) {
307+
options.onProgress({
308+
lengthComputable,
309+
loaded,
310+
total
311+
});
312+
}
313+
requestCallbacks.delete(id);
314+
},
315+
onTimeout(): void {
316+
reject({
317+
type: HttpError.Timeout
318+
});
319+
requestCallbacks.delete(id);
255320
}
256-
257-
if (isTextContentType(returnType) && !responseText) {
321+
});
322+
id = com.github.triniwiz.async.Async.Http.makeRequest(javaOptions, callback);
323+
requestCallbacks.set(id, callback);
324+
};
325+
326+
if (TNSHttpSettings.saveImage && isImageUrl(options.url)) {
327+
// handle saved images to disk
328+
if (!TNSHttpSettings.currentlySavedImages) {
329+
const stored = getString(SaveImageStorageKey);
330+
if (stored) {
258331
try {
259-
responseText = JSON.stringify(content);
332+
TNSHttpSettings.currentlySavedImages = JSON.parse(stored);
260333
} catch (err) {
261-
this._reject({
262-
type: HttpError.Error,
263-
ios: null,
264-
message: err
265-
});
266-
return;
334+
TNSHttpSettings.currentlySavedImages = {};
267335
}
336+
} else {
337+
TNSHttpSettings.currentlySavedImages = {};
268338
}
269-
resolve({
270-
url: result.url,
271-
content,
272-
responseText,
273-
statusCode: statusCode,
274-
headers: headers
275-
});
276-
requestCallbacks.delete(id);
277-
},
278-
onError(param0: string, param1: java.lang.Exception): void {
279-
reject({
280-
type: HttpError.Error,
281-
message: param0
339+
}
340+
341+
342+
const imageSetting = TNSHttpSettings.currentlySavedImages[options.url];
343+
const requests = imageSetting ? imageSetting.requests : 0;
344+
let localPath: string;
345+
if (imageSetting && imageSetting.localPath && File.exists(imageSetting.localPath)) {
346+
// previously saved to disk
347+
FileManager.readFile(imageSetting.localPath, null, (error, file) => {
348+
if (error) {
349+
if (TNSHttpSettings.debug) {
350+
console.log('http image load error:', error);
351+
}
352+
}
353+
resolve({
354+
url: options.url,
355+
responseText: '',
356+
statusCode: 200,
357+
content: file,
358+
headers: {
359+
'Content-Type': 'arraybuffer'
360+
}
361+
});
282362
});
283-
requestCallbacks.delete(id);
284-
},
285-
onHeaders(jHeaders: any, status: number): void {
286-
statusCode = status;
287-
const length = jHeaders.size();
288-
let pair;
289-
for (let i = 0; i < length; i++) {
290-
pair = jHeaders.get(i);
291-
addHeader(headers, pair.key, pair.value);
363+
} else if (requests >= TNSHttpSettings.saveImage.numberOfRequests) {
364+
// setup to write to disk when response finishes
365+
let filename = fileNameFromPath(options.url);
366+
if (filename.indexOf('?')) {
367+
// strip any params if were any
368+
filename = filename.split('?')[0];
292369
}
293-
if (options.onHeaders) {
294-
options.onHeaders(headers, statusCode);
295-
}
296-
requestCallbacks.delete(id);
297-
}, onLoading(): void {
298-
options.onLoading();
299-
requestCallbacks.delete(id);
300-
}, onProgress(lengthComputable: boolean, loaded: number, total: number): void {
301-
if (options.onProgress) {
302-
options.onProgress({
303-
lengthComputable,
304-
loaded,
305-
total
306-
})
307-
}
308-
requestCallbacks.delete(id);
309-
},
310-
onTimeout(): void {
311-
reject({
312-
type: HttpError.Timeout
313-
});
314-
requestCallbacks.delete(id);
370+
localPath = path.join(knownFolders.documents().path, filename);
371+
makeRemoteRequest();
315372
}
316-
});
317-
id = com.github.triniwiz.async.Async.Http.makeRequest(javaOptions, callback);
318-
requestCallbacks.set(id, callback);
373+
374+
// save settings
375+
TNSHttpSettings.currentlySavedImages[options.url] = {
376+
...(imageSetting || {}),
377+
date: Date.now(),
378+
requests: requests + 1,
379+
localPath
380+
};
381+
setString(SaveImageStorageKey, JSON.stringify(TNSHttpSettings.currentlySavedImages));
382+
383+
} else {
384+
makeRemoteRequest();
385+
}
386+
319387
requestIdCounter++;
320388
} catch (ex) {
321389
reject({

0 commit comments

Comments
 (0)