WebSocketService.h
1/* Copyright (C) 2015 by Laurentiu-Gheorghe Crisan
2 Copyright (C) 2026 by Marc Boris Duerner
3 SPDX-License-Identifier: LGPL-2.1-or-later WITH mif-exception
4*/
5
6#ifndef PT_HTTP_WEBSOCKETSERVICE_H
7#define PT_HTTP_WEBSOCKETSERVICE_H
8
9#include <Pt/Http/Api.h>
10#include <Pt/Http/Service.h>
11#include <Pt/Http/WebSocketSession.h>
12#include <Pt/Allocator.h>
13#include <Pt/Connectable.h>
14#include <string>
15#include <vector>
16#include <cstddef>
17
18namespace Pt {
19
20namespace Http {
21
22class Request;
23class Reply;
24class Responder;
25class Stream;
27
130class PT_HTTP_API WebSocketService : public Service
131 , public Connectable
132{
133 friend class WebSocketSession;
134 friend class WebSocketServlet;
135
136 public:
140
147
150 const std::vector<std::string>& protocols() const
151 { return _protocols; }
152
161 void addProtocol(const std::string& name);
162
166
172 std::size_t maxSockets() const
173 { return _maxSockets; }
174
182 void setMaxSockets(std::size_t n)
183 { _maxSockets = n; }
184
191 std::size_t idleTimeout() const
192 { return _idleTimeout; }
193
202 void setIdleTimeout(std::size_t ms)
203 { _idleTimeout = ms; }
204
211 std::size_t pingInterval() const
212 { return _pingInterval; }
213
222 void setPingInterval(std::size_t ms)
223 { _pingInterval = ms; }
224
231 std::size_t pingTimeout() const
232 { return _pingTimeout; }
233
241 void setPingTimeout(std::size_t ms)
242 { _pingTimeout = ms; }
243
250 std::size_t closeTimeout() const
251 { return _closeTimeout; }
252
260 void setCloseTimeout(std::size_t ms)
261 { _closeTimeout = ms; }
262
268 std::size_t maxMessageSize() const
269 { return _maxMessageSize; }
270
278 void setMaxMessageSize(std::size_t n)
279 { _maxMessageSize = n; }
280
286 bool hasServlet() const
287 { return _servlet != 0; }
288
296 std::size_t socketCount() const
297 { return _socketCount; }
298
306 WebSocketSession* getSession(Stream& stream,
307 const Request& request,
308 const Reply& reply);
309
316 void releaseSession(WebSocketSession* session);
317
318 protected:
322
325 virtual void onReleaseResponder(Responder* responder);
326
332 virtual void onUpgrade(Stream& stream,
333 const Request& request,
334 const Reply& reply) final;
335
336 protected:
345 virtual WebSocketSession* onGetSession(Stream& stream,
346 const Request& request,
347 const Reply& reply) = 0;
348
355 virtual void onReleaseSession(WebSocketSession* session) = 0;
356
357 private:
358 void attach(WebSocketServlet& servlet);
359
360 void detach(WebSocketServlet& servlet);
361
362 WebSocketServlet* servlet()
363 { return _servlet; }
364
370 void close(WebSocketSession& session);
371
372 private:
373 WebSocketServlet* _servlet;
374 std::size_t _socketCount;
375 std::size_t _maxSockets;
376 std::size_t _idleTimeout;
377 std::size_t _pingInterval;
378 std::size_t _pingTimeout;
379 std::size_t _closeTimeout;
380 std::size_t _maxMessageSize;
381 std::vector<std::string> _protocols;
382};
383
388template <typename S, typename Alloc = Allocator>
390{
391 public:
396
401
402 protected:
403 virtual WebSocketSession* onGetSession(Stream& stream,
404 const Request& /*request*/,
405 const Reply& reply)
406 {
407 void* memory = _alloc.allocate(sizeof(S));
408 return new(memory) S(*this, stream, reply);
409 }
410
411 virtual void onReleaseSession(WebSocketSession* session)
412 {
413 session->~WebSocketSession();
414 _alloc.deallocate(session, sizeof(S));
415 }
416
417 private:
418 Alloc _alloc;
419};
420
421} // namespace Http
422
423} // namespace Pt
424
425#endif
Connectable()
Default constructor.
virtual WebSocketSession * onGetSession(Stream &stream, const Request &, const Reply &reply)
Creates the session for stream.
Definition WebSocketService.h:403
virtual void onReleaseSession(WebSocketSession *session)
Destroys a session created by onGetSession().
Definition WebSocketService.h:411
BasicWebSocketService()
Default constructor.
Definition WebSocketService.h:394
~BasicWebSocketService()
Destructor.
Definition WebSocketService.h:399
HTTP reply message.
Definition Reply.h:64
HTTP request message.
Definition Request.h:65
Handles one HTTP request and writes the reply.
Definition Responder.h:109
Service()
Default Constructor.
One HTTP stream on a connection.
Definition Stream.h:92
std::size_t idleTimeout() const
Returns the idle timeout in milliseconds.
Definition WebSocketService.h:191
std::size_t pingTimeout() const
Returns the ping timeout in milliseconds.
Definition WebSocketService.h:231
virtual void onReleaseResponder(Responder *responder)
Destroys the handshake responder.
void releaseSession(WebSocketSession *session)
Releases a session created by getSession().
bool hasServlet() const
True when a servlet is attached.
Definition WebSocketService.h:286
void setPingInterval(std::size_t ms)
Sets the ping interval in milliseconds.
Definition WebSocketService.h:222
virtual void onUpgrade(Stream &stream, const Request &request, const Reply &reply) final
Accepts or declines the upgraded stream.
virtual Responder * onGetResponder(const Request &)
Creates the handshake responder.
void setMaxSockets(std::size_t n)
Sets the maximum number of live sessions.
Definition WebSocketService.h:182
std::size_t socketCount() const
Returns the number of counted sessions.
Definition WebSocketService.h:296
void setCloseTimeout(std::size_t ms)
Sets the close timeout in milliseconds.
Definition WebSocketService.h:260
virtual void onReleaseSession(WebSocketSession *session)=0
Destroys a session created by onGetSession().
void setMaxMessageSize(std::size_t n)
Sets the maximum data message size in bytes.
Definition WebSocketService.h:278
WebSocketService()
Default constructor.
void setIdleTimeout(std::size_t ms)
Sets the idle timeout in milliseconds.
Definition WebSocketService.h:202
const std::vector< std::string > & protocols() const
Returns accepted Sec-WebSocket-Protocol names in preference order.
Definition WebSocketService.h:150
std::size_t maxMessageSize() const
Returns the maximum data message size in bytes.
Definition WebSocketService.h:268
std::size_t pingInterval() const
Returns the ping interval in milliseconds.
Definition WebSocketService.h:211
void addProtocol(const std::string &name)
Adds one accepted Sec-WebSocket-Protocol name.
void setPingTimeout(std::size_t ms)
Sets the ping timeout in milliseconds.
Definition WebSocketService.h:241
~WebSocketService()
Destructor.
std::size_t maxSockets() const
Returns the maximum number of live sessions.
Definition WebSocketService.h:172
std::size_t closeTimeout() const
Returns the close timeout in milliseconds.
Definition WebSocketService.h:250
virtual WebSocketSession * onGetSession(Stream &stream, const Request &request, const Reply &reply)=0
Creates the session for stream.
WebSocketSession * getSession(Stream &stream, const Request &request, const Reply &reply)
Creates a session and counts a non-null result.
void clearProtocols()
Drops every accepted protocol name.
Owner of the sessions one WebSocket service creates.
Definition WebSocketServlet.h:72
Server facade of one accepted WebSocket stream.
Definition WebSocketSession.h:157
~WebSocketSession()
Closes the stream.
HTTP clients and servers.
Core module.
Definition Allocator.h:33