Skip to content

Instantly share code, notes, and snippets.

@brianloveswords
Created June 18, 2012 20:26
Show Gist options
  • Save brianloveswords/2950508 to your computer and use it in GitHub Desktop.
Save brianloveswords/2950508 to your computer and use it in GitHub Desktop.
"""
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