Created
June 18, 2012 20:26
-
-
Save brianloveswords/2950508 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
""" | |
The Web Hammer | |
Usage: | |
webhammer [--requests=<num> --interval=<ms>] <url> | |
Options: | |
-h --help Show this screen. | |
--version Show version. | |
-r <num>, --requests <num> Number of requests to make [default: 15] | |
-i <ms>, --interval <ms> Interval in ms over which to make requests [default: 1000] | |
""" | |
# requirements: | |
# requests: pip install requests | |
# docopt: pip install docopt | |
import multiprocessing as mp | |
import time | |
import requests | |
class Hammer(object): | |
payload = {'html': "<!--webhammer--><html><head><title>I'm a computer</title></head><body>Stop all the downloading</body></html>"} | |
headers = {'user-agent': 'webhammer v0.2'} | |
def __init__(self, nail, interval=1000.0, reqs=15): | |
self.nail = nail | |
self.interval = float(interval) | |
self.reqs = int(reqs) | |
self.rate = self.interval/self.reqs | |
def _doit(self, number=0, started=0): | |
r = requests.post(self.nail, data=self.payload, headers=self.headers) | |
print {'request number': number, | |
'started': started, | |
'finished': time.time(), | |
'status': r.status_code, | |
'headers': r.headers, | |
'body': r.text | |
} | |
def start(self): | |
begin = time.time() | |
procs = [] | |
for i in range(self.reqs): | |
proc = mp.Process(target=self._doit, args=(i,time.time())) | |
proc.start() | |
procs.append(proc) | |
time.sleep(self.rate/1000.0) | |
map(lambda p: p.join(), procs) | |
end = time.time() | |
print "-" * 72 | |
print "attempted %d requests in %f seconds" % (self.reqs, self.interval) | |
print "actual time: %f" % (end - begin) | |
if __name__ == "__main__": | |
from docopt import docopt | |
arguments = docopt(__doc__, version='Webhammer v0.2') | |
nail = arguments.get('<url>') | |
reqs = arguments.get('--requests') | |
interval = arguments.get('--interval') | |
h = Hammer(nail, interval, reqs) | |
print "webhammering on %s" % nail | |
h.start() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment