WebSocketParser.cpp 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. #include "WebSocketParser.h"
  2. #include "websocket_parser.h"
  3. #include "hdef.h"
  4. #define MAX_PAYLOAD_LENGTH (1 << 24) // 16M
  5. static int on_frame_header(websocket_parser* parser) {
  6. WebSocketParser* wp = (WebSocketParser*)parser->data;
  7. int opcode = parser->flags & WS_OP_MASK;
  8. // printf("on_frame_header opcode=%d\n", opcode);
  9. if (opcode != WS_OP_CONTINUE) {
  10. wp->opcode = opcode;
  11. }
  12. int length = parser->length;
  13. int reserve_length = MIN(length + 1, MAX_PAYLOAD_LENGTH);
  14. if (reserve_length > wp->message.capacity()) {
  15. wp->message.reserve(reserve_length);
  16. }
  17. if (wp->state == WS_FRAME_BEGIN ||
  18. wp->state == WS_FRAME_FIN) {
  19. wp->message.clear();
  20. }
  21. wp->state = WS_FRAME_HEADER;
  22. return 0;
  23. }
  24. static int on_frame_body(websocket_parser* parser, const char * at, size_t length) {
  25. // printf("on_frame_body length=%d\n", (int)length);
  26. WebSocketParser* wp = (WebSocketParser*)parser->data;
  27. wp->state = WS_FRAME_BODY;
  28. if (wp->parser->flags & WS_HAS_MASK) {
  29. websocket_parser_decode((char*)at, at, length, wp->parser);
  30. }
  31. wp->message.append(at, length);
  32. return 0;
  33. }
  34. static int on_frame_end(websocket_parser* parser) {
  35. // printf("on_frame_end\n");
  36. WebSocketParser* wp = (WebSocketParser*)parser->data;
  37. wp->state = WS_FRAME_END;
  38. if (wp->parser->flags & WS_FIN) {
  39. wp->state = WS_FRAME_FIN;
  40. if (wp->onMessage) {
  41. wp->onMessage(wp->opcode, wp->message);
  42. }
  43. }
  44. return 0;
  45. }
  46. websocket_parser_settings* WebSocketParser::cbs = NULL;
  47. WebSocketParser::WebSocketParser() {
  48. if (cbs == NULL) {
  49. cbs = (websocket_parser_settings*)malloc(sizeof(websocket_parser_settings));
  50. websocket_parser_settings_init(cbs);
  51. cbs->on_frame_header = on_frame_header;
  52. cbs->on_frame_body = on_frame_body;
  53. cbs->on_frame_end = on_frame_end;
  54. }
  55. parser = (websocket_parser*)malloc(sizeof(websocket_parser));
  56. websocket_parser_init(parser);
  57. parser->data = this;
  58. state = WS_FRAME_BEGIN;
  59. }
  60. WebSocketParser::~WebSocketParser() {
  61. if (parser) {
  62. free(parser);
  63. parser = NULL;
  64. }
  65. }
  66. int WebSocketParser::FeedRecvData(const char* data, size_t len) {
  67. return websocket_parser_execute(parser, cbs, data, len);
  68. }