我正在发送带有套接字的POST请求,并尝试对接收到的HTML进行解码并打印到终端。
这在我最初的GET请求中可以正常工作,但是当我尝试解码并打印POST请求时,我得到的是乱码。
如何更改我的解码方式,使文本可读?
POST
body = "hash="+md5
headers = """\
POST / HTTP/1.1\r
Host: url.com:57555\r
User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.14; rv:66.0) Gecko/20100101 Firefox/66.0\r
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8\r
Accept-Language: en-US,en;q=0.5\r
Accept-Encoding: gzip, deflate\r
Referer: http://url.com:57555/\r
Content-Type: application/x-www-form-urlencoded\r
Content-Length: 32\r
Connection: close\r
Cookie: PHPSESSID=some_cookie\r
Upgrade-Insecure-Requests: 1\r
\r\n"""
payload = headers + body
s.sendall(payload.encode('utf-8'))
res = s.recv(4096)
print(str(res, errors='replace'))
结果...
python3 emdee5.py
HTTP/1.1 200 OK
Date: Sun, 26 May 2019 22:01:26 GMT
Server: Apache/2.4.18 (Ubuntu)
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate
Pragma: no-cache
Vary: Accept-Encoding
Content-Encoding: gzip
Content-Length: 282
Connection: close
Content-Type: text/html; charset=UTF-8
]�1o� ���
ʒ��Ҩ��b�V��LN��
p�$����Py��d��FP��l� ^�֞i�ĜmA��F7i�zd}��VͩK8}ߠ���!�n�W>�wL9ۅr�@Ȑ����� 4i��ec{"%��0���)������W���A�I��"��GD�;�܉"J��JA}x��l1��3٠.y�>Om�#5��9
��ڨ�p�j����JN���MQ̀)�:�p�P{K���4J^-��+�7�oV'E;'=�����l�
答案 0 :(得分:1)
您的请求明确表明您愿意接受压缩的响应:
Accept-Encoding: gzip, deflate\r
因此,这就是您在响应中得到的结果
Content-Encoding: gzip
因此,主体使用gzip压缩(这解释了乱码的输出),您需要将其解压缩。鉴于您当前似乎无法正确处理压缩后的响应,因此不应在请求中声明您支持这些响应,即删除Accept-Encoding
。
除此以外,您的请求还可能有错误:
body = "hash="+md5
...
Content-Length: 32\r
...
payload = headers + body
...
鉴于md5是32个字符的十六进制(或16字节二进制),由body
组成的"hash"=+md5
很可能不是32个字符,只要您在Content-Length
中声明即可。
POST / HTTP/1.1\r
此外,您还会发送HTTP / 1.1请求,因此您必须能够处理分块的响应-但是您的代码无法处理这些响应。
res = s.recv(4096)
类似地,您的代码盲目地假设可以在单个recv
中检索完整的响应,而不必如此。
总结:除非您对HTTP的工作原理有更深入的了解(您似乎没有),否则建议您使用现有的库来为您处理HTTP,因为这些库是由了解以下内容的开发人员编写的HTTP。
即使您已经对HTTP有所了解,您仍然可能会使用这些库,因为您将知道HTTP并非无关紧要的,并且通过以下方式实现所有必要的细节和边缘情况是没有意义的如果健壮的东西已经存在,请自己编写代码。