max_mara
@max_mara

HTTP Termination Symbol

Добрый день коллеги,

в целях саморазвития пытаюсь написать небольшой асинхронный HTTP Proxy server на PHP.

Ни как не могу словить момент, когда браузер перестает передавать данные. Я так понимаю что termination symbol в HTTP это два CLRF подряд.

$buffer = "";
$termination = 0;
do {
$data = @socket_read($client, 8192, PHP_NORMAL_READ);
$buffer .= $data;
if ($data == "\r\n") {
$termination++;
}
} while($termination < 2 || $data !== false);
die($buffer);


Но код почему-то так и не выходит из цикла. Пробовал отдельно использовать только \r и только \n. Пробовал даже \0

Никак не пойму в чем дело. Что я делаю не так?

Заранее спасибо.
  • Вопрос задан
  • 2507 просмотров
Решения вопроса 1
Да, надо два CRLF подряд, но сравнение
$data == "\r\n"
делает не то, что надо. Это сравнение вернёт истину только один раз, когда придёт второй CRLF, потому что первый был не сам по себе, а завершал последнюю строчку заголовка. Вообще, типичный HTTP-запрос выглядит примерно так (только полей обычно побольше):
GET / HTTP/1.1\r\n
Host: habrahabr.ru\r\n
Accept-Language: ru-RU,ru;q=0.9,en;q=0.8\r\n
Connection: keep-alive\r\n
Referer: http://habrahabr.ru/\r\n
\r\n
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
Вы правы:
Both types of message consist of a start-line, zero or more header fields (also known as «headers»), an empty line (i.e., a line with nothing preceding the CRLF) indicating the end of the header fields, and possibly a message-body.

Значит надо отлаживать — смотреть, что пришло в $data.
Ответ написан
Комментировать
Kindman
@Kindman
Иногда браузер через одно соединение пытается отправить несколько исходящих запросов к серверу. Поэтому может после отправки запроса не закрывать соединение.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы