/* * Copyright © 2016-2017 European Support Limited * * 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. */ const needle = require('needle'); const fs = require('fs'); require('node-zip'); var btoa = require('btoa'); const md5 = require('md5'); const _ = require('lodash'); function getOptionsForRequest(context, method, path, type) { if (type == undefined || type == null) { type = context.defaultServerType } let server = context.getUrlForType(type); let options = { method: method, url: server + path, headers: _.clone(context.headers[type]) }; // options.headers["Content-Type"] = "application/json"; // options.headers["accept"] = "application/json"; return options; } function _requestBinaryFormData(context, method, path, fileName, formInputName, type) { let options = getOptionsForRequest(context, method, path, type); let formData = {}; if (method === 'POST' || method === 'PUT') { //formData[formInputName] = fs.createReadStream(fileName); //options.formData = formData; let fileData = { file: fileName }; fileData['content_type'] = 'multipart/form-data'; options.formData = {}; options.formData[formInputName] = fileData; } return _request(context, method, path, options); } function _requestBinaryBody(context, method, path, fileName, type) { let options = getOptionsForRequest(context, method, path, type); if (method === 'POST' || method === 'PUT') { options.body = fs.createReadStream(fileName); options.headers['Content-Type'] = 'application/octet-stream'; } return _request(context, method, path, options); } function _requestPayload(context, method, path, filePath, type) { let options = getOptionsForRequest(context, method, path, type); options.json = _createPayload(filePath); options.headers['Content-MD5'] = addCheckSum(options.json); return _request(context, method, path, options); } function _requestRest(context, method, path, data, type) { let options = getOptionsForRequest(context, method, path, type); if (method === 'POST' || method === 'PUT') { options.json = data; } return _request(context, method, path, options); } function _request(context, method, path, options) { console.log('--> Calling REST ' + options.method +' url: ' + options.url); let inputData = options.json; let needleOptions = {headers: options.headers, rejectUnauthorized: false}; if (inputData == undefined) { if (options.formData != undefined) { inputData = options.formData; needleOptions.multipart = true; } if (inputData && inputData.body != undefined) { inputData = options.body; } } else { needleOptions.json = true; } return needle(method, options.url, inputData, needleOptions) .then(function(result) { context.inputData = null; let successResult = result.statusCode >= 200 && result.statusCode < 300; let isExpected = context.shouldFail ? !successResult : successResult; data = result.body; if (!isExpected) { console.log('Did not get expected response code'); throw 'Status Code was ' + result.statusCode ; } if (context.statusCode) { let expectedStatusCode = context.statusCode; context.statusCode = null; if (result.statusCode !== expectedStatusCode) { throw 'Response Status Code was ' + result.statusCode + ' instead of ' + expectedStatusCode; } } if (context.shouldFail) { context.shouldFail = false; if (context.errorCode) { if (typeof data === 'string' && data) { data = JSON.parse(data); } let contextErrorCode = context.errorCode; let errorCode = data.errorCode; context.errorCode = null; if (errorCode !== contextErrorCode) { throw 'Error Code was ' + errorCode + ' instead of ' + contextErrorCode; } } if (context.errorMessage) { if (typeof data === 'string' && data) { data = JSON.parse(data); } let errorMessage = data.message; let contextErrorMessage = context.errorMessage; context.errorMessage = null; if (errorMessage !== contextErrorMessage) { throw 'Error Message was ' + errorMessage + ' instead of ' + contextErrorMessage; } } return({statusCode: result.statusCode, data: {}}); } if (typeof data === 'string' && data) { if (data.startsWith('[') || data.startsWith('{')) { data = JSON.parse(data); } } context.responseData = data; context.inputData = data; return({statusCode: result.statusCode, data: data}); }) .catch(function(err) { console.error('Request URL: ' + options.url); console.error('Request Method: ' + options.method); console.log(err); throw err; }) } function download(context, path, filePath, type) { if (type == undefined || type == null) { type = context.defaultServerType } let server = context.getUrlForType(type); let options = { method: 'GET', url: server + path, headers: context.headers[type] }; console.log('--> Calling REST download url: ' + options.url); return needle('GET', options.url, {}, { headers: options.headers, rejectUnauthorized: false, output: filePath }) .then(function (result) { let zipFile = fs.readFileSync(filePath, 'binary'); let zip = new JSZip(zipFile, {base64: false, checkCRC32: true}); if (zip.files['MANIFEST.json']) { let manifestData = zip.files['MANIFEST.json']._data; manifestData = manifestData.replace(/\\n/g, ''); context.responseData = JSON.parse(manifestData); } return zip; }) .catch(function (err) { console.error('Request URL: ' + options.url); console.error('Request Method: ' + options.method); throw err; }) } function _random() { let d = new Date(); return d.getTime().toString().split('').reverse().join(''); } function _getJSONFromFile(file) { return JSON.parse(fs.readFileSync(file, 'utf8')); } function _createPayload(fileName) { var body = fs.readFileSync(fileName); let payload = { payloadData: body.toString('base64'), payloadName: fileName.substring(fileName.lastIndexOf("/") + 1 ) }; return payload; } function addCheckSum(payloadData) { let _md5 = md5(JSON.stringify(payloadData)); return btoa(_md5.toLowerCase()); } function _getFile(file, format) { if(format === '' ){ return fs.readFileSync(file) } return fs.readFileSync(file, format); } module.exports = { getFile: _getFile, request: _requestRest, requestPayload: _requestPayload, requestBinaryFormData: _requestBinaryFormData, requestBinaryBody: _requestBinaryBody, random : _random, getJSONFromFile: _getJSONFromFile, download: download, payload: _createPayload };