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 |
}}} |