Skip to content

Instantly share code, notes, and snippets.

@narze
Created October 1, 2015 09:59
Show Gist options
  • Save narze/a9cef48a57490bdaf30b to your computer and use it in GitHub Desktop.
Save narze/a9cef48a57490bdaf30b to your computer and use it in GitHub Desktop.
@if (@X)==(@Y) @end /* JScript comment
@echo off
rem :: the first argument is the script name as it will be used for proper help message
cscript //E:JScript //nologo "%~f0" "%~nx0" %*
exit /b %errorlevel%
@if (@X)==(@Y) @end JScript comment */
var url = "http://192.168.0.178/open" // change this url to your needs
var ARGS = WScript.Arguments;
var scriptName=ARGS.Item(0);
var saveTo="";
var user=0;
var pass=0;
var proxy=0;
var bypass=0;
var proxy_user=0;
var proxy_pass=0;
var certificate=0;
var force=true;
var body="";
//ActiveX objects
var WinHTTPObj = new ActiveXObject("WinHttp.WinHttpRequest.5.1");
var FileSystemObj = new ActiveXObject("Scripting.FileSystemObject");
var AdoDBObj = new ActiveXObject("ADODB.Stream");
// HttpRequest SetCredentials flags.
var proxy_settings=0;
//
HTTPREQUEST_SETCREDENTIALS_FOR_SERVER = 0;
HTTPREQUEST_SETCREDENTIALS_FOR_PROXY = 1;
//timeouts and their default values
var RESOLVE_TIMEOUT = 0;
var CONNECT_TIMEOUT = 90000;
var SEND_TIMEOUT = 90000;
var RECEIVE_TIMEOUT = 90000;
//HttpRequestMethod
var http_method='GET';
//header
var header_file="";
//report
var reportfile="";
//test-this:
var use_stream=false;
//autologon policy
var autologon_policy=1; //0,1,2
//headers will be stored as multi-dimensional array
var headers=[];
//user-agent
var ua="";
//escape URL
var escape=false;
function printHelp(){
WScript.Echo(scriptName + " - sends HTTP request and saves the request body as a file and/or a report of the sent request");
WScript.Echo(scriptName + " url [-force yse|no] [-user username -password password] [-proxy proxyserver:port] [-bypass bypass_list]");
WScript.Echo(" [-proxyuser proxy_username -proxypassword proxy_password] [-certificate certificateString]");
WScript.Echo(" [-method GET|POST|PATCH|DELETE|HEAD|OPTIONS|CONNECT]");
WScript.Echo(" [-saveTo file] - to print response to console use con");
WScript.Echo(" [-sendTimeout int(milliseconds)]");
WScript.Echo(" [-resolveTimeout int(milliseconds)]");
WScript.Echo(" [-connectTimeout int(milliseconds)]");
WScript.Echo(" [-receiveTimeout int(milliseconds)]");
WScript.Echo(" [-autologonPolicy 1|2|3]");
WScript.Echo(" [-proxySettings 1|2|3] (https://msdn.microsoft.com/en-us/library/windows/desktop/aa384059(v=vs.85).aspx)");
//header
WScript.Echo(" [-headers-file header_file]");
//reportfile
WScript.Echo(" [-reportfile reportfile]");
WScript.Echo(" [-ua user-agent]");
WScript.Echo(" [-ua-file user-agent-file]");
WScript.Echo(" [-escape yes|no]");
WScript.Echo(" [-body body-string]");
WScript.Echo(" [-body-file body-file]");
WScript.Echo("-force - decide to not or to overwrite if the local files exists");
WScript.Echo("proxyserver:port - the proxy server");
WScript.Echo("bypass- bypass list");
WScript.Echo("proxy_user , proxy_password - credentials for proxy server");
WScript.Echo("user , password - credentials for the server");
WScript.Echo("certificate - location of SSL certificate");
WScript.Echo("method - what HTTP method will be used.Default is GET");
WScript.Echo("saveTo - save the responce as binary file");
WScript.Echo(" ");
WScript.Echo("Header file should contain key:value pairs.Lines starting with \"#\" will be ignored.");
WScript.Echo("value should NOT be enclosed with quotes");
WScript.Echo(" ");
WScript.Echo("Examples:");
WScript.Echo(scriptName +" http://somelink.com/somefile.zip -saveTo c:\\somefile.zip -certificate \"LOCAL_MACHINE\\Personal\\My Middle-Tier Certificate\"");
WScript.Echo(scriptName +" http://somelink.com/something.html -method POST -certificate \"LOCAL_MACHINE\\Personal\\My Middle-Tier Certificate\" -header c:\\header_file -reportfile c:\\reportfile.txt");
WScript.Echo(scriptName +"\"http://somelink\" -method POST -header hdrs.txt -reportfile reportfile2.txt -saveTo responsefile2 -ua \"Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2228.0 Safari/537.36\" -body-file some.json");
}
function parseArgs(){
for (var i=2;i<ARGS.Length-1;i=i+2){
var arg=ARGS.Item(i).toLowerCase();
var next=ARGS.Item(i+1);
try { switch(arg) { // the try-catch is set mainly because of the parseInts
case "-force":
if (next == "no") {
force = false;
}
break;
case "-escape":
if (next == "yes") {
escape = true;
}
break;
case "-saveto":
saveTo=next;
break;
case "-user":
user=next;
break;
case "-proxy":
proxy=next;
break;
case "-bypass":
bypass=next;
break;
case "-proxyyser":
proxy_user=next;
break;
case "-proxypassword":
proxy_pass=next;
break;
case "-ua":
ua=next;
break;
case "-ua-file":
ua=readFile(next);
break;
case "-body":
body=next;
break;
case "-usestream":
//WScript.Echo("~~");
if(next.toLowerCase()==="yes"){use_stream=true};
break;
case "-body-file":
body=readFile(next);
break;
case "-certificate":
certificate=next;
break;
case "-method":
switch (next.toLowerCase()){
case "post":
http_method='POST';
break;
case "get":
http_method='GET';
break;
case "head":
http_method='HEAD';
break;
case "put":
http_method='PUT';
break;
case "options":
http_method='OPTIONS';
break;
case "connect":
http_method='CONNECT';
break;
case "patch":
http_method='PATCH';
break;
case "delete":
http_method='DELETE';
break;
default:
WScript.Echo("Invalid http method passed " + next);
WScript.Echo("possible values are GET,POST,DELETE,PUT,CONNECT,PATCH,HEAD,OPTIONS");
WScript.Quit(1326);
break;
}
break;
case "-headers-file":
case "-header":
headers=readPropFile(next);
break;
case "-reportfile":
reportfile=next;
break;
//timeouts
case "-sendtimeout":
SEND_TIMEOUT=parseInt(next);
break;
case "-connecttimeout":
CONNECT_TIMEOUT=parseint(next);
break;
case "-resolvetimeout":
RESOLVE_TIMEOUT=parseInt(next);
break;
case "-receivetimeout":
RECEIVE_TIMEOUT=parseInt(next);
break;
case "-autologonpolicy":
autologon_policy=parseInt(next);
if (autologon_policy>2||autologon_policy<0) {
WScript.Echo("out of autologon policy range");
WScript.Quit(87);
};
break;
case "-proxysettings":
proxy_settings=parseInt(next);
if (proxy_settings>2||proxy_settings<0){
WScript.Echo("out of proxy settings range");
WScript.Quit(87);
};
break;
default:
WScript.Echo("Invalid command line switch: "+arg);
WScript.Quit(1405);
break;
}} catch (err){
WScript.Echo(err.message);
WScript.Quit(1348);
}
}
}
stripTrailingSlash = function(path){
while (path.substr(path.length - 1,path.length) == '\\') {
path=path.substr(0, path.length - 1);
}
return path;
}
function existsItem(path){
return FileSystemObj.FolderExists(path)||FileSystemObj.FileExists(path);
}
function deleteItem(path){
if (FileSystemObj.FileExists(path)){
FileSystemObj.DeleteFile(path);
return true;
} else if (FileSystemObj.FolderExists(path) ) {
FileSystemObj.DeleteFolder(stripTrailingSlash(path));
return true;
} else {
return false;
}
}
//-------------------------------
//----------------------
//----------
//-----
//--
function request( url){
if (proxy!=0 && bypass!=0 ) {
WinHTTPObj.SetProxy(proxy_settings,proxy,bypass);
}
if (proxy!=0 ) {
WinHTTPObj.SetProxy(proxy_settings,proxy);
}
if (user!=0 && pass!=0){
WinHTTPObj.SetCredentials(user,pass,HTTPREQUEST_SETCREDENTIALS_FOR_SERVER);
}
if (proxy_user!=0 && proxy_pass!=0 ) {
WinHTTPObj.SetCredentials(proxy_user,proxy_pass,HTTPREQUEST_SETCREDENTIALS_FOR_PROXY );
}
if(certificate!=0) {
WinHTTPObj.SetClientCertificate(certificate);
}
//set autologin policy
WinHTTPObj.SetAutoLogonPolicy(autologon_policy);
//set timeouts
WinHTTPObj.SetTimeouts(RESOLVE_TIMEOUT,CONNECT_TIMEOUT,SEND_TIMEOUT,RECEIVE_TIMEOUT);
try {
WinHTTPObj.Open(http_method,url,false);
if (headers.length!==0){
WScript.Echo("Sending with headers:");
for (var i=0;i<headers.length;i++){
WinHTTPObj.SetRequestHeader(headers[i][0],headers[i][1]);
WScript.Echo(headers[i][0]+":"+headers[i][1]);
}
WScript.Echo("");
}
if (ua !== ""){
//user-agent option from:
//WinHttpRequestOption enumeration
// other options can be added like bellow
//https://msdn.microsoft.com/en-us/library/windows/desktop/aa384108(v=vs.85).aspx
WinHTTPObj.Option(0)=ua;
}
if(escape){
WinHTTPObj.Option(3)=true;
}
if (trim(body) === ""){
WinHTTPObj.Send();
}else{
WinHTTPObj.Send(body);
}
var status=WinHTTPObj.Status
} catch (err) {
WScript.Echo(err.message);
WScript.Quit(666);
}
////////////////////////
// report //
////////////////////////
if(reportfile!="" ) {
//var report_string="";
var n="\r\n";
var report_string="Status:"+n;
report_string=report_string+" "+WinHTTPObj.Status;
report_string=report_string+" "+WinHTTPObj.StatusText+n;
report_string=report_string+" "+n;
report_string=report_string+"Response:"+n;
report_string=report_string+WinHTTPObj.ResponseText+n;
report_string=report_string+" "+n;
report_string=report_string+"Headers:"+n;
report_string=report_string+WinHTTPObj.GetAllResponseHeaders()+n;
WinHttpRequestOption_UserAgentString = 0; // Name of the user agent
WinHttpRequestOption_URL = 1; // Current URL
WinHttpRequestOption_URLCodePage = 2; // Code page
WinHttpRequestOption_EscapePercentInURL = 3; // Convert percents
// in the URL
// rest of the options can be seen and eventually added using this as reference
// https://msdn.microsoft.com/en-us/library/windows/desktop/aa384108(v=vs.85).aspx
report_string=report_string+"URL:"+n;
report_string=report_string+WinHTTPObj.Option(WinHttpRequestOption_URL)+n;
report_string=report_string+"URL Code Page:"+n;
report_string=report_string+WinHTTPObj.Option(WinHttpRequestOption_URLCodePage)+n;
report_string=report_string+"User Agent:"+n;
report_string=report_string+WinHTTPObj.Option(WinHttpRequestOption_UserAgentString)+n;
report_string=report_string+"Escapped URL:"+n;
report_string=report_string+WinHTTPObj.Option(WinHttpRequestOption_EscapePercentInURL)+n;
prepareateFile(force,reportfile);
WScript.Echo("Writing report to "+reportfile);
writeFile(reportfile,report_string);
}
switch(status){
case 200:
WScript.Echo("Status: 200 OK");
break;
default:
WScript.Echo("Status: "+status);
WScript.Echo("Status was not OK. More info -> https://en.wikipedia.org/wiki/List_of_HTTP_status_codes");
}
//if as binary
if (saveTo.toLowerCase() === "con") {
WScript.Echo(WinHTTPObj.ResponseText);
}
if (saveTo !== "" && saveTo.toLowerCase() !== "con"){
prepareateFile(force,saveTo);
try {
if(use_stream){
writeBinFile(saveTo,WinHTTPObj.ResponseStream );
} else {
writeBinFile(saveTo,WinHTTPObj.ResponseBody);
}
} catch (err) {
WScript.Echo("Failed to save the file as binary.Attempt to save it as text");
AdoDBObj.Close();
prepareateFile(true,saveTo);
writeFile(saveTo,WinHTTPObj.ResponseText);
}
}
WScript.Quit(status);
}
//--
//-----
//----------
//----------------------
//-------------------------------
function prepareateFile(force,file){
if (force && existsItem(file)){
if(!deleteItem(file)){
WScript.Echo("Unable to delete "+ file);
WScript.Quit(8);
}
}else if (existsItem(file)){
WScript.Echo("Item " + file + " already exist");
WScript.Quit(9);
}
}
function writeBinFile(fileName,data ){
AdoDBObj.Type = 1;
AdoDBObj.Open();
AdoDBObj.Position=0;
AdoDBObj.Write(data);
AdoDBObj.SaveToFile(fileName,2);
AdoDBObj.Close();
}
function writeFile(fileName,data ){
AdoDBObj.Type = 2;
AdoDBObj.CharSet = "iso-8859-1";
AdoDBObj.Open();
AdoDBObj.Position=0;
AdoDBObj.WriteText(data);
AdoDBObj.SaveToFile(fileName,2);
AdoDBObj.Close();
}
function readFile(fileName){
//check existence
try {
if (!FileSystemObj.FileExists(fileName)){
WScript.Echo("file " + fileName + " does not exist!");
WScript.Quit(13);
}
if (FileSystemObj.GetFile(fileName).Size === 0){
return "";
}
var fileR=FileSystemObj.OpenTextFile(fileName,1);
var content=fileR.ReadAll();
fileR.Close();
return content;
} catch(err){
WScript.Echo("Error while reading file: "+fileName);
WScript.Echo(err.message);
WScript.Echo("Will return empty string");
return "";
}
}
function readPropFile(fileName){
//check existence
resultArray=[];
if (!FileSystemObj.FileExists(fileName)){
WScript.Echo("(headers)file " + fileName + " does not exist!");
WScript.Quit(15);
}
if (FileSystemObj.GetFile(fileName).Size === 0){
return resultArray;
}
var fileR=FileSystemObj.OpenTextFile(fileName,1);
var line="";
var k="";
var v="";
var lineN=0;
var index=0;
try {
WScript.Echo("parsing headers form "+fileName+" property file ");
while(!fileR.AtEndOfStream){
line=fileR.ReadLine();
lineN++;
index=line.indexOf(":");
if(line.indexOf("#") === 0 || trim(line)==="") {
continue;
}
if(index=== -1 || index === line.length-1 || index === 0) {
WScript.Echo("Invalid line "+ lineN);
WScript.Quit(93);
}
k=trim(line.substring(0,index));
v=trim(line.substring(index+1,line.length));
resultArray.push([k,v]);
}
fileR.Close();
return resultArray;
}catch (err){
WScript.Echo("Error while reading headers file: "+fileName);
WScript.Echo(err.message);
WScript.Echo("Will return empty array");
return resultArray;
}
}
function trim(str){
return str.replace(/^\s+/,'').replace(/\s+$/,'');
}
function main(){
parseArgs();
request(url);
}
main();
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment