drogon
C++14/17-based HTTP application framework
Loading...
Searching...
No Matches
WebSocketClient.h
Go to the documentation of this file.
1
14
15#pragma once
16
17#include <drogon/HttpRequest.h>
18#include <drogon/HttpResponse.h>
20#include <drogon/HttpTypes.h>
21#ifdef __cpp_impl_coroutine
23#endif
24#include <functional>
25#include <memory>
26#include <string>
27#include <trantor/net/EventLoop.h>
28
29namespace drogon
30{
31class WebSocketClient;
32using WebSocketClientPtr = std::shared_ptr<WebSocketClient>;
33using WebSocketRequestCallback = std::function<
34 void(ReqResult, const HttpResponsePtr &, const WebSocketClientPtr &)>;
35
36#ifdef __cpp_impl_coroutine
37namespace internal
38{
39struct [[nodiscard]] WebSocketConnectionAwaiter
40 : public CallbackAwaiter<HttpResponsePtr>
41{
42 WebSocketConnectionAwaiter(WebSocketClient *client, HttpRequestPtr req)
43 : client_(client), req_(std::move(req))
44 {
45 }
46
47 void await_suspend(std::coroutine_handle<> handle);
48
49 private:
50 WebSocketClient *client_;
51 HttpRequestPtr req_;
52};
53
54} // namespace internal
55#endif
56
61class DROGON_EXPORT WebSocketClient
62{
63 public:
65 virtual WebSocketConnectionPtr getConnection() = 0;
66
73 virtual void setMessageHandler(
74 const std::function<void(std::string &&message,
75 const WebSocketClientPtr &,
76 const WebSocketMessageType &)> &callback) = 0;
77
80
87 const std::function<void(const WebSocketClientPtr &)> &callback) = 0;
88
90 virtual void connectToServer(const HttpRequestPtr &request,
91 const WebSocketRequestCallback &callback) = 0;
92
101 virtual void setCertPath(const std::string &cert,
102 const std::string &key) = 0;
103
114 virtual void addSSLConfigs(
115 const std::vector<std::pair<std::string, std::string>>
116 &sslConfCmds) = 0;
117
118#ifdef __cpp_impl_coroutine
125 void setAsyncMessageHandler(
126 const std::function<Task<>(std::string &&message,
127 const WebSocketClientPtr &,
128 const WebSocketMessageType &)> &callback)
129 {
130 setMessageHandler([callback](std::string &&message,
131 const WebSocketClientPtr &client,
132 const WebSocketMessageType &type) -> void {
133 [callback](std::string &&message,
134 const WebSocketClientPtr client,
135 const WebSocketMessageType type) -> AsyncTask {
136 co_await callback(std::move(message), client, type);
137 }(std::move(message), client, type);
138 });
139 }
140
143
150 void setAsyncConnectionClosedHandler(
151 const std::function<Task<>(const WebSocketClientPtr &)> &callback)
152 {
153 setConnectionClosedHandler(
154 [callback](const WebSocketClientPtr &client) {
155 [=]() -> AsyncTask { co_await callback(client); }();
156 });
157 }
158
160 internal::WebSocketConnectionAwaiter connectToServerCoro(
161 const HttpRequestPtr &request)
162 {
163 return internal::WebSocketConnectionAwaiter(this, request);
164 }
165#endif
166
168 virtual trantor::EventLoop *getLoop() = 0;
169
171 virtual void stop() = 0;
172
192 static WebSocketClientPtr newWebSocketClient(
193 const std::string &ip,
194 uint16_t port,
195 bool useSSL = false,
196 trantor::EventLoop *loop = nullptr,
197 bool useOldTLS = false,
198 bool validateCert = true);
199
202
224 static WebSocketClientPtr newWebSocketClient(
225 const std::string &hostString,
226 trantor::EventLoop *loop = nullptr,
227 bool useOldTLS = false,
228 bool validateCert = true);
229
230 virtual ~WebSocketClient() = default;
231};
232
233#ifdef __cpp_impl_coroutine
234inline void internal::WebSocketConnectionAwaiter::await_suspend(
235 std::coroutine_handle<> handle)
236{
237 client_->connectToServer(req_,
238 [this, handle](ReqResult result,
239 const HttpResponsePtr &resp,
240 const WebSocketClientPtr &) {
241 if (result == ReqResult::Ok)
242 setValue(resp);
243 else
244 {
245 std::string reason;
246 if (result == ReqResult::BadResponse)
247 reason = "BadResponse";
248 else if (result ==
249 ReqResult::NetworkFailure)
250 reason = "NetworkFailure";
251 else if (result ==
252 ReqResult::BadServerAddress)
253 reason = "BadServerAddress";
254 else if (result == ReqResult::Timeout)
255 reason = "Timeout";
256 setException(std::make_exception_ptr(
257 std::runtime_error(reason)));
258 }
259 handle.resume();
260 });
261}
262#endif
263
264} // namespace drogon
WebSocket client abstract class.
Definition WebSocketClient.h:62
static WebSocketClientPtr newWebSocketClient(const std::string &hostString, trantor::EventLoop *loop=nullptr, bool useOldTLS=false, bool validateCert=true)
static WebSocketClientPtr newWebSocketClient(const std::string &ip, uint16_t port, bool useSSL=false, trantor::EventLoop *loop=nullptr, bool useOldTLS=false, bool validateCert=true)
Create a websocket client using the given ip and port to connect to server.
virtual WebSocketConnectionPtr getConnection()=0
Get the WebSocket connection that is typically used to send messages.
virtual void setMessageHandler(const std::function< void(std::string &&message, const WebSocketClientPtr &, const WebSocketMessageType &)> &callback)=0
Set messages handler. When a message is received from the server, the callback is called.
virtual void stop()=0
Stop trying to connect to the server or close the connection.
virtual void addSSLConfigs(const std::vector< std::pair< std::string, std::string > > &sslConfCmds)=0
Supplies command style options for SSL_CONF_cmd.
virtual trantor::EventLoop * getLoop()=0
Get the event loop of the client;.
virtual void setConnectionClosedHandler(const std::function< void(const WebSocketClientPtr &)> &callback)=0
Set the connection closing handler. When the websocket connection is closed, the callback is called.
virtual void connectToServer(const HttpRequestPtr &request, const WebSocketRequestCallback &callback)=0
Connect to the server.
virtual void setCertPath(const std::string &cert, const std::string &key)=0
Set the client certificate used by the HTTP connection.
Drogon Test is a minimal effort test framework developed because the major C++ test frameworks doesn'...
Definition Attribute.h:23
Definition coroutine.h:355
Definition coroutine.h:161