| line |
true |
false |
branch |
|
15
|
119 |
0 |
ServerParser::ServerParser (const Parser::Config& cfg) : Parser(true, cfg), _connect_parser(&request_factory) { |
|
|
119 |
0 |
ServerParser::ServerParser (const Parser::Config& cfg) : Parser(true, cfg), _connect_parser(&request_factory) { |
|
|
119 |
0 |
ServerParser::ServerParser (const Parser::Config& cfg) : Parser(true, cfg), _connect_parser(&request_factory) { |
|
|
0 |
0 |
ServerParser::ServerParser (const Parser::Config& cfg) : Parser(true, cfg), _connect_parser(&request_factory) { |
|
|
0 |
0 |
ServerParser::ServerParser (const Parser::Config& cfg) : Parser(true, cfg), _connect_parser(&request_factory) { |
|
|
0 |
0 |
ServerParser::ServerParser (const Parser::Config& cfg) : Parser(true, cfg), _connect_parser(&request_factory) { |
|
20
|
0 |
316 |
if (_flags[ACCEPT_PARSED]) throw Error("already parsed accept"); |
|
23
|
316 |
0 |
http::RequestParser::Result res = _connect_parser.parse(buf); |
|
24
|
316 |
0 |
_connect_request = dynamic_pointer_cast(res.request); |
|
26
|
3 |
313 |
if (res.error) { |
|
27
|
3 |
0 |
_flags.set(ACCEPT_PARSED); |
|
28
|
3 |
0 |
_connect_request->error = res.error; |
|
30
|
72 |
241 |
} else if (res.state != http::State::done) { |
|
34
|
241 |
0 |
_connect_request->process_headers(); |
|
35
|
241 |
0 |
_flags.set(ACCEPT_PARSED); |
|
37
|
235 |
6 |
if (!_connect_request->error) { |
|
38
|
0 |
235 |
if (res.position != buf.size()) { |
|
41
|
235 |
0 |
_flags.set(ACCEPTED); |
|
49
|
0 |
7 |
if (!_flags[ACCEPT_PARSED]) throw Error("accept not parsed yet"); |
|
50
|
0 |
7 |
if (established()) throw Error("already established"); |
|
51
|
0 |
7 |
if (!_connect_request->error) throw Error("no errors found"); |
|
53
|
7 |
0 |
http::ResponseSP res = new http::Response(); |
|
|
7 |
0 |
http::ResponseSP res = new http::Response(); |
|
54
|
7 |
0 |
res->headers.add("Content-Type", "text/plain"); |
|
56
|
3 |
4 |
if (!_connect_request->ws_version_supported()) { |
|
58
|
3 |
0 |
res->message = "Upgrade Required"; |
|
61
|
3 |
0 |
string svers(50); |
|
62
|
3 |
3 |
for (int v : supported_ws_versions) { |
|
63
|
3 |
0 |
svers += string::from_number(v); |
|
|
3 |
0 |
svers += string::from_number(v); |
|
64
|
3 |
0 |
svers += ", "; |
|
66
|
3 |
0 |
if (svers) svers.length(svers.length()-2); |
|
67
|
3 |
0 |
res->headers.add("Sec-WebSocket-Version", svers); |
|
71
|
4 |
0 |
res->message = "Bad Request"; |
|
73
|
4 |
0 |
res->body.parts.push_back(_connect_request->error.what()); |
|
75
|
7 |
0 |
res->headers.set("Content-Length", panda::to_string(res->body.length())); |
|
|
7 |
0 |
res->headers.set("Content-Length", panda::to_string(res->body.length())); |
|
|
7 |
0 |
res->headers.set("Content-Length", panda::to_string(res->body.length())); |
|
77
|
7 |
0 |
return res->to_string(_connect_request); |
|
81
|
0 |
3 |
if (!_flags[ACCEPT_PARSED]) throw Error("accept not parsed yet"); |
|
82
|
0 |
3 |
if (established()) throw Error("already established"); |
|
83
|
1 |
2 |
if (_connect_request->error) return accept_error(); |
|
85
|
0 |
2 |
if (!res->code) { |
|
89
|
0 |
2 |
else if (!res->message) res->message = "Unknown"; |
|
91
|
1 |
1 |
if (res->body.empty()) { |
|
92
|
1 |
0 |
res->body.parts.push_back(string::from_number(res->code) + ' ' + res->message); |
|
|
1 |
0 |
res->body.parts.push_back(string::from_number(res->code) + ' ' + res->message); |
|
95
|
2 |
0 |
if (!res->headers.has("Content-Type")) res->headers.add("Content-Type", "text/plain"); |
|
|
2 |
0 |
if (!res->headers.has("Content-Type")) res->headers.add("Content-Type", "text/plain"); |
|
|
2 |
0 |
if (!res->headers.has("Content-Type")) res->headers.add("Content-Type", "text/plain"); |
|
96
|
2 |
0 |
if (!res->headers.has("Content-Length")) res->headers.add("Content-Length", panda::to_string(res->body.length())); |
|
|
2 |
0 |
if (!res->headers.has("Content-Length")) res->headers.add("Content-Length", panda::to_string(res->body.length())); |
|
|
2 |
0 |
if (!res->headers.has("Content-Length")) res->headers.add("Content-Length", panda::to_string(res->body.length())); |
|
102
|
0 |
228 |
if (!accepted()) throw Error("client has not been accepted"); |
|
103
|
0 |
228 |
if (established()) throw Error("already established"); |
|
105
|
228 |
0 |
res->_ws_key = _connect_request->ws_key; |
|
106
|
227 |
1 |
if (!res->ws_protocol) res->ws_protocol = _connect_request->ws_protocol; |
|
|
227 |
0 |
if (!res->ws_protocol) res->ws_protocol = _connect_request->ws_protocol; |
|
107
|
227 |
1 |
if (!res->ws_extensions_set()) res->ws_extensions(_connect_request->ws_extensions()); |
|
|
227 |
0 |
if (!res->ws_extensions_set()) res->ws_extensions(_connect_request->ws_extensions()); |
|
111
|
226 |
2 |
if (_deflate_cfg && exts.size()) { |
|
|
87 |
139 |
if (_deflate_cfg && exts.size()) { |
|
|
87 |
141 |
if (_deflate_cfg && exts.size()) { |
|
114
|
87 |
0 |
auto deflate_matches = DeflateExt::select(exts, *_deflate_cfg, role); |
|
115
|
80 |
7 |
if (deflate_matches) { |
|
116
|
80 |
0 |
_deflate_ext.reset(DeflateExt::uplift(deflate_matches, used_extensions, role)); |
|
119
|
228 |
0 |
res->ws_extensions(std::move(used_extensions)); |
|
121
|
228 |
0 |
_flags.set(ESTABLISHED); |
|
123
|
228 |
0 |
return res->to_string(); |
|
132
|
119 |
0 |
ServerParser::~ServerParser() {} |
|
|
0 |
119 |
ServerParser::~ServerParser() {} |
|
|
0 |
0 |
ServerParser::~ServerParser() {} |
|
|
0 |
0 |
ServerParser::~ServerParser() {} |