Weird Response - тело прокси-сервера Python, использующего модуль socket - PullRequest
0 голосов
/ 07 июля 2019

Проблема

Я работаю на базовом прокси-сервере с сокетами Python3.Это работает, но не так, как должно работать.Заголовки ответа в порядке, а тело нет.Как показано ниже, тело ответа выглядит странно: «Всего байтов» x1f \ x8b \ x08 \ x00 \ x00 ... и т. Д. », Но при перенаправлении в браузер оно отображается правильно.

Полученный ответ с сокетом

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 Ответ нормальный и имеет четкое и нормальное тело.

Итак, я хочу выяснить, в чем проблема и как ее исправить.

1 Ответ

1 голос
/ 07 июля 2019

Это работает, но не так, как должно работать. Заголовки ответа в порядке, а тело нет. Как показано ниже, тело ответа выглядит странно: «Всего байтов» x1f \ x8b \ x08 \ x00 \ x00 ... и т. Д. »,

Тело в порядке, только вы не понимаете, что оно в порядке:

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 для получения дополнительной информации, а не просто «предполагая» - вот для чего эти стандарты на самом деле.

...