我正在使用带有Python3套接字的基本代理服务器。它可以工作,但不能正常工作。响应标题很好,但是身体不是。 如下所示,响应正文看起来很奇怪“ x1f \ x8b \ x08 \ x00 \ x00 ... etc'”,但是当将其重定向到浏览器时,它会正确呈现。
b"HTTP/1.1 200 OK
Vary: Accept-Encoding\r\n
Content-Encoding: gzip\r\n
Content-Length: 156\r\n
Keep-Alive: timeout=5, max=100\r\n
Connection: Keep-Alive\r\n
Content-Type: text/html\r\n\
r\n\
x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03-\x8e\xcb\x0e\x83 \x14D\xf7|\x05\xb2.\xd5e\xa3\xe8\xda?p\x8d@\x81\xf4\xea5p\xfb\xf0\xef\x8b\xc6\xd5$'\x939\x03h4\x04\xcc\xa4\x02-00\x15\x9c\xb6%(\x12\xb8\x81\x8d\x0e\x00o|\xc2\x04\xb6b\xaa\xbe\xb0\xaa\xaf\xda\x8cv\xe7\xb37\x08\x98z1\x836/Q\xb0\x8d\x1f\x9ei\x07\xd7\x8bE'\x1f\xd7V\xbf\t\xbbo\xb4\x14\xdaG\xd3l\xbf\xae\xd4\xc6\xc8T%\xa5\x8a\x8b\xe79\x99^\x84\xe7}[\xbd\x18\xa4<\x14e\xe4\x88Cq\x1a\xcf\x7f\x7f\x10\x07P@\xb0\x00\x00\x00"
def receive(sock):
sock.settimeout(3)
data=b""
try:
while 1:
rcvd=sock.recv(4096)
if not rcvd:
break
data+=rcvd
except:
pass
return data
然后我使用Burp Suite
来获得相同的响应,并且响应的身体正常。
HTTP/1.1 200 OK
Vary: Accept-Encoding
Content-Length: 176
Connection: close
Content-Type: text/html
localhost<html>
<head>
<title>
Hello, World!
</title>
</head>
<body bgcolor="black">
<div style="margin:auto;width:800px;">
Hi
</div>
</body>
</html>
localhost
个站点(如果存在)但是如果请求的站点不存在,404 not found
就会发生此问题,响应是正常的并且具有清晰且正常的正文。
所以,我想找出问题所在以及解决方法。
答案 0 :(得分:1)
它可以工作,但不能正常工作。响应标题很好,但是身体不是。如下所示,响应主体看起来很奇怪“仅字节'x1f \ x8b \ x08 \ x00 \ x00 ... etc'”,
身体很好,只有您不明白它很好:
b"HTTP/1.1 200 OK
...
Content-Encoding: gzip\r\n
...
x1f\x8b\x08\x00\x00\x0...
如在响应标头中所示,内容使用gzip压缩。要看到您期望的“真实”主体,您需要使用gzip解压缩它。如果您不希望这样做,则不要在请求标头中发送Accept-Encoding: gzip ...
或类似字段,因为这明确表明您愿意接受gzip
压缩内容。
通常:HTTP比看几个示例可能要复杂的多。除了压缩以外,还有其他通常无法预料的事情,例如分块传输编码以及同一TCP连接中的多个请求和响应。请研究HTTP标准以获取更多信息,而不仅仅是“假设”-这就是这些标准的真正目的。