1
0

WebSocketParser.cpp 2.1 KB

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