Задать вопрос
@calculator212

Почему не получается получить тело post запроса целиком c++ asio?

Пытаюсь разобраться с кодом небольшого веб-сервера на asio ссылка на первоисточник. У меня возникла такая проблема, что я отправляю на этот сервер post запрос с небольшим файлом в теле через postman, но у меня принимается только маленькая часть запроса, я хотел узнать почему не получается принять запрос целиком?

часть запроса, которую я получаю
spoiler
POST / HTTP/1.1
User-Agent: PostmanRuntime/7.28.4
Accept: */*
Postman-Token: 83e831df-1e8a-47e8-94b3-2403e4efff8b
Host: 127.0.0.1:1234
Accept-Encoding: gzip, deflate, br
Connection: keep-alive
Content-Type: multipart/form-data; boundary=--------------------------087172824010993708739017
Content-Length: 12397

----------------------------087172824010993708739017
Content-Disposition: form-data; name="image"; filename="clion.png"
Content-Type: image/png

�PNG


код для приема и обработки запросов
spoiler
void HttpAcceptor::AcceptConnection()
{
  std::shared_ptr<asio::ip::tcp::socket> sock(new asio::ip::tcp::socket(m_IOService));

  m_Acceptor.async_accept(*sock.get(),
      [this, sock](const boost::system::error_code& ec)
      {
        if(ec.value() == 0){
          (new HttpService(sock))->HttpHandleRequest();
        }else{
          std::cout<<"Error occured, Error code = "<<ec.value()
                   <<" Message: "<<ec.message();
        }

        // accept next request if not stopped yet
        if(!m_IsStopped.load()){
          AcceptConnection();
        }else{
          //stop accepting incoming connection requests
          m_Acceptor.close();
        }
      });
}


//код обработки запроса
void HttpService::HttpHandleRequest()
{
  //read the request from client
  asio::async_read_until(*m_Socket.get(),
        m_Request, '\n',
        [this](const boost::system::error_code& ec, 
               std::size_t bytes_transfered)
         {
           //get string from read stream
           std::string request_line;
           std::istream request_stream(&m_Request);
           std::getline(request_stream, request_line, '\0');

           //parse the string and get HTTP request
           HttpRequestParser parser(request_line);
           std::shared_ptr<HttpRequest> http_request = parser.GetHttpRequest();
           std::cout<<"Request: {"<<std::endl;
           std::cout<<http_request->request;
           std::cout<<"}"<<std::endl;
           SendResponse();
});
  • Вопрос задан
  • 71 просмотр
Подписаться 1 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Смотрим формат PNG, заголовок файла.
137 80 78 71 13 10 26 10
13 10 - это ничто иное, как \r\n.
А ваш код читает запрос как раз до \n.
По уму надо читать заголовки, пока не встретится пустая строка (\r\n\r\n), затем искать заголовок Content-Length и считывать указанное в нём количество байт.
Потом, с учётом Content-Type, из считанных данных восстанавливать запрос.
Ответ написан
Ваш ответ на вопрос

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

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