2017-12-18 280 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