| 647 | } |
| 648 | |
| 649 | int websocket::peek_frame_data(char* buf, size_t size) |
| 650 | { |
| 651 | if (payload_nread_ >= header_.payload_len) { |
| 652 | reset(); |
| 653 | return 0; |
| 654 | } |
| 655 | |
| 656 | if (header_.payload_len < payload_nread_ + size) { |
| 657 | size = (size_t) (header_.payload_len - payload_nread_); |
| 658 | } |
| 659 | |
| 660 | // ���δ������Ҫ��������Ҷ���������Ϊ�գ���-1 |
| 661 | // readn_peek ����������Ϊ true Ҫ���ڲ��Զ���ջ����� |
| 662 | if (!client_.readn_peek(peek_buf_, size, true) && peek_buf_->empty()) { |
| 663 | return -1; |
| 664 | } |
| 665 | |
| 666 | acl_assert(!peek_buf_->empty()); |
| 667 | |
| 668 | size_t len = peek_buf_->size(); |
| 669 | memcpy(buf, peek_buf_->c_str(), len); |
| 670 | |
| 671 | if (header_.mask) { |
| 672 | unsigned char* mask = (unsigned char*) &header_.masking_key; |
| 673 | for (size_t i = 0; i < len; i++) { |
| 674 | buf[i] ^= mask[(payload_nread_ + i) % 4]; |
| 675 | } |
| 676 | } |
| 677 | |
| 678 | payload_nread_ += len; |
| 679 | return (int) len; |
| 680 | } |
| 681 | |
| 682 | int websocket::peek_frame_data(string& buf, size_t size) |
| 683 | { |
no test coverage detected