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() {} |