Python - 发送“不完整”的GET请求

4

我在阅读关于部分GET请求的内容,这会使服务器在一段时间后超时连接。如何发送部分GET请求?

import socket, sys
host = sys.argv[1]

request = "GET / HTTP/1.1\nHost: "+host+"\n\nUser-Agent:Mozilla 5.0\n" #How could I make this into a partial request?

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 80))
s.sendto(request, (host, 80))
response = s.recv(1024)

我该怎么做呢?

为什么你不使用像urllibrequests这样的模块呢? - falsetru
我一开始是这样做的,但我想展示“GET”,这样人们就可以更好地理解它是一个GET请求。 - Shane
2个回答

1
我认为你混淆了部分请求和不完整的请求:
  • 部分请求:请求资源的一部分,即范围请求,如falsetru的答案中所示。这不会导致超时,而是会响应代码206和您请求的资源的一部分。
  • 不完整的请求:您的请求不完整,服务器无法处理,因此它将等待请求的其余部分,并在一段时间后超时(如果未收到请求)。在您的问题中,您已经有了这样一个不完整的请求,因为您没有正确完成请求(它必须以 \ r \ n \ r \ n 而不是单个 \ n 结尾)。其他方法只是进行TCP连接而不发送任何数据,或者进行带有内容长度的POST请求,然后不发送与请求头中指定的数据量相同的数据。

那就意味着我发出的GET请求将在大约400秒后超时,对吗? - Shane
1
这个超时速度将取决于服务器的配置。通常,负载高的服务器会相当快地超时未完成的请求,以对抗拒绝服务攻击的尝试。 - Steffen Ullrich
我该如何在POST请求中实现这个功能? - Shane
1
类似于GET,只是不发送完整请求。一种方法是将内容长度设置为100,但仅提供50字节的内容或类似的内容。 - Steffen Ullrich

0

HTTP头部结束得太早了。(\n\n应该在内容之前,头部之后)

import socket, sys
host = sys.argv[1]

request = "GET / HTTP/1.1\nHost: "+host+"\nUser-Agent:Mozilla 5.0\n\n"

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((host, 80))
s.send(request)
response = s.recv(1024)

如果您想要进行部分内容检索,可以指定Range header

"GET / HTTP/1.1\nHost: "+host+"\nUser-Agent:Mozilla 5.0\rRange: bytes=0-999\n\n"

注意

作为行尾,应该使用\r\n而不是\n,即使大多数(但不是全部)服务器也接受\n


2
应该使用\r\n而不是\n作为行尾,即使大多数服务器也接受\n - Steffen Ullrich
@SteffenUllrich,感谢您的评论。我已将您的评论添加到答案中。可以吗? - falsetru

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接