From 9252a94d29d5776dce9c8f25184fed77d4524dd2 Mon Sep 17 00:00:00 2001 From: Nathan Walker Date: Wed, 6 Sep 2017 17:20:10 -0700 Subject: [PATCH] feat(Http): expand support for request on local files --- nativescript-angular/http/ns-http.ts | 64 ++++++++++++++++++++-------- tests/app/tests/http.ts | 21 ++++++++- 2 files changed, 66 insertions(+), 19 deletions(-) diff --git a/nativescript-angular/http/ns-http.ts b/nativescript-angular/http/ns-http.ts index 6b6fff33e..d8d6453b0 100644 --- a/nativescript-angular/http/ns-http.ts +++ b/nativescript-angular/http/ns-http.ts @@ -2,6 +2,7 @@ import { Injectable } from "@angular/core"; import { Http, ConnectionBackend, + Request, RequestOptions, RequestOptionsArgs, ResponseOptions, @@ -24,32 +25,59 @@ export class NSHttp extends Http { super(backend, defaultOptions); } + /** + * Performs a request with `request` http method. + */ + request(req: string | Request, options?: RequestOptionsArgs): Observable { + const urlString = typeof req === "string" ? req : req.url; + if (isLocalRequest(urlString)) { + return this._requestLocalUrl(urlString); + } else { + return super.request(req, options); + } + } + /** * Performs a request with `get` http method. - * Uses a local file if `~/` resource is requested. */ get(url: string, options?: RequestOptionsArgs): Observable { - if (url.indexOf("~") === 0 || url.indexOf("/") === 0) { - // normalize url - url = url.replace("~", "").replace("/", ""); - // request from local app resources - return Observable.fromPromise(new Promise((resolve, reject) => { - let app = this.nsFileSystem.currentApp(); - let localFile = app.getFile(url); - if (localFile) { - localFile.readText().then((data) => { - resolve(responseOptions(data, 200, url)); - }, (err: Object) => { - reject(responseOptions(err, 400, url)); - }); - } else { - reject(responseOptions("Not Found", 404, url)); - } - })); + if (isLocalRequest(url)) { + return this._requestLocalUrl(url); } else { return super.get(url, options); } } + + /** + * Uses a local file if `~/` resource is requested. + * @param url + */ + private _requestLocalUrl(url: string): Observable { + // normalize url + url = normalizeLocalUrl(url); + // request from local app resources + return Observable.fromPromise(new Promise((resolve, reject) => { + let app = this.nsFileSystem.currentApp(); + let localFile = app.getFile(url); + if (localFile) { + localFile.readText().then((data) => { + resolve(responseOptions(data, 200, url)); + }, (err: Object) => { + reject(responseOptions(err, 400, url)); + }); + } else { + reject(responseOptions("Not Found", 404, url)); + } + })); + } +} + +function isLocalRequest(url: string): boolean { + return url.indexOf("~") === 0 || url.indexOf("/") === 0; +} + +function normalizeLocalUrl(url: string): string { + return url.replace("~", "").replace("/", ""); } function responseOptions(body: string | Object, status: number, url: string): Response { diff --git a/tests/app/tests/http.ts b/tests/app/tests/http.ts index b9456f95f..e3dd55794 100644 --- a/tests/app/tests/http.ts +++ b/tests/app/tests/http.ts @@ -5,7 +5,7 @@ import { inject, } from "@angular/core/testing"; import {ReflectiveInjector} from "@angular/core"; -import {BaseRequestOptions, ConnectionBackend, Http, Response, ResponseOptions} from "@angular/http"; +import {Request, BaseRequestOptions, ConnectionBackend, Http, Response, ResponseOptions} from "@angular/http"; import "rxjs/add/operator/map"; import {MockBackend} from "@angular/http/testing"; import {NSHttp} from "nativescript-angular/http/ns-http"; @@ -45,6 +45,25 @@ describe("Http", () => { }); }); + it("request method should work with local files prefixed with '~'", () => { + http.request("~/test.json").map(res => res.json()).subscribe((response: any) => { + assert.strictEqual(3, response.length); + assert.strictEqual("Alex", response[0].name); + }); + }); + + it("request method using Request type should work with local files prefixed with '~'", () => { + const url = "~/test.json"; + const req = new Request({ + method: 'GET', + url + }); + http.request(req).map(res => res.json()).subscribe((response: any) => { + assert.strictEqual(3, response.length); + assert.strictEqual("Alex", response[0].name); + }); + }); + it("should work with local files prefixed with '/'", () => { http.get("/test.json").map(res => res.json()).subscribe((response: any) => { assert.strictEqual(3, response.length);