如何使用Python发出大型HTTP(S)请求?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何使用Python发出大型HTTP(S)请求?相关的知识,希望对你有一定的参考价值。

编辑:我将问题扩展到HTTPS。 “S”部分还没有解决,我真的不需要它,但对其他人来说可能很有趣。

我想做相同的

hdr='GET / HTTP/1.1
Content-Length: 10000000000

'
(echo -en "$hdr"; dd if=/dev/zero bs=1000000 count=999; read tmp) | nc $SOME_IP 80

用Python 2.7。如果可能的话,我想只使用标准库加上requestssockets模块。

仅供参考,上面的脚本向$SOME_IP发送一个大的HTTP请求(~1GB的零),而不会对发送者RAM造成严重影响。

答案

像这样的东西?

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
Content-Length: %s

' % get_content_length()
s.sendall(hdr)
for chunk in yield_content():
    s.sendall(chunk)
# should I wait for the response?
另一答案

这是我做的东西,似乎工作:

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
Content-Length: 10000000000

')
    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的答案当然更加跨平台,因为它不需要/dev/null

以上是关于如何使用Python发出大型HTTP(S)请求?的主要内容,如果未能解决你的问题,请参考以下文章

了解 Python HTTP 流

如何在 robobrowser-python 中发出 POST 请求

更改 python 请求中的引用 URL

使用 SOCKS 代理发出 HTTP 请求

“无法为从窗口上下文发出的同步 http(s) 请求设置 XMLHttpRequest.timeout”是啥意思?

ajax如何请求python接口