Branch Coverage

src/panda/protocol/websocket/ServerParser.cc
Criterion Covered Total %
branch 81 146 55.4


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