2023-07-29 20:32:17 +02:00
//Server-side Javascript (Node.js)
//This implementation uses Node.js, which powers SVR.JS.
//This implementation contains elements specific for SVR.JS mods:
// req - A server request instance
// res - A server response instance
// serverconsole - A console output object for SVR.JS
// responseEnd - Response ending method of SVR.JS
// href - Request URL without query
// ext - File extension of requested file
// uobject - Request URL object
// search - Request URL queries
2023-09-11 23:08:53 +02:00
// defaultPage - An index page location (deprecated, always returns 'index.html')
2023-07-29 20:32:17 +02:00
// users - A list of users (deprecated)
// page404 - 404 Not Found page location
// head - A head of server response
// foot - A foot of server response
2023-09-11 22:56:56 +02:00
// fd - Currently unused
2023-07-29 20:32:17 +02:00
// elseCallback - Method summoning SVR.JS internal callbacks
// callServerError - Method to end with server error
// getCustomHeaders - Method to get headers defined in config.json file
// origHref - Original request URL without query (before URL rewriting)
// redirect - Method to redirect.
// parsePostData - Method to parse POST data.
2024-02-07 00:35:00 +01:00
// authUser - Authenticated HTTP user.
2023-07-29 20:32:17 +02:00
//Along with elements added by this implementation:
// disableEndElseCallbackExecute - Determines execution of elseCallback on end
// filterHeaders - Removes invalid HTTP/1.0 headers
// customvar1, customvar2, customvar3, customvar4 - Custom variables
//Built-in libraries:
// http
// https
// readline
// os
// url
// hexstrbase64
// fs
// path
// crypto
// stream
//If you send response remember and don't use disableEndElseCallbackExecute, use "return;", or else SVR.JS will crash.
//If you use proxy, use filterHeaders to remove HTTP/2.0 headers, which are invalid in HTTP/1.0.
//If you type no code, elseCallback is executed.
//Below we have example script, which serves dynamic content.
disableEndElseCallbackExecute = true ; //Avoid crashing on async.
var headers = getCustomHeaders ( ) ; //Headers
if ( ! fs . existsSync ( _ _dirname + "/../temp/requestCounter" ) ) {
fs . writeFileSync ( _ _dirname + "/../temp/requestCounter" , "0" ) ; //Reset counter
}
headers [ "Content-Type" ] = 'text/html; charset=utf-8' //HTML output
if ( href == "/hello.svr" ) {
fs . readFile ( _ _dirname + "/../temp/requestCounter" , ( err , data ) => {
if ( err ) throw err ;
var requestCounter = parseInt ( data . toString ( ) ) ; //Counter
fs . writeFile ( _ _dirname + "/../temp/requestCounter" , ( requestCounter + 1 ) . toString ( ) , ( ) => {
//Increase value of counter
} ) ;
res . writeHead ( 200 , "OK" , headers ) ; //Write Head
res . end ( "<html><head><title>SVR.JS ServerSide Test</title></head><body><h1>Hello World!</h1><p>This is a test from server-side JavaScript. This test is executed " + requestCounter . toString ( ) + " times from taking server up." + ( req . headers . origin == undefined ? "" : " This request is done from a proxy." ) + "</p><p><i>SVR.JS/" + configJSON . version + ' (' + os . platform ( ) [ 0 ] . toUpperCase ( ) + os . platform ( ) . slice ( 1 ) + ')' + ( req . headers . host == undefined ? "" : " on " + req . headers . host ) + "</p></body></html>" ) ; //Write response
serverconsole . resmessage ( "Client successfully recieved content." ) ; //Log into SVR.JS
return ; //Prevent SVR.JS from crashing
} ) ;
} else if ( href == "/proxy.svr" ) {
callServerError ( 403 , "SVR.JS-exampleproxy" ) ; //Server error
serverconsole . errmessage ( "Client fails to recieve content." ) ; //Log into SVR.JS
} else if ( href . indexOf ( "/proxy.svr/" ) == 0 ) {
2023-08-18 23:55:36 +02:00
var hn = href . split ( "/" ) [ 2 ] ; //Hostname
if ( hn != "this" && ! ( req . socket . realRemoteAddress ? req . socket . realRemoteAddress : req . socket . remoteAddress ) . match ( /^(?:localhost$|::1$|f[c-d][0-9a-f]{2}:|(?:::ffff:)?(?:(?:127|10)\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}|192\.168\.[0-9]{1,3}\.[0-9]{1,3}|172\.(?:1[6-9]|2[0-9]|3[0-1])\.[0-9]{1,3}\.[0-9]{1,3})$)/i ) ) {
//Prevent open proxy
callServerError ( 403 , "SVR.JS-exampleproxy" ) ; //Server error
serverconsole . errmessage ( "Client fails to recieve content." ) ; //Log into SVR.JS
2023-08-25 00:26:51 +02:00
return ;
2023-08-18 23:55:36 +02:00
}
2023-07-29 20:32:17 +02:00
var hdrs = req . headers ;
2023-08-18 23:55:36 +02:00
hdrs [ "Host" ] = ( hn == "this" ? req . headers . host : hn ) ;
2023-07-29 20:32:17 +02:00
hdrs [ "Origin" ] = ( req . headers . host == undefined ? "" : req . headers . host ) ;
var options = {
2023-08-18 23:55:36 +02:00
hostname : ( hn == "this" ? req . headers . host . split ( ":" ) [ 0 ] : hn . split ( ":" ) [ 0 ] ) ,
port : ( hn == "this" ? req . headers . host . split ( ":" ) [ 1 ] : ( hn . split ( ":" ) [ 1 ] == undefined ? 80 : hn . split ( ":" ) [ 1 ] ) ) ,
path : req . url . replace ( "/proxy.svr/" + hn , "" ) ,
2023-07-29 20:32:17 +02:00
method : req . method ,
headers : filterHeaders ( hdrs )
} ;
var proxy = http . request ( options , function ( sres ) {
res . writeHead ( sres . statusCode , sres . headers )
sres . pipe ( res , {
end : true
} ) ;
} ) ;
proxy . on ( "error" , ( ex ) => {
callServerError ( 500 , "SVR.JS-exampleproxy" , ex . stack ) ; //Server error
serverconsole . errmessage ( "Client fails to recieve content." ) ; //Log into SVR.JS
} ) ;
req . pipe ( proxy , {
end : true
} ) ;
} else {
elseCallback ( ) ; //Load SVR.JS internal callbacks
}