Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add error message to Websocket onerror handler #476

Merged
merged 4 commits into from
Jun 21, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
6 changes: 3 additions & 3 deletions docs/guides/websockets.md
Original file line number Diff line number Diff line change
Expand Up @@ -7,9 +7,9 @@ A websocket route differs from a normal route quite a bit. It uses A slightly al

- `#!cpp onaccept([&](const crow::request& req, void** userdata){handler code goes here})`
- `#!cpp onopen([&](crow::websocket::connection& conn){handler code goes here})`
- `#!cpp onmessage([&](crow::websocket::connection& conn, const std::string message, bool is_binary){handler code goes here})`
- `#!cpp onerror([&](crow::websocket::connection& conn){handler code goes here})`
- `#!cpp onclose([&](crow::websocket::connection& conn, const std::string reason){handler code goes here})`
- `#!cpp onmessage([&](crow::websocket::connection& conn, const std::string& message, bool is_binary){handler code goes here})`
- `#!cpp onerror([&](crow::websocket::connection& conn, const std::string& error_message){handler code goes here})`
- `#!cpp onclose([&](crow::websocket::connection& conn, const std::string& reason){handler code goes here})`

!!! note

Expand Down
16 changes: 9 additions & 7 deletions include/crow/json.h
Original file line number Diff line number Diff line change
Expand Up @@ -1836,36 +1836,38 @@ namespace crow
enum
{
start,
decp,
decp, // Decimal point
zero
} f_state;
char outbuf[128];
MSC_COMPATIBLE_SPRINTF(outbuf, "%f", v.num.d);
char *p = &outbuf[0], *o = nullptr;
char *p = &outbuf[0], *o = nullptr; // o is the position of the first trailing 0
f_state = start;
while (*p != '\0')
{
//std::cout << *p << std::endl;
char ch = *p;
switch (f_state)
{
case start:
case start: // Loop and lookahead until a decimal point is found
if (ch == '.')
{
if (p + 1 && *(p + 1) == '0') p++;
char fch = *(p + 1);
// if the first character is 0, leave it be (this is so that "1.00000" becomes "1.0" and not "1.")
if (fch != '\0' && fch == '0') p++;
f_state = decp;
}
p++;
break;
case decp:
case decp: // Loop until a 0 is found, if found, record its position
if (ch == '0')
{
f_state = zero;
o = p;
}
p++;
break;
case zero:
case zero: // if a non 0 is found (e.g. 1.00004) remove the earlier recorded 0 position and look for more trailing 0s
if (ch != '0')
{
o = nullptr;
Expand All @@ -1875,7 +1877,7 @@ namespace crow
break;
}
}
if (o != nullptr)
if (o != nullptr) // if any trailing 0s are found, terminate the string where they begin
*o = '\0';
out += outbuf;
#undef MSC_COMPATIBLE_SPRINTF
Expand Down
2 changes: 1 addition & 1 deletion include/crow/routing.h
Original file line number Diff line number Diff line change
Expand Up @@ -508,7 +508,7 @@ namespace crow
std::function<void(crow::websocket::connection&)> open_handler_;
std::function<void(crow::websocket::connection&, const std::string&, bool)> message_handler_;
std::function<void(crow::websocket::connection&, const std::string&)> close_handler_;
std::function<void(crow::websocket::connection&)> error_handler_;
std::function<void(crow::websocket::connection&, const std::string&)> error_handler_;
std::function<bool(const crow::request&, void**)> accept_handler_;
uint64_t max_payload_;
bool max_payload_override_ = false;
Expand Down
18 changes: 9 additions & 9 deletions include/crow/websocket.h
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,7 @@ namespace crow
std::function<void(crow::websocket::connection&)> open_handler,
std::function<void(crow::websocket::connection&, const std::string&, bool)> message_handler,
std::function<void(crow::websocket::connection&, const std::string&)> close_handler,
std::function<void(crow::websocket::connection&)> error_handler,
std::function<void(crow::websocket::connection&, const std::string&)> error_handler,
std::function<bool(const crow::request&, void**)> accept_handler):
adaptor_(std::move(adaptor)),
handler_(handler),
Expand Down Expand Up @@ -315,7 +315,7 @@ namespace crow
adaptor_.shutdown_readwrite();
adaptor_.close();
if (error_handler_)
error_handler_(*this);
error_handler_(*this, "Client connection not masked.");
check_destroy();
#endif
}
Expand All @@ -341,7 +341,7 @@ namespace crow
adaptor_.shutdown_readwrite();
adaptor_.close();
if (error_handler_)
error_handler_(*this);
error_handler_(*this, ec.message());
check_destroy();
}
});
Expand Down Expand Up @@ -379,7 +379,7 @@ namespace crow
adaptor_.shutdown_readwrite();
adaptor_.close();
if (error_handler_)
error_handler_(*this);
error_handler_(*this, ec.message());
check_destroy();
}
});
Expand Down Expand Up @@ -414,7 +414,7 @@ namespace crow
adaptor_.shutdown_readwrite();
adaptor_.close();
if (error_handler_)
error_handler_(*this);
error_handler_(*this, ec.message());
check_destroy();
}
});
Expand All @@ -426,7 +426,7 @@ namespace crow
close_connection_ = true;
adaptor_.close();
if (error_handler_)
error_handler_(*this);
error_handler_(*this, "Message length exceeds maximum paylaod.");
check_destroy();
}
else if (has_mask_)
Expand Down Expand Up @@ -455,7 +455,7 @@ namespace crow
{
close_connection_ = true;
if (error_handler_)
error_handler_(*this);
error_handler_(*this, ec.message());
adaptor_.shutdown_readwrite();
adaptor_.close();
check_destroy();
Expand Down Expand Up @@ -497,7 +497,7 @@ namespace crow
{
close_connection_ = true;
if (error_handler_)
error_handler_(*this);
error_handler_(*this, ec.message());
adaptor_.shutdown_readwrite();
adaptor_.close();
check_destroy();
Expand Down Expand Up @@ -685,7 +685,7 @@ namespace crow
std::function<void(crow::websocket::connection&)> open_handler_;
std::function<void(crow::websocket::connection&, const std::string&, bool)> message_handler_;
std::function<void(crow::websocket::connection&, const std::string&)> close_handler_;
std::function<void(crow::websocket::connection&)> error_handler_;
std::function<void(crow::websocket::connection&, const std::string&)> error_handler_;
std::function<bool(const crow::request&, void**)> accept_handler_;
};
} // namespace websocket
Expand Down