'use strict'
-var async = require('async')
-var config = require('config')
-var request = require('request')
-var replay = require('request-replay')
+const replay = require('request-replay')
+const request = require('request')
-var constants = require('../initializers/constants')
-var logger = require('./logger')
-var peertubeCrypto = require('./peertubeCrypto')
+const constants = require('../initializers/constants')
+const peertubeCrypto = require('./peertube-crypto')
-var http = config.get('webserver.https') ? 'https' : 'http'
-var host = config.get('webserver.host')
-var port = config.get('webserver.port')
+const requests = {
+ makeRetryRequest,
+ makeSecureRequest
+}
-var requests = {
- makeMultipleRetryRequest: makeMultipleRetryRequest
+function makeRetryRequest (params, callback) {
+ replay(
+ request(params, callback),
+ {
+ retries: constants.RETRY_REQUESTS,
+ factor: 3,
+ maxTimeout: Infinity,
+ errorCodes: [ 'EADDRINFO', 'ETIMEDOUT', 'ECONNRESET', 'ESOCKETTIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED' ]
+ }
+ )
}
-function makeMultipleRetryRequest (all_data, pods, callbackEach, callback) {
- if (!callback) {
- callback = callbackEach
- callbackEach = null
+function makeSecureRequest (params, callback) {
+ const requestParams = {
+ url: constants.REMOTE_SCHEME.HTTP + '://' + params.toPod.host + params.path
}
- var url = http + '://' + host + ':' + port
- var signature
+ if (params.method !== 'POST') {
+ return callback(new Error('Cannot make a secure request with a non POST method.'))
+ }
+
+ requestParams.json = {}
// Add signature if it is specified in the params
- if (all_data.method === 'POST' && all_data.data && all_data.sign === true) {
- signature = peertubeCrypto.sign(url)
- }
+ if (params.sign === true) {
+ const host = constants.CONFIG.WEBSERVER.HOST
- // Make a request for each pod
- async.each(pods, function (pod, callback_each_async) {
- function callbackEachRetryRequest (err, response, body, url, pod) {
- if (callbackEach !== null) {
- callbackEach(err, response, body, url, pod, function () {
- callback_each_async()
- })
- } else {
- callback_each_async()
- }
+ let dataToSign
+ if (params.data) {
+ dataToSign = dataToSign = params.data
+ } else {
+ // We do not have data to sign so we just take our host
+ // It is not ideal but the connection should be in HTTPS
+ dataToSign = host
}
- var params = {
- url: pod.url + all_data.path,
- method: all_data.method
+ requestParams.json.signature = {
+ host, // Which host we pretend to be
+ signature: peertubeCrypto.sign(dataToSign)
}
+ }
- // Add data with POST requst ?
- if (all_data.method === 'POST' && all_data.data) {
- // Encrypt data ?
- if (all_data.encrypt === true) {
- // TODO: ES6 with let
- ;(function (copy_params, copy_url, copy_pod, copy_signature) {
- peertubeCrypto.encrypt(pod.publicKey, JSON.stringify(all_data.data), function (err, encrypted) {
- if (err) return callback(err)
+ // If there are data informations
+ if (params.data) {
+ requestParams.json.data = params.data
+ }
- copy_params.json = {
- data: encrypted.data,
- key: encrypted.key
- }
+ console.log(requestParams.json.data)
- makeRetryRequest(copy_params, copy_url, copy_pod, copy_signature, callbackEachRetryRequest)
- })
- })(params, url, pod, signature)
- } else {
- params.json = { data: all_data.data }
- makeRetryRequest(params, url, pod, signature, callbackEachRetryRequest)
- }
- } else {
- makeRetryRequest(params, url, pod, signature, callbackEachRetryRequest)
- }
- }, callback)
+ request.post(requestParams, callback)
}
// ---------------------------------------------------------------------------
module.exports = requests
-
-// ---------------------------------------------------------------------------
-
-function makeRetryRequest (params, from_url, to_pod, signature, callbackEach) {
- // Append the signature
- if (signature) {
- params.json.signature = {
- url: from_url,
- signature: signature
- }
- }
-
- logger.debug('Make retry requests to %s.', to_pod.url)
-
- replay(
- request.post(params, function (err, response, body) {
- callbackEach(err, response, body, params.url, to_pod)
- }),
- {
- retries: constants.REQUEST_RETRIES,
- factor: 3,
- maxTimeout: Infinity,
- errorCodes: [ 'EADDRINFO', 'ETIMEDOUT', 'ECONNRESET', 'ESOCKETTIMEDOUT', 'ENOTFOUND', 'ECONNREFUSED' ]
- }
- ).on('replay', function (replay) {
- logger.info('Replaying request to %s. Request failed: %d %s. Replay number: #%d. Will retry in: %d ms.',
- params.url, replay.error.code, replay.error.message, replay.number, replay.delay)
- })
-}