Skip to content

Commit

Permalink
fix(http): ensure httpcontent.toFile() creates intermediate directori…
Browse files Browse the repository at this point in the history
…es (#6451)
  • Loading branch information
gezn authored and manoldonev committed Mar 20, 2019
1 parent e6486f6 commit d7fb9b8
Show file tree
Hide file tree
Showing 4 changed files with 92 additions and 98 deletions.
28 changes: 23 additions & 5 deletions tests/app/http/http-tests.ts
Original file line number Diff line number Diff line change
Expand Up @@ -158,9 +158,9 @@ export var test_getJSON_fail_when_result_is_not_JSONP = function (done) {
export var test_gzip_request_explicit = function(done) {
var result;

http.request({
url: "https://postman-echo.com/gzip",
method: "GET",
http.request({
url: "https://postman-echo.com/gzip",
method: "GET",
headers: {
"Accept-Encoding": "gzip"
}}).then(function (r) {
Expand All @@ -180,8 +180,8 @@ export var test_gzip_request_explicit = function(done) {
export var test_gzip_request_implicit = function(done) {
var result;

http.request({
url: "https://postman-echo.com/gzip",
http.request({
url: "https://postman-echo.com/gzip",
method: "GET"}).then(function (r) {
result = r;
try {
Expand Down Expand Up @@ -524,6 +524,24 @@ export var test_request_responseContentToFileFromUrlShouldReturnCorrectFile = fu
done(e);
});
};
export var test_request_responseContentToFileFromUrlShouldReturnCorrectFileAndCreateDirPathIfNecesary = function (done) {
var result;

http.request({ url: "https://raw.githubusercontent.com/NativeScript/NativeScript/master/tests/app/logo.png", method: "GET" }).then(function (response) {
const filePath = fs.path.join(fs.knownFolders.temp().path, "test", "some", "path", "logo.png");
result = response.content.toFile(filePath);
try {
TKUnit.assert(result instanceof fs.File, "Result from toFile() should be valid File object!");
TKUnit.assert(result.size > 0, "result from to file should be greater than 0 in size");
done(null);
}
catch (err) {
done(err);
}
}, function (e) {
done(e);
});
};

export var test_request_responseContentToFileFromContentShouldReturnCorrectFile = function (done) {
var result;
Expand Down
4 changes: 2 additions & 2 deletions tests/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -6,10 +6,10 @@
"nativescript": {
"id": "org.nativescript.UnitTestApp",
"tns-ios": {
"version": "5.1.0"
"version": "5.2.0"
},
"tns-android": {
"version": "5.1.0"
"version": "5.2.1"
}
},
"dependencies": {
Expand Down
80 changes: 31 additions & 49 deletions tns-core-modules/http/http-request/http-request.android.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
/**
* Android specific http request implementation.
*/
import * as imageSourceModule from "../../image-source";
import * as platformModule from "../../platform";
import * as fsModule from "../../file-system";
import { fromNativeSource } from "../../image-source";
import { screen } from "../../platform";
import { File } from "../../file-system";
import { getFilenameFromUrl } from "./http-request-common";

// this is imported for definition purposes only
Expand All @@ -17,32 +17,18 @@ export enum HttpResponseEncoding {
}

function parseJSON(source: string): any {
var src = source.trim();
const src = source.trim();
if (src.lastIndexOf(")") === src.length - 1) {
return JSON.parse(src.substring(src.indexOf("(") + 1, src.lastIndexOf(")")));
}

return JSON.parse(src);
}

var requestIdCounter = 0;
var pendingRequests = {};
let requestIdCounter = 0;
const pendingRequests = {};

var imageSource: typeof imageSourceModule;
function ensureImageSource() {
if (!imageSource) {
imageSource = require("image-source");
}
}

var platform: typeof platformModule;
function ensurePlatform() {
if (!platform) {
platform = require("platform");
}
}

var completeCallback: org.nativescript.widgets.Async.CompleteCallback;
let completeCallback: org.nativescript.widgets.Async.CompleteCallback;
function ensureCompleteCallback() {
if (completeCallback) {
return;
Expand All @@ -60,7 +46,7 @@ function ensureCompleteCallback() {
}

function onRequestComplete(requestId: number, result: org.nativescript.widgets.Async.Http.RequestResult) {
var callbacks = pendingRequests[requestId];
const callbacks = pendingRequests[requestId];
delete pendingRequests[requestId];

if (result.error) {
Expand All @@ -69,13 +55,12 @@ function onRequestComplete(requestId: number, result: org.nativescript.widgets.A
}

// read the headers
var headers: http.Headers = {};
const headers: http.Headers = {};
if (result.headers) {
var jHeaders = result.headers;
var length = jHeaders.size();
var i;
var pair: org.nativescript.widgets.Async.Http.KeyValuePair;
for (i = 0; i < length; i++) {
const jHeaders = result.headers;
const length = jHeaders.size();
let pair: org.nativescript.widgets.Async.Http.KeyValuePair;
for (let i = 0; i < length; i++) {
pair = jHeaders.get(i);
addHeader(headers, pair.key, pair.value);
}
Expand Down Expand Up @@ -112,29 +97,29 @@ function onRequestComplete(requestId: number, result: org.nativescript.widgets.A
return parseJSON(str);
},
toImage: () => {
ensureImageSource();

return new Promise<any>((resolveImage, rejectImage) => {
if (result.responseAsImage != null) {
resolveImage(imageSource.fromNativeSource(result.responseAsImage));
resolveImage(fromNativeSource(result.responseAsImage));
}
else {
rejectImage(new Error("Response content may not be converted to an Image"));
}
});
},
toFile: (destinationFilePath: string) => {
var fs: typeof fsModule = require("file-system");

if (!destinationFilePath) {
destinationFilePath = getFilenameFromUrl(callbacks.url);
}
var stream: java.io.FileOutputStream;
let stream: java.io.FileOutputStream;
try {
var javaFile = new java.io.File(destinationFilePath);
// ensure destination path exists by creating any missing parent directories
const file = File.fromPath(destinationFilePath);

const javaFile = new java.io.File(destinationFilePath);
stream = new java.io.FileOutputStream(javaFile);
stream.write(result.raw.toByteArray());
return fs.File.fromPath(destinationFilePath);

return file;
}
catch (exception) {
throw new Error(`Cannot save file with path: ${destinationFilePath}.`);
Expand All @@ -152,7 +137,7 @@ function onRequestComplete(requestId: number, result: org.nativescript.widgets.A
}

function onRequestError(error: string, requestId: number) {
var callbacks = pendingRequests[requestId];
const callbacks = pendingRequests[requestId];
delete pendingRequests[requestId];
if (callbacks) {
callbacks.rejectCallback(new Error(error));
Expand All @@ -164,7 +149,7 @@ function buildJavaOptions(options: http.HttpRequestOptions) {
throw new Error("Http request must provide a valid url.");
}

var javaOptions = new org.nativescript.widgets.Async.Http.RequestOptions();
const javaOptions = new org.nativescript.widgets.Async.Http.RequestOptions();

javaOptions.url = options.url;

Expand All @@ -182,22 +167,19 @@ function buildJavaOptions(options: http.HttpRequestOptions) {
}

if (options.headers) {
var arrayList = new java.util.ArrayList<org.nativescript.widgets.Async.Http.KeyValuePair>();
var pair = org.nativescript.widgets.Async.Http.KeyValuePair;
const arrayList = new java.util.ArrayList<org.nativescript.widgets.Async.Http.KeyValuePair>();
const pair = org.nativescript.widgets.Async.Http.KeyValuePair;

for (var key in options.headers) {
for (let key in options.headers) {
arrayList.add(new pair(key, options.headers[key] + ""));
}

javaOptions.headers = arrayList;
}

ensurePlatform();

// pass the maximum available image size to the request options in case we need a bitmap conversion
var screen = platform.screen.mainScreen;
javaOptions.screenWidth = screen.widthPixels;
javaOptions.screenHeight = screen.heightPixels;
javaOptions.screenWidth = screen.mainScreen.widthPixels;
javaOptions.screenHeight = screen.mainScreen.heightPixels;

return javaOptions;
}
Expand All @@ -211,15 +193,15 @@ export function request(options: http.HttpRequestOptions): Promise<http.HttpResp
return new Promise<http.HttpResponse>((resolve, reject) => {
try {
// initialize the options
var javaOptions = buildJavaOptions(options);
const javaOptions = buildJavaOptions(options);

// send request data to network debugger
if (global.__inspector && global.__inspector.isConnected) {
NetworkAgent.requestWillBeSent(requestIdCounter, options);
}

// remember the callbacks so that we can use them when the CompleteCallback is called
var callbacks = {
const callbacks = {
url: options.url,
resolveCallback: resolve,
rejectCallback: reject
Expand Down Expand Up @@ -252,7 +234,7 @@ export function addHeader(headers: http.Headers, key: string, value: string): vo
} else if (Array.isArray(headers[key])) {
(<string[]>headers[key]).push(value);
} else {
let values: string[] = [<string>headers[key]];
const values: string[] = [<string>headers[key]];
values.push(value);
headers[key] = values;
}
Expand Down

0 comments on commit d7fb9b8

Please sign in to comment.