HTTPServer.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. #ifndef HTTP_SERVER_H__
  2. #define HTTP_SERVER_H__
  3. #include <inttypes.h>
  4. #include <string>
  5. #include <memory>
  6. #include <map>
  7. #include <thread>
  8. #include <boost/asio.hpp>
  9. #include <sstream>
  10. #include "HTTP.h"
  11. namespace i2p
  12. {
  13. namespace http
  14. {
  15. const size_t HTTP_CONNECTION_BUFFER_SIZE = 8192;
  16. const int TOKEN_EXPIRATION_TIMEOUT = 30; // in seconds
  17. class HTTPConnection: public std::enable_shared_from_this<HTTPConnection>
  18. {
  19. public:
  20. HTTPConnection (std::string serverhost, std::shared_ptr<boost::asio::ip::tcp::socket> socket);
  21. void Receive ();
  22. private:
  23. void HandleReceive (const boost::system::error_code& ecode, std::size_t bytes_transferred);
  24. void Terminate (const boost::system::error_code& ecode);
  25. void RunRequest ();
  26. bool CheckAuth (const HTTPReq & req);
  27. void HandleRequest (const HTTPReq & req);
  28. void HandlePage (const HTTPReq & req, HTTPRes & res, std::stringstream& data);
  29. void HandleCommand (const HTTPReq & req, HTTPRes & res, std::stringstream& data);
  30. void SendReply (HTTPRes & res, std::string & content);
  31. private:
  32. std::shared_ptr<boost::asio::ip::tcp::socket> m_Socket;
  33. char m_Buffer[HTTP_CONNECTION_BUFFER_SIZE + 1];
  34. size_t m_BufferLen;
  35. std::string m_SendBuffer;
  36. bool needAuth;
  37. std::string user;
  38. std::string pass;
  39. std::string expected_host;
  40. static std::map<uint32_t, uint32_t> m_Tokens; // token->timestamp in seconds
  41. };
  42. class HTTPServer
  43. {
  44. public:
  45. HTTPServer (const std::string& address, int port);
  46. ~HTTPServer ();
  47. void Start ();
  48. void Stop ();
  49. private:
  50. void Run ();
  51. void Accept ();
  52. void HandleAccept(const boost::system::error_code& ecode,
  53. std::shared_ptr<boost::asio::ip::tcp::socket> newSocket);
  54. void CreateConnection(std::shared_ptr<boost::asio::ip::tcp::socket> newSocket);
  55. private:
  56. bool m_IsRunning;
  57. std::unique_ptr<std::thread> m_Thread;
  58. boost::asio::io_service m_Service;
  59. boost::asio::io_service::work m_Work;
  60. boost::asio::ip::tcp::acceptor m_Acceptor;
  61. std::string m_Hostname;
  62. };
  63. //all the below functions are also used by Qt GUI, see mainwindow.cpp -> getStatusPageHtml
  64. enum OutputFormatEnum { forWebConsole, forQtUi };
  65. void ShowStatus (std::stringstream& s, bool includeHiddenContent, OutputFormatEnum outputFormat);
  66. void ShowLocalDestinations (std::stringstream& s);
  67. void ShowLeasesSets(std::stringstream& s);
  68. void ShowTunnels (std::stringstream& s);
  69. void ShowTransitTunnels (std::stringstream& s);
  70. void ShowTransports (std::stringstream& s);
  71. void ShowSAMSessions (std::stringstream& s);
  72. void ShowI2PTunnels (std::stringstream& s);
  73. void ShowLocalDestination (std::stringstream& s, const std::string& b32);
  74. } // http
  75. } // i2p
  76. #endif /* HTTP_SERVER_H__ */