Я создал приложение C++ с использованием WinSck, в котором реализован небольшой (обрабатывает всего несколько функций, которые мне нужны) http-сервер. Это используется для связи с внешним миром с помощью http-запросов. Это работает, но иногда запросы обрабатываются некорректно, потому что парсинг не работает. Теперь я совершенно уверен, что запросы сформированы правильно, поскольку они отправляются основными веб-браузерами, такими как Firefox/chrome или Perl/C# (которые имеют http-модули/dll).
После некоторой отладки я обнаружил, что проблема на самом деле заключается в получении сообщения. Когда сообщение состоит из более чем одной части (оно не читается за один вызов Recv()), иногда синтаксический анализ завершается неудачно. Я предпринял множество попыток решить эту проблему, но ничто не кажется достаточно надежным.
Что я делаю сейчас, так это читаю данные, пока не найду "\ r\n\r\n" последовательность, указывающая конец заголовка. Если WSAGetLastError() сообщает нечто иное, чем 10035 (соединение закрыто/ошибка) до того, как такая последовательность будет найдена, я отбрасываю сообщение. Когда я знаю, что у меня есть весь заголовок, я анализирую его и ищу информацию о длине тела. Однако я не уверен, является ли эта информация обязательной (думаю, что нет) и что мне делать, если такой информации нет - значит ли это, что тела не будет? Другая проблема заключается в том, что я не знаю, следует ли мне искать "\r\n\r\n" после тела (если его длина больше нуля).
Кто-нибудь знает, как надежно разобрать http-сообщение?
Примечание: я знаю, что существуют реализации http-серверов. Я хочу свое по разным причинам. И да, изобретать велосипед — это плохо, я тоже это знаю.
Подробнее здесь: https://stackoverflow.com/questions/369 ... p-requests