Browse Source

use nodejs to request http to replace angularjs http library

MaysWind 3 năm trước cách đây
mục cha
commit
6bde400566

+ 2 - 2
app/scripts/services/aria2HttpRpcService.js

@@ -1,7 +1,7 @@
 (function () {
     'use strict';
 
-    angular.module('ariaNg').factory('aria2HttpRpcService', ['$http', 'ariaNgConstants', 'ariaNgCommonService', 'ariaNgSettingService', 'ariaNgLogService', function ($http, ariaNgConstants, ariaNgCommonService, ariaNgSettingService, ariaNgLogService) {
+    angular.module('ariaNg').factory('aria2HttpRpcService', ['ariaNgNativeElectronService', 'ariaNgConstants', 'ariaNgCommonService', 'ariaNgSettingService', 'ariaNgLogService', function (ariaNgNativeElectronService, ariaNgConstants, ariaNgCommonService, ariaNgSettingService, ariaNgLogService) {
         var rpcUrl = ariaNgSettingService.getCurrentRpcUrl();
         var method = ariaNgSettingService.getCurrentRpcHttpMethod();
 
@@ -69,7 +69,7 @@
 
                 ariaNgLogService.debug('[aria2HttpRpcService.request] ' + (context && context.requestBody && context.requestBody.method ? context.requestBody.method + ' ' : '') + 'request start', requestContext);
 
-                return $http(requestContext).then(function onSuccess(response) {
+                return ariaNgNativeElectronService.requestHttp(requestContext).then(function onSuccess(response) {
                     var data = response.data;
 
                     ariaNgLogService.debug('[aria2HttpRpcService.request] ' + (context && context.requestBody && context.requestBody.method ? context.requestBody.method + ' ' : '') + 'response success', response);

+ 17 - 1
app/scripts/services/ariaNgNativeElectronService.js

@@ -1,7 +1,7 @@
 (function () {
     'use strict';
 
-    angular.module('ariaNg').factory('ariaNgNativeElectronService', ['ariaNgLogService', 'ariaNgLocalizationService', function (ariaNgLogService, ariaNgLocalizationService) {
+    angular.module('ariaNg').factory('ariaNgNativeElectronService', ['$q', 'ariaNgLogService', 'ariaNgLocalizationService', function ($q, ariaNgLogService, ariaNgLocalizationService) {
         var electron = angular.isFunction(window.nodeRequire) ? nodeRequire('electron') : {};
         var ipcRenderer = electron.ipcRenderer || {};
 
@@ -124,6 +124,22 @@
             setMinimizedToTray: function (value) {
                 invokeMainProcessMethod('render-set-native-config-minimized-to-tray', value);
             },
+            requestHttp: function (requestContext) {
+                var deferred = $q.defer();
+
+                invokeMainProcessMethodAsync('render-request-http', requestContext)
+                    .then(function onReceive(result) {
+                        if (result && result.success) {
+                            deferred.resolve(result.response);
+                        } else {
+                            deferred.reject(result.response);
+                        }
+                    }).catch(function onError() {
+                        deferred.reject({});
+                    });
+
+                return deferred.promise;
+            },
             openProjectLink: function () {
                 invokeMainProcessMethod('render-open-external-url', 'https://github.com/mayswind/AriaNg-Native');
             },

+ 5 - 0
main/ipc/methods.js

@@ -6,6 +6,7 @@ const core = require('../core');
 const config = require('../config/config');
 const menu = require('../components/menu');
 const tray = require('../components/tray');
+const network = require('../lib/network');
 const localfs = require('../lib/localfs');
 const bittorrent = require('../lib/bittorrent');
 
@@ -100,6 +101,10 @@ ipcMain.on('render-set-native-config-minimized-to-tray', (event, value) => {
     config.save('minimizedToTray');
 });
 
+ipcMain.handle('render-request-http', (event, requestContext) => {
+    return network.requestHttp(requestContext);
+});
+
 ipcMain.on('render-open-external-url', (event, url) => {
     shell.openExternal(url);
 });

+ 70 - 0
main/lib/network.js

@@ -0,0 +1,70 @@
+'use strict';
+
+const axios = require('axios').default;
+
+const pkgfile = require('../../package');
+
+const userAgent = 'AriaNg-Native/' + pkgfile.version;
+
+axios.interceptors.request.use(function (config) {
+    config.headers['User-Agent'] = userAgent;
+
+    return config;
+}, function (error) {
+    return Promise.reject(error);
+});
+
+axios.interceptors.response.use(function (response) {
+    return getFinalHttpResponse(response, true);
+}, function (error) {
+    return getFinalHttpResponse((error.response ? error.response : error), false);
+});
+
+let getFinalHttpResponse = function (response, success) {
+    const finalResponse = {
+        data: (response && response.data) ? response.data : null,
+        status: (response && response.status) ? response.status : -1,
+        statusText: (response && response.statusText) ? response.statusText : '',
+        config: {}
+    };
+
+    if (response && response.config) {
+        if (response.config.method) {
+            finalResponse.config.method = response.config.method.toUpperCase();
+        }
+
+        finalResponse.config.url = response.config.url;
+        finalResponse.config.timeout = response.config.timeout;
+
+        try {
+            finalResponse.config.data = JSON.parse(response.config.data);
+        } catch (ex) {
+            ; // Do Nothing
+        }
+
+        finalResponse.config.headers = response.config.headers;
+    }
+
+    return {
+        success: success,
+        response: finalResponse
+    };
+};
+
+let requestHttp = function (requestContext) {
+    const request = {
+        url: requestContext.url,
+        method: requestContext.method,
+        timeout: requestContext.timeout
+    };
+
+    if (requestContext.method === 'POST') {
+        request.data = requestContext.data;
+    }
+
+    return axios(request);
+};
+
+module.exports = {
+    requestHttp: requestHttp
+};

+ 17 - 9
package-lock.json

@@ -667,8 +667,7 @@
     "asynckit": {
       "version": "0.4.0",
       "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
-      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==",
-      "dev": true
+      "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q=="
     },
     "at-least-node": {
       "version": "1.0.0",
@@ -691,6 +690,15 @@
       "resolved": "https://registry.npmjs.org/awesome-bootstrap-checkbox/-/awesome-bootstrap-checkbox-0.3.7.tgz",
       "integrity": "sha1-sRKXPubVv/QKshfEIBhcRwJR0OI="
     },
+    "axios": {
+      "version": "0.27.2",
+      "resolved": "https://registry.npmjs.org/axios/-/axios-0.27.2.tgz",
+      "integrity": "sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==",
+      "requires": {
+        "follow-redirects": "^1.14.9",
+        "form-data": "^4.0.0"
+      }
+    },
     "balanced-match": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
@@ -1224,7 +1232,6 @@
       "version": "1.0.8",
       "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
       "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
-      "dev": true,
       "requires": {
         "delayed-stream": "~1.0.0"
       }
@@ -1477,8 +1484,7 @@
     "delayed-stream": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
-      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==",
-      "dev": true
+      "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ=="
     },
     "deps-sort": {
       "version": "2.0.1",
@@ -2003,6 +2009,11 @@
       "resolved": "https://registry.npmjs.org/flot/-/flot-0.8.3.tgz",
       "integrity": "sha512-xg2otcTJDvS+ERK+my4wxG/ASq90QURXtoM4LhacCq0jQW2jbyjdttbRNqU2cPykrpMvJ6b2uSp6SAgYAzj9tQ=="
     },
+    "follow-redirects": {
+      "version": "1.15.2",
+      "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz",
+      "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA=="
+    },
     "font-awesome": {
       "version": "4.7.0",
       "resolved": "https://registry.npmjs.org/font-awesome/-/font-awesome-4.7.0.tgz",
@@ -2012,7 +2023,6 @@
       "version": "4.0.0",
       "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.0.tgz",
       "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==",
-      "dev": true,
       "requires": {
         "asynckit": "^0.4.0",
         "combined-stream": "^1.0.8",
@@ -2645,14 +2655,12 @@
     "mime-db": {
       "version": "1.52.0",
       "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz",
-      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==",
-      "dev": true
+      "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg=="
     },
     "mime-types": {
       "version": "2.1.35",
       "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz",
       "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==",
-      "dev": true,
       "requires": {
         "mime-db": "1.52.0"
       }

+ 2 - 0
package.json

@@ -67,6 +67,7 @@
     "angular-websocket": "^2.0.1",
     "angularjs-dragula": "^2.0.0",
     "awesome-bootstrap-checkbox": "^0.3.7",
+    "axios": "^0.27.2",
     "bootstrap": "3.4.1",
     "bootstrap-contextmenu": "^1.0.0",
     "echarts": "3.8.5",
@@ -82,6 +83,7 @@
     "yargs": "^15.4.1"
   },
   "mainDependencies": [
+    "axios",
     "electron-localshortcut",
     "electron-store",
     "yargs",