为什么我在执行时出现"HTTP/1.1 400 Bad Request"错误?



所以我想(通过代理(向网站发送请求。。脚本看起来是这样的,它是用python中的套接字库制作的:

import socket
TargetDomainName="www.stackoverflow.com"
TargetIP="151.101.65.69"
TargetPort=80
ProxiesIP=["107.151.182.247"]
ProxiesPort=[80]
Connect=f"CONNECT {TargetDomainName} HTTP/1.1"
Connection=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Connection.connect((ProxiesIP[0],ProxiesPort[0]))
Connection.sendto(str.encode(Connect),(TargetIP, TargetPort))
Connection.sendto(("GET /" + TargetIP + " HTTP/1.1rn").encode('ascii'), (TargetIP, TargetPort))
Connection.sendto(("Host: " + ProxiesIP[0] + "rnrn").encode('ascii'), (TargetIP, TargetPort))
print (Connection.recv(1028))
Connection.close()

我的问题是,为什么我得到400坏的请求错误?

您没有指明400回复来自代理服务器还是目标服务器。但是你的两个命令都是错误的。

  • 您的CONNECT命令缺少一个端口号、一个Host标头(因为您请求的是HTTP 1.1(,以及用于正确终止命令的换行符。

  • 您的GET命令将发送到目标服务器(如果CONNECT成功(,并且不应按IP地址请求资源。它还发送了错误的Host标头值。该命令是相对于目标服务器的,因此需要指定目标服务器的主机名。

此外,您应该使用send()/sendall()而不是sendto()

试试类似的东西:

import socket
TargetDomainName="www.stackoverflow.com"
TargetIP="151.101.65.69"
TargetPort=80
ProxiesIP=["107.151.182.247"]
ProxiesPort=[80]
Connection=socket.socket(socket.AF_INET, socket.SOCK_STREAM)
Connection.connect((ProxiesIP[0], ProxiesPort[0]))
Connection.sendall((f"CONNECT {TargetDomainName}:{TargetPort} HTTP/1.1rn").encode("ascii"))
Connection.sendall((f"Host: {TargetDomainName}:{TargetPort}rnrn").encode("ascii"))
print (Connection.recv(1028))
Connection.sendall(("GET / HTTP/1.1rn").encode('ascii'))
Connection.sendall((f"Host: {TargetDomainName}rn").encode('ascii'))
Connection.sendall(("Connection: closernrn").encode('ascii'))
print (Connection.recv(1028))
Connection.close()

在发送GET命令之前,您确实需要阅读代理的回复。代理将发送自己的HTTP回复,指示是否成功连接到目标服务器。

不过,您真的不应该手动实现HTTP,Python有很多HTTP库可以为您处理这些细节。Python甚至内置了一个:http.client

最新更新