From 4cf6b669394bdd46d230707e00f910500bf71b42 Mon Sep 17 00:00:00 2001 From: Vladimir Enchev Date: Mon, 7 Sep 2015 10:52:49 +0300 Subject: [PATCH] http jsonp support added --- apps/tests/http-tests.ts | 33 +++++++++++++++++++++++++++++++++ http/http-request.android.ts | 3 ++- http/http-request.ios.ts | 5 ++++- utils/utils-common.ts | 10 ++++++++++ utils/utils.d.ts | 6 ++++++ 5 files changed, 55 insertions(+), 2 deletions(-) diff --git a/apps/tests/http-tests.ts b/apps/tests/http-tests.ts index 30bd859b0..25df556a3 100644 --- a/apps/tests/http-tests.ts +++ b/apps/tests/http-tests.ts @@ -130,6 +130,39 @@ export var test_getJSON_fail_when_result_is_not_JSON = function (done) { }); }; +export var test_getJSONP = function (done) { + var result; + + http.getJSON("http://demos.telerik.com/kendo-ui/service/Products").then(function (r) { + result = r; + try { + TKUnit.assert(typeof (JSON.stringify(result)) === "string", "Result from getJSON() should be valid JSON object!"); + done(null); + } + catch (e) { + done(e); + } + done(null); + }, function (e) { + done(e); + }); +}; + +export var test_getJSON_fail_when_result_is_not_JSONP = function (done) { + var result; + + http.getJSON({ url: "https://httpbin.org/html", method: "GET" }).catch(function (e) { + result = e; + try { + TKUnit.assert(result instanceof Error, "Result from getJSON().catch() should be Error! Current type is " + typeof result); + done(null); + } + catch (err) { + done(err); + } + }); +}; + export var test_getImage_isDefined = function () { TKUnit.assert(typeof (http.getImage) !== "undefined", "Method http.getImage() should be defined!"); }; diff --git a/http/http-request.android.ts b/http/http-request.android.ts index 192cb422f..e11ae10c9 100644 --- a/http/http-request.android.ts +++ b/http/http-request.android.ts @@ -4,6 +4,7 @@ import imageSource = require("image-source"); import types = require("utils/types"); +import utils = require("utils/utils"); // this is imported for definition purposes only import http = require("http"); @@ -45,7 +46,7 @@ function onRequestComplete(requestId: number, result: com.tns.Async.Http.Request content: { raw: result.raw, toString: () => { return result.responseAsString; }, - toJSON: () => { return JSON.parse(result.responseAsString); }, + toJSON: () => { return utils.parseJSON(result.responseAsString); }, toImage: () => { return new Promise((resolveImage, rejectImage) => { if (result.responseAsImage != null) { diff --git a/http/http-request.ios.ts b/http/http-request.ios.ts index da8db20ea..d01345506 100644 --- a/http/http-request.ios.ts +++ b/http/http-request.ios.ts @@ -5,6 +5,7 @@ import http = require("http"); import imageSource = require("image-source"); import types = require("utils/types"); +import utils = require("utils/utils"); var GET = "GET"; var USER_AGENT_HEADER = "User-Agent"; @@ -60,7 +61,9 @@ export function request(options: http.HttpRequestOptions): Promise { return NSDataToString(data); }, - toJSON: () => { return JSON.parse(NSDataToString(data)); }, + toJSON: () => { + return utils.parseJSON(NSDataToString(data)); + }, toImage: () => { return new Promise((resolveImage, rejectImage) => { var img = imageSource.fromData(data); diff --git a/utils/utils-common.ts b/utils/utils-common.ts index 1384aed74..14a940358 100644 --- a/utils/utils-common.ts +++ b/utils/utils-common.ts @@ -20,6 +20,15 @@ export function copyFrom(source: any, target: any) { } } +export function parseJSON(source: string): any { + var src = source.trim(); + if (src.lastIndexOf(")") === src.length - 1) { + return JSON.parse(src.substring(src.indexOf("(") + 1, src.lastIndexOf(")"))); + } + + return JSON.parse(src); +} + export module layout { var MODE_SHIFT = 30; @@ -39,6 +48,7 @@ export module layout { return "Exact"; case layout.AT_MOST: + return "AtMost"; default: diff --git a/utils/utils.d.ts b/utils/utils.d.ts index 27b88917f..e6b560f42 100644 --- a/utils/utils.d.ts +++ b/utils/utils.d.ts @@ -167,4 +167,10 @@ * @param uri The URI. */ export function isDataURI(uri: string): boolean + + /** + * Returns object from JSON or JSONP string. + * @param source The JSON or JSONP string. + */ + export function parseJSON(source: string): any }