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