Branch Coverage

src/panda/protocol/websocket/Parser.cc
Criterion Covered Total %
branch 161 224 71.8


line true false branch
17 275 4 if (!_flags[ESTABLISHED]) {
19 274 1 if (_deflate_cfg) _deflate_cfg->max_message_size = _max_message_size;
22 0 279 if (_frame) _frame->max_size(_max_frame_size);
23 0 279 if (_message) _message->max_size(_max_message_size);
34 0 132 if (_deflate_ext) _deflate_ext->reset();
39 76185 0 if (!frame.parse(_buffer)) {
75720 465 if (!frame.parse(_buffer)) {
50 2 73 if (frame.error & errc::invalid_utf8) _suggested_close_code = CloseCode::INVALID_TEXT;
51 2 71 else if (frame.error & errc::max_frame_size) _suggested_close_code = CloseCode::MAX_SIZE;
62 59 406 if (frame.error) return _err();
59 0 if (frame.error) return _err();
64 406 0 if (frame.is_control()) { // control frames can't be fragmented, no need to increment frame count
40 366 if (frame.is_control()) { // control frames can't be fragmented, no need to increment frame count
65 33 7 if (!_frame_count) _flags.reset(RECV_FRAME); // do not reset state if control frame arrives in the middle of message
33 0 if (!_frame_count) _flags.reset(RECV_FRAME); // do not reset state if control frame arrives in the middle of message
66 17 23 if (frame.opcode() == Opcode::CLOSE) {
68 17 0 _flags.set(RECV_CLOSED);
69 4 13 if (frame.close_code() == CloseCode::UNKNOWN) _suggested_close_code = CloseCode::DONE;
72 3 14 if (_check_utf8 && frame.close_message()) {
3 0 if (_check_utf8 && frame.close_message()) {
3 0 if (_check_utf8 && frame.close_message()) {
3 14 if (_check_utf8 && frame.close_message()) {
3 14 if (_check_utf8 && frame.close_message()) {
0 0 if (_check_utf8 && frame.close_message()) {
74 3 0 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
3 0 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
2 1 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
0 2 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
3 0 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
1 2 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
1 0 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
0 0 if (!_utf8_checker.write(frame.close_message()) || !_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
80 228 138 if (_frame_count == 0) {
81 4 224 if (frame.opcode() == Opcode::CONTINUE) return _seterr(errc::initial_continue);
4 0 if (frame.opcode() == Opcode::CONTINUE) return _seterr(errc::initial_continue);
82 43 181 if (frame.rsv1()) {
83 41 2 if (_deflate_ext) _flags.set(RECV_INFLATE);
41 0 if (_deflate_ext) _flags.set(RECV_INFLATE);
84 2 0 else return _seterr(errc::unexpected_rsv);
86 0 222 if (frame.rsv2() | frame.rsv3()) return _seterr(errc::unexpected_rsv);
0 0 if (frame.rsv2() | frame.rsv3()) return _seterr(errc::unexpected_rsv);
89 4 134 if (frame.opcode() != Opcode::CONTINUE) return _seterr(errc::fragment_no_continue);
4 0 if (frame.opcode() != Opcode::CONTINUE) return _seterr(errc::fragment_no_continue);
92 50 306 if (_flags[RECV_INFLATE]) {
93 50 0 _deflate_ext->uncompress(frame);
94 4 46 if (frame.error) return _err();
4 0 if (frame.error) return _err();
97 11 341 if (_check_utf8) {
98 4 7 if (_frame_count == 0 && frame.opcode() == Opcode::TEXT) _flags.set(RECV_TEXT);
4 0 if (_frame_count == 0 && frame.opcode() == Opcode::TEXT) _flags.set(RECV_TEXT);
4 7 if (_frame_count == 0 && frame.opcode() == Opcode::TEXT) _flags.set(RECV_TEXT);
4 0 if (_frame_count == 0 && frame.opcode() == Opcode::TEXT) _flags.set(RECV_TEXT);
99 11 0 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
11 0 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
1 10 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
11 0 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
1 10 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
1 0 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
0 0 if (_flags[RECV_TEXT] && !_utf8_checker.write(frame.payload)) return _seterr(errc::invalid_utf8);
100 3 7 if (frame.final()) {
101 0 3 if (!_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
0 0 if (!_utf8_checker.finish()) return _seterr(errc::invalid_utf8);
102 3 0 _flags.reset(RECV_TEXT);
106 204 147 if (frame.final()) {
107 204 0 _flags.reset(RECV_FRAME);
108 204 0 _flags.reset(RECV_INFLATE);
117 2 72489 if (!_flags[ESTABLISHED]) throw Error("not established");
118 2 72487 if (_flags[RECV_MESSAGE]) throw Error("message is being parsed");
119 12 72475 if (_flags[RECV_CLOSED]) { _buffer.clear(); return nullptr; }
120 66 72409 if (!_buffer) return nullptr;
122 72409 0 _flags.set(RECV_FRAME);
123 117 72292 if (!_frame) _frame = new Frame(_recv_mask_required, _max_frame_size);
117 0 if (!_frame) _frame = new Frame(_recv_mask_required, _max_frame_size);
117 0 if (!_frame) _frame = new Frame(_recv_mask_required, _max_frame_size);
125 72409 0 if (!_parse_frame(*_frame)) return nullptr;
72292 117 if (!_parse_frame(*_frame)) return nullptr;
133 1 3883 if (!_flags[ESTABLISHED]) throw Error("not established");
134 2 3881 if (_flags[RECV_FRAME]) throw Error("frame mode active");
135 7 3874 if (_flags[RECV_CLOSED]) { _buffer.clear(); return nullptr; }
136 178 3696 if (!_buffer) return nullptr;
138 3696 0 _flags.set(RECV_MESSAGE);
139 209 3487 if (!_message) _message = new Message(_max_message_size);
209 0 if (!_message) _message = new Message(_max_message_size);
209 0 if (!_message) _message = new Message(_max_message_size);
142 3776 0 if (!_parse_frame(_message_frame)) return nullptr;
3428 348 if (!_parse_frame(_message_frame)) return nullptr;
146 324 24 if (!_message_frame.error && _message_frame.is_control() && _message->frame_count) {
324 0 if (!_message_frame.error && _message_frame.is_control() && _message->frame_count) {
19 305 if (!_message_frame.error && _message_frame.is_control() && _message->frame_count) {
5 14 if (!_message_frame.error && _message_frame.is_control() && _message->frame_count) {
5 343 if (!_message_frame.error && _message_frame.is_control() && _message->frame_count) {
147 5 0 auto cntl_msg = new Message(_max_message_size);
5 0 auto cntl_msg = new Message(_max_message_size);
148 5 0 bool done = cntl_msg->add_frame(_message_frame);
149 0 5 assert(done);
154 343 0 bool done = _message->add_frame(_message_frame);
157 207 136 if (done) break;
158 56 80 if (!_buffer) return nullptr;
161 26 181 if (_message->error) {
162 4 22 if (_message->error & errc::max_message_size) _suggested_close_code = CloseCode::MAX_SIZE;
165 207 0 _flags.reset(RECV_MESSAGE);
166 207 0 _flags.reset(RECV_INFLATE);
174 8 25 if (opcode == Opcode::CLOSE) {
178 32 1 return FrameHeader(opcode, true, 0, 0, 0, !_recv_mask_required, _recv_mask_required ? 0 : (uint32_t)std::rand());
182 2 192 if (!_flags[SEND_FRAME]) throw Error("can't send frame: message has not been started");
184 0 192 if (FrameHeader::is_control_opcode(_send_opcode)) {
185 0 0 if (!final) throw Error("control frame must be final");
192 18 174 if (_sent_frame_count) {
201 168 24 if (final) {
208 80 112 return FrameHeader(opcode, final, rsv1, 0, 0, !_recv_mask_required, _recv_mask_required ? 0 : (uint32_t)std::rand());
211 18 0 }}}
18 0 }}}