| /*! |
| * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved. |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express |
| * or implied. See the License for the specific language governing |
| * permissions and limitations under the License. |
| */ |
| import {RestfulAPI} from 'restful-js'; |
| import uuid from 'uuid-js'; |
| import md5 from 'md5'; |
| |
| import store from 'sdc-app/AppStore.js'; |
| import {actionTypes as LoaderConstants} from 'nfvo-components/loader/LoaderConstants.js'; |
| import Configuration from 'sdc-app/config/Configuration.js'; |
| import errorResponseHandler from './ErrorResponseHandler.js'; |
| |
| const AUTHORIZATION_HEADER = 'X-AUTH-TOKEN'; |
| const STORAGE_AUTH_KEY = 'sdc-auth-token'; |
| const REQUEST_ID_HEADER = 'X-ECOMP-RequestID'; |
| const CONTENT_MD5_HEADER = 'Content-MD5'; |
| |
| |
| |
| |
| function applyMD5Header(options, data) { |
| if (options.md5) { |
| let headers = options.headers; |
| headers[CONTENT_MD5_HEADER] = window.btoa(md5(JSON.stringify(data)).toLowerCase()); |
| } |
| } |
| |
| function handleResponse(xhr) { |
| let authToken = xhr.getResponseHeader(AUTHORIZATION_HEADER); |
| let prevToken = this && this.headers && this.headers[AUTHORIZATION_HEADER]; |
| if (authToken && authToken !== prevToken) { |
| if (authToken === 'null') { |
| localStorage.removeItem(STORAGE_AUTH_KEY); |
| } else { |
| localStorage.setItem(STORAGE_AUTH_KEY, authToken); |
| } |
| } |
| } |
| |
| |
| class RestAPIUtil extends RestfulAPI { |
| |
| applySecurity(options, data) { |
| let headers = options.headers || (options.headers = {}); |
| |
| let authToken = localStorage.getItem(STORAGE_AUTH_KEY); |
| if (authToken) { |
| headers[AUTHORIZATION_HEADER] = authToken; |
| } |
| |
| let attApiHeaders = Configuration.get('ATTApiHeaders'), |
| attUidHeader = attApiHeaders && attApiHeaders.userId; |
| if (attUidHeader) { |
| headers[attUidHeader.name] = attUidHeader.value; |
| } |
| |
| headers[REQUEST_ID_HEADER] = uuid.create().toString(); |
| applyMD5Header(options, data); |
| } |
| |
| handleRequest(url, type, options = {}, data){ |
| let success = options.success; |
| options.success = function (resp, textStatus, xhr) { |
| handleResponse.call(this, xhr); |
| if (success) { |
| success.call(options.context, {...resp}, textStatus, xhr); |
| } |
| }; |
| |
| if (DEBUG) { |
| console.log('--> Making REST call (' + type + '): ' + url); |
| } |
| return super.handleRequest(url, type, options, data); |
| } |
| |
| } |
| |
| const instance = new RestAPIUtil({ |
| errorResponseHandler, |
| ajaxStartHandler: () => store.dispatch({type: LoaderConstants.SHOW}), |
| ajaxStopHandler: () => store.dispatch({type: LoaderConstants.HIDE}) |
| }); |
| |
| // jQuery binary transport to download files through XHR |
| // http://www.henryalgus.com/reading-binary-files-using-jquery-ajax/ |
| // https://github.com/henrya/js-jquery/tree/master/BinaryTransport |
| instance.$.ajaxTransport('+binary', function (options/*, originalOptions , jqXHR*/) { |
| // check for conditions and support for blob / arraybuffer response type |
| if (window.FormData && ((options.dataType && (options.dataType === 'binary')) || |
| (options.data && ((window.ArrayBuffer && options.data instanceof ArrayBuffer) || |
| (window.Blob && options.data instanceof Blob)))) |
| ) { |
| return { |
| // create new XMLHttpRequest |
| send: function (headers, callback) { |
| // setup all letiables |
| let xhr = new XMLHttpRequest(), |
| url = options.url, |
| type = options.type, |
| async = options.async || true, |
| // blob or arraybuffer. Default is blob |
| dataType = options.responseType || 'blob', |
| data = options.data || null, |
| username = options.username || null, |
| password = options.password || null; |
| |
| xhr.addEventListener('load', function () { |
| let data = {}; |
| data[options.dataType] = xhr.response; |
| // make callback and send data |
| callback(xhr.status, xhr.statusText, data, xhr.getAllResponseHeaders()); |
| }); |
| |
| xhr.open(type, url, async, username, password); |
| |
| // setup custom headers |
| for (let i in headers) { |
| xhr.setRequestHeader(i, headers[i]); |
| } |
| |
| xhr.responseType = dataType; |
| xhr.send(data); |
| }, |
| abort: function () { |
| } |
| }; |
| } |
| }); |
| |
| export default instance; |