Files
speckle-server/packages/webhook-service/src/webhookCaller.js
T
2021-12-20 12:38:34 +02:00

79 lines
2.3 KiB
JavaScript

'use strict'
const dns = require( 'dns' )
const isIpPrivate = require( 'private-ip' )
// Ignore invalid/self-signed https certificate errors for the entire process
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0'
const fetch = require( 'node-fetch' )
var debug = require( 'debug' )( 'speckle' )
async function isLocalNetworkUrl( url ) {
let parsedUrl = new URL( url )
let hostname = parsedUrl.hostname
let ip = await new Promise( ( resolve, reject ) => {
dns.lookup( hostname, ( err, addr, fam ) => {
if ( err ) {
reject( err )
} else {
resolve( addr )
}
} )
} )
return isIpPrivate( ip )
}
async function makeNetworkRequest( { url, data, headersData } ) {
if ( process.env.ALLOW_LOCAL_NETWORK !== 'true' && ( await isLocalNetworkUrl( url ) ) ) {
return {
success: false,
error: 'Local network requests are not allowed. To allow, use ALLOW_LOCAL_NETWORK=true environment variable',
duration: 0,
responseCode: null,
responseBody: null
}
}
let httpSuccessCodes = [ 200 ]
let headers = { 'Content-Type': 'application/json' }
for ( let k in headersData ) headers[ k ] = headersData[ k ]
debug( 'POST request to:', url )
let t0 = Date.now()
try {
let response = await fetch( url, {
method: 'POST',
body: JSON.stringify( data ),
headers: headers,
follow: 2, // follow max 2 redirects (fetch defaults to 20)
timeout: 10 * 1000, // timeout after 10sec (defauls to no timeout)
size: 500 * 1000, // 500kb max response size, to accomodate various error responses (defaults to no limit)
} ).then( async res => ( { status: res.status, body: await res.text() } ) )
//console.log( 'Server response:', response )
let error = httpSuccessCodes.indexOf( response.status ) === -1 ? `HTTP response code: ${response.status}` : ''
let success = httpSuccessCodes.indexOf( response.status ) !== -1
return {
success: success,
error: error,
duration: ( Date.now() - t0 ) / 1000,
responseCode: response.status,
responseBody: response.body
}
} catch ( e ) {
return {
success: false,
error: e.toString(),
duration: ( Date.now() - t0 ) / 1000,
responseCode: null,
responseBody: null
}
}
}
module.exports = { makeNetworkRequest, isLocalNetworkUrl }