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

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

Заранее спасибо.
  • Вопрос задан
  • 2505 просмотров
Решения вопроса 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
Иногда браузер через одно соединение пытается отправить несколько исходящих запросов к серверу. Поэтому может после отправки запроса не закрывать соединение.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

Войти через центр авторизации
Похожие вопросы
YCLIENTS Москва
от 200 000 до 350 000 ₽
Ведисофт Екатеринбург
от 25 000 ₽
ИТЦ Аусферр Магнитогорск
от 100 000 до 160 000 ₽
25 апр. 2024, в 11:20
1000 руб./за проект
25 апр. 2024, в 11:02
5000 руб./за проект
25 апр. 2024, в 10:42
150000 руб./за проект