Python3 не может декодировать результат POST-запроса - PullRequest
0 голосов
/ 27 мая 2019

Я отправляю запрос POST с сокетами и пытаюсь декодировать полученный HTML и печатать на терминал.

Это прекрасно работает в моем первоначальном запросе GET, но когда я пытаюсь декодировать и распечатать запрос POST, япросто получить искаженный текст.

Как я могу изменить свой декодер, чтобы текст был читабелен?

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�

1 Ответ

1 голос
/ 27 мая 2019

В вашем запросе прямо сказано, что вы готовы принять сжатый ответ:

 Accept-Encoding: gzip, deflate\r

И, следовательно, это то, что вы получите в ответе

Content-Encoding: gzip

Итак, телосжатый с помощью gzip (который объясняет искаженный вывод), и вам нужно будет распаковать его.Учитывая, что вы в настоящее время, похоже, не можете правильно обрабатывать сжатые ответы, вы не должны указывать в своем запросе, что вы поддерживаете их, то есть удалить Accept-Encoding.

Кроме этого, скорее всего, неправильно сВаш запрос:

body = "hash="+md5
...
Content-Length: 32\r
...
payload = headers + body
...

Учитывая, что md5 - это шестнадцатеричное (или 16-байтовое) двоичное число из 32 символов, body, состоящий из "hash"=+md5, вероятно, не имеет длину 32 символа, как вы заявляете в своем Content-Length.

POST / HTTP/1.1\r

Кроме того, вы отправляете запрос HTTP / 1.1, чтобы иметь возможность обрабатывать фрагментированные ответы, но ваш код не обрабатывает их.

res = s.recv(4096)

Аналогично, ваш код вслепую предполагает, что полный ответ может быть получен в течение одного recv, что не обязательно должно иметь место.

В итоге: если у вас нет более глубокогоДля понимания того, как работает HTTP (чего у вас, похоже, нет), рекомендуется использовать существующие библиотеки для обработки HTTP для вас, поскольку они были написаны разработчиками, которые понимают HTTP.
И даже если у вас уже есть понимание HTTP, вы, вероятно, все равно будете использовать эти библиотеки, так как будете знать, что HTTP далеко не тривиален и что нет смысла самостоятельно реализовывать все необходимые детали и крайние случаив вашем коде, если что-то надежное уже существует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...