HttpHandler.h 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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_t *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. fc = NULL;
  66. ws_cbs = NULL;
  67. }
  68. void Reset() {
  69. req.Reset();
  70. res.Reset();
  71. fc = NULL;
  72. }
  73. // @workflow: preprocessor -> api -> web -> postprocessor
  74. // @result: HttpRequest -> HttpResponse/file_cache_t
  75. int HandleHttpRequest();
  76. // websocket
  77. WebSocketHandler* SwitchWebSocket() {
  78. ws.reset(new WebSocketHandler);
  79. return ws.get();
  80. }
  81. void WebSocketOnOpen() {
  82. ws->onopen();
  83. if (ws_cbs && ws_cbs->onopen) {
  84. ws_cbs->onopen(ws->channel, req.url);
  85. }
  86. }
  87. void WebSocketOnClose() {
  88. ws->onclose();
  89. if (ws_cbs && ws_cbs->onclose) {
  90. ws_cbs->onclose(ws->channel);
  91. }
  92. }
  93. void WebSocketOnMessage(const std::string& msg) {
  94. if (ws_cbs && ws_cbs->onmessage) {
  95. ws_cbs->onmessage(ws->channel, msg);
  96. }
  97. }
  98. };
  99. #endif // HTTP_HANDLER_H_