2017-12-18 231 views
0

编辑:我将问题扩展到HTTPS。 “S”部分尚未解决,我不需要它,但它可能对其他人很有意思。如何使用Python制作一个很大的HTTP(S)请求?

我想与Python 2.7做的

hdr='GET/HTTP/1.1\r\nContent-Length: 10000000000\r\n\r\n' 
(echo -en "$hdr"; dd if=/dev/zero bs=1000000 count=999; read tmp) | nc $SOME_IP 80 

相当。如果可能的话,我只想使用标准库加上requestssockets模块。上述脚本向$SOME_IP发送一个大的HTTP请求(〜1GB的零),而不会对发送方RAM产生负担。

+0

只是出于好奇:对于HTTPS,同样的事情会很有趣。 – JCGB

回答

0

像这样的东西?

import socket 

def get_content_length(): 
    return 10000000000 

def get_chunk_size(): 
    return 1000000 

def yield_content(): 
    total_size = get_content_length() 
    chunk_size = get_chunk_size() 
    current_size = 0 
    end = total_size - chunk_size 
    chunk = '\x00' * chunk_size 
    while current_size < end: 
     yield chunk 
     current_size += chunk_size 
    yield chunk[:total_size - current_size] 

s = socket.socket() 
s.connect((host, port)) 
hdr='GET/HTTP/1.1\r\nContent-Length: %s\r\n\r\n' % get_content_length() 
s.sendall(hdr) 
for chunk in yield_content(): 
    s.sendall(chunk) 
# should I wait for the response? 
+0

就是这样,谢谢。请参阅我的答案,以了解我在此期间制作的内容。 – JCGB

0

以下是我熟起来,似乎工作:

import sys, socket 

def flood(hostname, port, count=1): 
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
    s.connect((hostname, port)) 
    s.sendall('GET/HTTP/1.1\r\nContent-Length: 10000000000\r\n\r\n') 
    with open('/dev/zero', 'rb',) as data: 
     for _ in xrange(count): 
      s.sendall(data.read(1000000)) 
    s.shutdown(socket.SHUT_WR) 
    while True: 
     data = s.recv(1024) 
     if data == "": 
      break 
     print("Received:", repr(data)) 
    print("Connection closed.") 
    s.close() 

通过freakish答案当然是更多的跨plattform,因为它不需要/dev/null