如何通过Python中的HTTP代理将客户端连接到服务器?

时间:2016-10-09 20:57:10

标签: python sockets proxy server client

我真的很擅长使用套接字进行编码。

我喜欢套接字库,我了解程序中发生的很大一部分,所以我不介意我想坚持使用它。

正如标题所说,我有一个基于套接字的客户端和服务器,我想通过HTTP代理交换内容(我使用的是Squid代理)。这段小代码应该绕过校园中的代理来模拟校园网络上的聊天。这是完全合法的,因为我问那些在那里工作的IT人员。

这是交易,我能够通过代理向我的服务器发送POST请求,接收它并将其发送回客户端1,但是当我尝试向代理发送更多请求时,他们都没有到达服务器所以我认为连接已经死了但是就是这样,当我从客户端2发送直接连接到服务器的消息时,服务器和客户端1接收它们。

import socket
from _thread import *

def sender(server,h):
    b=input("<<--Send--")
    b=h
    server.send(b.encode())

PROXY_IP="127.0.0.1"
PROXY_PORT=3128
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.settimeout(0.05)
server.connect((PROXY_IP,PROXY_PORT))

header="""POST http://127.0.0.1:3001 HTTP/1.1\r\n
Host: 127.0.0.1:3001\r\n
Proxy-Connection: keep-alive\r\n
Content-Length: 5 \r\n\r\n
hello\r\n"""

server.send(header.encode())

while 1:
    try:
        start_new_thread(sender,(server,header))
        a=server.recv(1024)
        print("-->>{}".format(a.decode()))
    except KeyboardInterrupt:
        break
    except:
        pass

server.close()

我已经尝试过完美的CONNECT方法,但我的校园网络代理不允许这样做。 我究竟做错了什么 ? 关于如何通过代理重新发送内容,我应该知道些什么吗? 谢谢你的时间,请耐心等待。

以下是我在客户端上向代理发送请求的内容:

~#Sent : POST http://127.0.0.1:3001 HTTP/1.1
Host: 127.0.0.1:3001
Proxy-Connection: keep-alive
Content-Length: 5 

hello

#Received : HTTP/1.1 200 OK
Server: squid/3.5.19
Mime-Version: 1.0
Date: Mon, 10 Oct 2016 00:46:39 GMT
X-Transformed-From: HTTP/0.9
X-Cache: MISS from kali
X-Cache-Lookup: MISS from kali:3128
Transfer-Encoding: chunked
Via: 1.1 kali (squid/3.5.19)
Connection: keep-alive


#Received : B2
POST / HTTP/1.1
Content-Length: 5
Host: 127.0.0.1:3001
Via: 1.1 kali (squid/3.5.19)
X-Forwarded-For: 127.0.0.1
Cache-Control: max-age=259200
Connection: keep-alive

hello


#Sent : POST http://127.0.0.1:3001 HTTP/1.1
Host: 127.0.0.1:3001
Proxy-Connection: keep-alive
Content-Length: 5 

hello

此后没有收到......

1 个答案:

答案 0 :(得分:0)

[8, 3]

正如您在POST http://127.0.0.1:3001 HTTP/1.1\r\n Host: 127.0.0.1:3001\r\n Proxy-Connection: keep-alive\r\n Content-Length: 5 \r\n\r\n hello\r\n 中所述,您的HTTP响应正文包含7个字节而不是5个字节。 5字节后的Content-length仍然属于响应主体。给出错误的大小可能会混淆请求处理,即代理期望新请求但实际上是\r\n,即5个字节之后的2个字节\r\n

除此之外,路径和Content-length标头必须包含代理角度的目标名称。使用127.0.0.1。在您的示例中,您将尝试访问代理的同一主机上的服务器,即代理视图中的localhost。这可能不是你想要的。

Host

代理响应中的此标头表示您的服务器未正确说出HTTP / 1.x.它不是发送HTTP头和主体,而是只返回没有任何HTTP头的有效载荷,就像在20年前废弃的HTTP 0.9协议中所做的那样。使用HTTP 0.9,响应将始终仅在TCP连接结束时结束。这意味着您不能在同一TCP连接中拥有多个请求。

  

我真的很擅长使用套接字进行编码。

问题不是由于错误使用套接字引起的,而是由于应用程序协议的错误实现,即数据通过套接字发送。如果您确实需要实施HTTP,请研究标准,即RFC 7230及以下。如果您不想这样做,请使用现有的和经过测试的HTTP库,而不是自己编写。