@Elnurhan

Как прочитать весь http запрос вместе с телом?

Всем привет!
Столкнулся с такой проблемой: пишу простой http-сервер и когда ко мне приходит POST request с телом, сначала считывается запрос без тела, а потом, отдельно, считывается тело.
То есть к примеру у меня есть такой запрос:
POST / HTTP/1.1
Host: ....
Connection: keep-alive
Content-Length: 11

hello world

И считываю я его следующим образом:
void TCPConnection::startReceiving()
{
    m_socket.async_receive(boost::asio::buffer(m_buffer),
            boost::bind(&TCPConnection::handleReceive, shared_from_this(), _1, _2));
}
        ...
void TCPConnection::handleReceive(const boost::system::error_code ec, size_t bytesTransferred)
{
    if (ec)
        return;
    
    handler(&m_buffer.front(), bytesTransferred); // Handler for processing some data.
    startReceiving();
}

И сначала считываются хедер до символов "\r\n\r\n":
POST / HTTP/1.1
Host: ....
Connection: keep-alive
Content-Length: 11

Затем считывается тело:
hello world

Можно ли как-нибудь прочитать весь этот запрос полностью?
  • Вопрос задан
  • 66 просмотров
Пригласить эксперта
Ответы на вопрос 1
Nipheris
@Nipheris Куратор тега C++
async_receive:
The receive operation may not receive all of the requested number of bytes. Consider using the async_read function if you need to ensure that the requested amount of data is received before the asynchronous operation completes.


Но т.к. вы всё равно заранее не знаете, сколько байт вам нужно прочитать, я не вижу проблемы в поведении async_receive. Вам нужно отслеживать состояние вашего протокола (в вашем случае - HTTP) и понимать, когда нужно подождать ещё данных, а когда уже всё пришло.
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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