/** * Proxy.js * * Released under LGPL License. * Copyright (c) 1999-2016 Ephox Corp. All rights reserved * * License: http://www.tinymce.com/license * Contributing: http://www.tinymce.com/contributing */ /** * Handles loading images though a proxy for working around cors. */ define("tinymce/imagetoolsplugin/Proxy", [ "global!tinymce.util.Promise", "global!tinymce.util.Tools", "tinymce/imagetoolsplugin/Utils" ], function(Promise, Tools, Utils) { var isServiceErrorCode = function (code) { return code === 400 || code === 403 || code === 500; }; var handleHttpError = function (status) { return Promise.reject("ImageProxy HTTP error: " + status); }; var proxyServiceError = function (error) { Promise.reject("ImageProxy Service error: " + error); }; var handleServiceError = function (status, blob) { return Utils.readBlob(blob).then(function(text) { var serviceError = Utils.parseJson(text); var errorType = Utils.traverse(serviceError, ['error', 'type']); return errorType ? proxyServiceError(errorType) : proxyServiceError('Invalid JSON'); }); }; var handleServiceErrorResponse = function (status, blob) { return isServiceErrorCode(status) ? handleServiceError(status, blob) : handleHttpError(status); }; var requestServiceBlob = function (url, apiKey) { return Utils.requestUrlAsBlob(url, { 'Content-Type': 'application/json;charset=UTF-8', 'tiny-api-key': apiKey }).then(function (result) { return result.status >= 400 ? handleServiceErrorResponse(result.status, result.blob) : Promise.resolve(result.blob); }); }; function requestBlob(url) { return Utils.requestUrlAsBlob(url, {}).then(function (result) { return result.status >= 400 ? handleHttpError(result.status) : Promise.resolve(result.blob); }); } var getUrl = function (url, apiKey) { return apiKey ? requestServiceBlob(url, apiKey) : requestBlob(url); }; return { getUrl: getUrl }; });