HttpHandler.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115
  1. #ifndef HTTP_HANDLER_H_
  2. #define HTTP_HANDLER_H_
  3. #include "HttpService.h"
  4. #include "HttpParser.h"
  5. #include "FileCache.h"
  6. #include "WebSocketServer.h"
  7. #include "WebSocketParser.h"
  8. #include "hlog.h"
  9. class WebSocketHandler {
  10. public:
  11. WebSocketChannelPtr channel;
  12. WebSocketParserPtr parser;
  13. uint64_t last_send_ping_time;
  14. uint64_t last_recv_pong_time;
  15. WebSocketHandler() {
  16. parser.reset(new WebSocketParser);
  17. // channel.reset(new WebSocketChannel);
  18. last_send_ping_time = 0;
  19. last_recv_pong_time = 0;
  20. }
  21. void onopen() {
  22. channel->status = hv::SocketChannel::CONNECTED;
  23. /*
  24. channel->onread = [this](hv::Buffer* buf) {
  25. const char* data = (const char*)buf->data();
  26. int size= buf->size();
  27. int nfeed = parser->FeedRecvData(data, size);
  28. if (nfeed != size) {
  29. hloge("websocket parse error!");
  30. channel->close();
  31. }
  32. };
  33. */
  34. }
  35. void onclose() {
  36. channel->status = hv::SocketChannel::DISCONNECTED;
  37. }
  38. };
  39. typedef std::shared_ptr<WebSocketHandler> WebSocketHandlerPtr;
  40. class HttpHandler {
  41. public:
  42. enum ProtocolType {
  43. UNKNOWN,
  44. HTTP_V1,
  45. HTTP_V2,
  46. WEBSOCKET,
  47. } protocol;
  48. // peeraddr
  49. char ip[64];
  50. int port;
  51. // for http
  52. HttpService *service;
  53. FileCache *files;
  54. file_cache_ptr fc;
  55. HttpRequest req;
  56. HttpResponse res;
  57. HttpParserPtr parser;
  58. // for websocket
  59. WebSocketHandlerPtr ws;
  60. WebSocketServerCallbacks* ws_cbs;
  61. HttpHandler() {
  62. protocol = UNKNOWN;
  63. service = NULL;
  64. files = NULL;
  65. ws_cbs = NULL;
  66. }
  67. void Reset() {
  68. req.Reset();
  69. res.Reset();
  70. fc = NULL;
  71. }
  72. // @workflow: preprocessor -> api -> web -> postprocessor
  73. // @result: HttpRequest -> HttpResponse/file_cache_t
  74. int HandleHttpRequest();
  75. // websocket
  76. WebSocketHandler* SwitchWebSocket() {
  77. ws.reset(new WebSocketHandler);
  78. return ws.get();
  79. }
  80. void WebSocketOnOpen() {
  81. ws->onopen();
  82. if (ws_cbs && ws_cbs->onopen) {
  83. ws_cbs->onopen(ws->channel, req.url);
  84. }
  85. }
  86. void WebSocketOnClose() {
  87. ws->onclose();
  88. if (ws_cbs && ws_cbs->onclose) {
  89. ws_cbs->onclose(ws->channel);
  90. }
  91. }
  92. void WebSocketOnMessage(const std::string& msg) {
  93. if (ws_cbs && ws_cbs->onmessage) {
  94. ws_cbs->onmessage(ws->channel, msg);
  95. }
  96. }
  97. };
  98. #endif // HTTP_HANDLER_H_