| 
 | 1 | + | 
 | 2 | +#ifndef RoomsController_hpp  | 
 | 3 | +#define RoomsController_hpp  | 
 | 4 | + | 
 | 5 | +#include "oatpp-websocket/Handshaker.hpp"  | 
 | 6 | + | 
 | 7 | +#include "oatpp/web/server/api/ApiController.hpp"  | 
 | 8 | + | 
 | 9 | +#include "oatpp/network/server/ConnectionHandler.hpp"  | 
 | 10 | + | 
 | 11 | +#include "oatpp/core/macro/codegen.hpp"  | 
 | 12 | +#include "oatpp/core/macro/component.hpp"  | 
 | 13 | + | 
 | 14 | +/**  | 
 | 15 | + * Controller with WebSocket-connect endpoint.  | 
 | 16 | + */  | 
 | 17 | +class RoomsController : public oatpp::web::server::api::ApiController {  | 
 | 18 | +private:  | 
 | 19 | + typedef RoomsController __ControllerType;  | 
 | 20 | +private:  | 
 | 21 | + OATPP_COMPONENT(std::shared_ptr<oatpp::network::server::ConnectionHandler>, websocketConnectionHandler, "websocket");  | 
 | 22 | +public:  | 
 | 23 | + RoomsController(OATPP_COMPONENT(std::shared_ptr<ObjectMapper>, objectMapper))  | 
 | 24 | + : oatpp::web::server::api::ApiController(objectMapper)  | 
 | 25 | + {}  | 
 | 26 | +public:  | 
 | 27 | + | 
 | 28 | +/**  | 
 | 29 | + * Begin ENDPOINTs generation ('ApiController' codegen)  | 
 | 30 | + */  | 
 | 31 | +#include OATPP_CODEGEN_BEGIN(ApiController)  | 
 | 32 | + | 
 | 33 | + ENDPOINT_ASYNC("GET", "/", Root) {  | 
 | 34 | + | 
 | 35 | + ENDPOINT_ASYNC_INIT(Root)  | 
 | 36 | + | 
 | 37 | + const char* pageTemplate =  | 
 | 38 | + "<html lang='en'>"  | 
 | 39 | + "<head>"  | 
 | 40 | + "<meta charset=utf-8/>"  | 
 | 41 | + "</head>"  | 
 | 42 | + "<body>"  | 
 | 43 | + "<p>Hello Async WebSocket Rooms Server!</p>"  | 
 | 44 | + "<p>Connect to chat room:</p>"  | 
 | 45 | + "<code>localhost:8000/ws/chat/{room_name}/?nickname={nickname}</code>"  | 
 | 46 | + "</body>"  | 
 | 47 | + "</html>";  | 
 | 48 | + | 
 | 49 | + Action act() override {  | 
 | 50 | + return _return(controller->createResponse(Status::CODE_200, pageTemplate));  | 
 | 51 | + }  | 
 | 52 | + | 
 | 53 | + };  | 
 | 54 | + | 
 | 55 | + ENDPOINT_ASYNC("GET", "ws/chat/{room-name}/*", WS) {  | 
 | 56 | + | 
 | 57 | + ENDPOINT_ASYNC_INIT(WS)  | 
 | 58 | + | 
 | 59 | + Action act() override {  | 
 | 60 | + | 
 | 61 | + auto roomName = request->getPathVariable("room-name");  | 
 | 62 | + auto nickname = request->getQueryParameter("nickname");  | 
 | 63 | + | 
 | 64 | + OATPP_ASSERT_HTTP(nickname, Status::CODE_400, "No nickname specified.");  | 
 | 65 | + | 
 | 66 | + /* Websocket handshake */  | 
 | 67 | + auto response = oatpp::websocket::Handshaker::serversideHandshake(request->getHeaders(), controller->websocketConnectionHandler);  | 
 | 68 | + | 
 | 69 | + auto parameters = std::make_shared<oatpp::network::server::ConnectionHandler::ParameterMap>();  | 
 | 70 | + | 
 | 71 | + (*parameters)["roomName"] = roomName;  | 
 | 72 | + (*parameters)["nickname"] = nickname;  | 
 | 73 | + | 
 | 74 | + /* Set connection upgrade params */  | 
 | 75 | + response->setConnectionUpgradeParameters(parameters);  | 
 | 76 | + | 
 | 77 | + return _return(response);  | 
 | 78 | + | 
 | 79 | + }  | 
 | 80 | + | 
 | 81 | + };  | 
 | 82 | + | 
 | 83 | + // TODO Insert Your endpoints here !!!  | 
 | 84 | + | 
 | 85 | +/**  | 
 | 86 | + * Finish ENDPOINTs generation ('ApiController' codegen)  | 
 | 87 | + */  | 
 | 88 | +#include OATPP_CODEGEN_END(ApiController)  | 
 | 89 | + | 
 | 90 | +};  | 
 | 91 | + | 
 | 92 | +#endif /* RoomsController_hpp */  | 
0 commit comments