79 lines
2.3 KiB
JavaScript
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 }
|
|
|