Чего не хватает, чтобы получить мой HTTP-ответ Почтальону (с C ++ boost :: asio) - PullRequest
0 голосов
/ 03 июня 2019

В настоящее время я пытаюсь изучить протокол HTTP, экспериментируя с минимальным сервером HTTP, созданным с boost :: asio, вот и все:

using namespace std;
using namespace boost::asio;
using namespace boost::asio::ip;

//
// TCP Session
//
class TcpSession : public enable_shared_from_this<TcpSession>
{
  uint8_t      mData[8192];
  tcp::socket  mSocket;  
  unsigned int mTcpSessionId;

public:
  TcpSession(tcp::socket && iSocket, unsigned int && iTcpSessionId) :
    mSocket(move(iSocket)),
    mTcpSessionId(iTcpSessionId) {}

  ~TcpSession() {}

  void start() {
    doRead();
  }

private:

  void doRead() {
    shared_ptr<TcpSession> self(shared_from_this());

    mSocket.async_read_some( buffer(mData, 8192),
      [this, self](boost::system::error_code ec, size_t iBytesReceived)
    {
      if (ec.value() == 10058) { // Socket already closed
        return;
      }
      else if (ec) {
        cout << "Session error : " << ec.value() << " " << ec.message() << endl;
        return;
      }

      if (iBytesReceived > 0) {
        cout << string(reinterpret_cast<char*>(mData), iBytesReceived) << endl;
        write(mSocket, buffer("HTTP/1.1 204 No Content\r\n\r\n"));
        mSocket.shutdown(socket_base::shutdown_both);
      }

      doRead(); 
    });
  }

}; // end of TcpSession


//
// TCP Server
//
class TcpServer
{
  tcp::acceptor mAcceptor;
  tcp::socket   mSocket;
  unsigned int  mTcpSessionCount;

public:
  TcpServer(io_service& iService, const short iPort) :
    mAcceptor(iService, tcp::endpoint(tcp::v4(), iPort)),
    mSocket(iService),
    mTcpSessionCount(0) {
    mAcceptor.set_option(tcp::acceptor::reuse_address());
    accept();
  }

private:
  void accept() {
    mAcceptor.async_accept(mSocket, [this](boost::system::error_code ec) {
      if(!ec) {
        make_shared<TcpSession>(move(mSocket), mTcpSessionCount++)->start();
      }
      else {
        cout << "Server error message " << ec.value() << " " << ec.message() << endl;
      }

      accept();
    });
  }
}; // end of TcpServer

int main() {
  io_service ioService;
  TcpServer mTcpServer(ioService, 2112);
  ioService.run();
}

Когда я отправляю запрос на этот сервер с почтальоном, я получаю сообщение «Не удалось получить ответ». Когда я пытаюсь сделать то же самое с Бессонницей, я получаю совершенно ожидаемый ответ.

В поисках проблемы я понимаю, что Почтальон потребовал бы от меня использовать системный прокси для получения сообщения. Я уже повеселился с RestBed и CPPREST, но у меня никогда не было такого короля проблем. Я понимаю, что CPPREST и RestBed должны делать что-то еще для управления / переноса ответа, но что?

Что делают CPPREST и RestBed, а я нет? Нужен ли конкретный заголовок, чтобы ответы моего сервера были более приемлемыми? Или, может быть, я должен настроить мой акцептор / сокет по-другому?

...