|
#!/usr/bin/env node |
|
var sys = require("util"); |
|
var http = require("http"); |
|
var request = require("request"); |
|
var moment = require("moment"); |
|
|
|
var time_offset = null; |
|
|
|
// this is what you'll be testing |
|
var host = process.argv[2]; |
|
var port = 80; |
|
var regex = /"GET (\S+)/; |
|
var time_regex = /\[([^\]]+)\]/; |
|
var time_format = "DD/MMM/YYYY:H:mm:ss ZZ"; |
|
|
|
//open stdin |
|
process.stdin.resume(); |
|
process.stdin.setEncoding('utf8'); |
|
var data = ''; |
|
|
|
var jar = request.jar(); |
|
//uncomment and add a cookie to test logged in |
|
//jar.add(request.cookie("sessionid=COOKIE HERE")); |
|
|
|
//split into lines and async |
|
process.stdin.on('data', function (chunk) { |
|
var foo = data + chunk; |
|
var lines = foo.split('\n'); |
|
data = lines.pop(); |
|
lines.forEach( function(line) { |
|
delay = get_delay(line); |
|
if(delay) { |
|
setTimeout(function() {make_request(line);}, delay); |
|
console.log("delaying: " + delay); |
|
} |
|
}); |
|
}); |
|
|
|
var get_delay = function get_delay(line){ |
|
var match = time_regex.exec(line); |
|
if(match) { |
|
file_time = moment(match[1], time_format).valueOf(); |
|
// this may happen more than once but it shouldn't hurt |
|
// this breaks streaming live files too |
|
if(!time_offset){ |
|
var offset = moment().valueOf() - file_time; |
|
// will break if we try to play logs from the future. |
|
time_offset = (offset < 1) ? 0 : offset; |
|
console.log("SETTING START OFFSET TO " + time_offset); |
|
return 1; |
|
} |
|
var delay = file_time + time_offset - moment().valueOf(); |
|
return (delay < 1) ? 1 : delay; |
|
} |
|
}; |
|
|
|
|
|
|
|
|
|
//make sure the line is a request, extract the url and make it |
|
var make_request = function make_request (line) { |
|
var match = regex.exec(line); |
|
if(match) { |
|
var url = match[1]; |
|
url = "http://" + host + url; |
|
//console.log("Making request to: " + url); |
|
request({url: url, jar: jar }, function(err, resp, body){ |
|
if(err) {console.log(err);} |
|
console.log('URL: '+ url + " STATUS: " + resp.statusCode); |
|
//console.log('BODY: ' + body); |
|
}); |
|
} |
|
} |