userver: samples/websocket_client/main.cpp
Loading...
Searching...
No Matches
samples/websocket_client/main.cpp
#include <userver/websocket/connection.hpp>
namespace samples::websocket_client {
class WebSocketClientHandler final : public server::handlers::HttpHandlerBase {
public:
static constexpr std::string_view kName = "handler-websocket-client";
WebSocketClientHandler(const components::ComponentConfig& config, const components::ComponentContext& context)
: HttpHandlerBase(config, context),
http_client_(context.FindComponent<components::HttpClient>().GetHttpClient())
{}
std::string HandleRequestThrow(const server::http::HttpRequest& request, server::request::RequestContext&)
const override {
const auto& ws_server_url = request.GetArg("url");
// Perform WebSocket handshake
auto ws_response = http_client_.CreateRequest().url(ws_server_url).PerformWebSocketHandshake();
// Create WebSocket connection
auto conn = ws_response.MakeWebSocketConnection();
conn->SendText(request.GetArg("message"));
// Receive response
conn->Recv(response);
// Close connection
conn->Close(websocket::CloseStatus::kNormal);
return response.data;
}
private:
clients::http::Client& http_client_;
};
} // namespace samples::websocket_client
int main(int argc, char* argv[]) {
const auto component_list =
.Append<server::handlers::TestsControl>()
.AppendComponentList(clients::http::ComponentList())
.Append<samples::websocket_client::WebSocketClientHandler>();
return utils::DaemonMain(argc, argv, component_list);
}