Logo ROOT  
Reference Guide
RWebWindowWSHandler.hxx
Go to the documentation of this file.
1// Author: Sergey Linev <s.linev@gsi.de>
2// Date: 2018-08-20
3// Warning: This is part of the ROOT 7 prototype! It will change without notice. It might trigger earthquakes. Feedback is welcome!
4
5/*************************************************************************
6 * Copyright (C) 1995-2019, Rene Brun and Fons Rademakers. *
7 * All rights reserved. *
8 * *
9 * For the licensing terms see $ROOTSYS/LICENSE. *
10 * For the list of contributors see $ROOTSYS/README/CREDITS. *
11 *************************************************************************/
12
13#ifndef ROOT7_RWebWindowWSHandler
14#define ROOT7_RWebWindowWSHandler
15
16#include "THttpWSHandler.h"
17#include "TEnv.h"
18#include "TUrl.h"
19
20#include <ROOT/RWebWindow.hxx>
21
22#include <string>
23
24using namespace std::string_literals;
25
26namespace ROOT {
27namespace Experimental {
28
29/// just wrapper to deliver websockets call-backs to the RWebWindow class
30
32
33protected:
34 Bool_t ProcessBatchHolder(std::shared_ptr<THttpCallArg> &arg) override
35 {
37 }
38
39 void VerifyDefaultPageContent(std::shared_ptr<THttpCallArg> &arg) override
40 {
41 auto token = fWindow.GetConnToken();
42 if (!token.empty()) {
43 TUrl url;
44 url.SetOptions(arg->GetQuery());
45 // refuse connection which does not provide proper token
46 if (!url.HasOption("token") || (token != url.GetValueFromOptions("token"))) {
47 // refuce loading of default web page without token
48 arg->SetContent("refused");
49 arg->Set404();
50 return;
51 }
52 }
53
54 auto version = fWindow.GetClientVersion();
55 if (!version.empty()) {
56 std::string search = "jsrootsys/scripts/JSRoot.core."s;
57 std::string replace = version + "/jsrootsys/scripts/JSRoot.core."s;
58 // replace link to JSROOT main script to emulate new version
59 arg->ReplaceAllinContent(search, replace, true);
60 arg->AddNoCacheHeader();
61 }
62
63 std::string more_args;
64
65 std::string wskind = arg->GetWSKind();
66 if ((wskind == "websocket") && (GetBoolEnv("WebGui.WSLongpoll") == 1))
67 wskind = "longpoll";
68 if (!wskind.empty() && (wskind != "websocket"))
69 more_args.append("socket_kind: \""s + wskind + "\","s);
70 std::string wsplatform = arg->GetWSPlatform();
71 if (!wsplatform.empty() && (wsplatform != "http"))
72 more_args.append("platform: \""s + wsplatform + "\","s);
73 const char *ui5source = gEnv->GetValue("WebGui.openui5src","");
74 if (ui5source && *ui5source)
75 more_args.append("openui5src: \""s + ui5source + "\","s);
76 const char *ui5libs = gEnv->GetValue("WebGui.openui5libs","");
77 if (ui5libs && *ui5libs)
78 more_args.append("openui5libs: \""s + ui5libs + "\","s);
79 const char *ui5theme = gEnv->GetValue("WebGui.openui5theme","");
80 if (ui5theme && *ui5theme)
81 more_args.append("openui5theme: \""s + ui5theme + "\","s);
82 int credits = gEnv->GetValue("WebGui.ConnCredits", 10);
83 if ((credits > 0) && (credits != 10))
84 more_args.append("credits: "s + std::to_string(credits) + ","s);
85 auto user_args = fWindow.GetUserArgs();
86 if (!user_args.empty())
87 more_args.append("user_args: "s + user_args + ","s);
88 if (!more_args.empty()) {
89 std::string search = "JSROOT.connectWebWindow({"s;
90 std::string replace = search + more_args;
91 arg->ReplaceAllinContent(search, replace, true);
92 arg->AddNoCacheHeader();
93 }
94 }
95
96public:
97 RWebWindow &fWindow; ///<! window reference
98
99 /// constructor
101 : THttpWSHandler(name, "RWebWindow websockets handler", kFALSE), fWindow(wind)
102 {
103 }
104
105 virtual ~RWebWindowWSHandler() = default;
106
107 /// returns content of default web-page
108 /// THttpWSHandler interface
109 TString GetDefaultPageContent() override { return IsDisabled() ? "" : fWindow.fDefaultPage.c_str(); }
110
111 /// returns true when window allowed to serve files relative to default page
112 Bool_t CanServeFiles() const override { return !IsDisabled(); }
113
114 /// Process websocket request - called from THttpServer thread
115 /// THttpWSHandler interface
117 {
118 if (!arg || IsDisabled()) return kFALSE;
119 auto res = fWindow.ProcessWS(*arg);
121 return res;
122 }
123
124 /// Allow processing of WS actions in arbitrary thread
125 Bool_t AllowMTProcess() const override { return fWindow.fProcessMT; }
126
127 /// Allows usage of special threads for send operations
128 Bool_t AllowMTSend() const override { return fWindow.fSendMT; }
129
130 /// React on completion of multi-threaded send operation
131 void CompleteWSSend(UInt_t wsid) override { if (!IsDisabled()) fWindow.CompleteWSSend(wsid); }
132
133 static int GetBoolEnv(const std::string &name, int dfl = -1);
134};
135
136} // namespace Experimental
137} // namespace ROOT
138
139#endif
unsigned int UInt_t
Definition: RtypesCore.h:46
const Bool_t kFALSE
Definition: RtypesCore.h:101
bool Bool_t
Definition: RtypesCore.h:63
R__EXTERN TEnv * gEnv
Definition: TEnv.h:170
char name[80]
Definition: TGX11.cxx:110
just wrapper to deliver websockets call-backs to the RWebWindow class
TString GetDefaultPageContent() override
returns content of default web-page THttpWSHandler interface
RWebWindowWSHandler(RWebWindow &wind, const char *name)
constructor
Bool_t AllowMTSend() const override
Allows usage of special threads for send operations.
void CompleteWSSend(UInt_t wsid) override
React on completion of multi-threaded send operation.
Bool_t CanServeFiles() const override
returns true when window allowed to serve files relative to default page
static int GetBoolEnv(const std::string &name, int dfl=-1)
Parse boolean gEnv variable which should be "yes" or "no" Returns 1 for true or 0 for false Returns.
void VerifyDefaultPageContent(std::shared_ptr< THttpCallArg > &arg) override
Method called when default page content is prepared for use By default no-cache header is provided.
RWebWindow & fWindow
! window reference
Bool_t ProcessBatchHolder(std::shared_ptr< THttpCallArg > &arg) override
Method used to accept or reject root_batch_holder.js request.
Bool_t AllowMTProcess() const override
Allow processing of WS actions in arbitrary thread.
Bool_t ProcessWS(THttpCallArg *arg) override
Process websocket request - called from THttpServer thread THttpWSHandler interface.
Represents web window, which can be shown in web browser or any other supported environment.
Definition: RWebWindow.hxx:53
std::string fDefaultPage
! HTML page (or file name) returned when window URL is opened
Definition: RWebWindow.hxx:116
std::string GetClientVersion() const
Returns current client version.
Definition: RWebWindow.cxx:961
bool fSendMT
! true is special threads should be used for sending data
Definition: RWebWindow.hxx:121
bool ProcessBatchHolder(std::shared_ptr< THttpCallArg > &arg)
Process special http request, used to hold headless browser running Such requests should not be repli...
Definition: RWebWindow.cxx:314
std::string GetConnToken() const
Returns configured connection token.
Definition: RWebWindow.cxx:561
std::string GetUserArgs() const
Returns configured user arguments for web window See SetUserArgs method for more details.
Definition: RWebWindow.cxx:983
void CheckThreadAssign()
Internal method to verify and thread id has to be assigned from manager again Special case when Proce...
Definition: RWebWindow.cxx:572
bool ProcessWS(THttpCallArg &arg)
Processing of websockets call-backs, invoked from RWebWindowWSHandler Method invoked from http server...
Definition: RWebWindow.cxx:582
bool fProcessMT
! if window event processing performed in dedicated thread
Definition: RWebWindow.hxx:120
void CompleteWSSend(unsigned wsid)
Complete websocket send operation Clear "doing send" flag and check if next operation has to be start...
Definition: RWebWindow.cxx:764
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
Definition: TEnv.cxx:491
Bool_t IsDisabled() const
Returns true when processing of websockets is disabled, set shortly before handler need to be destroy...
Basic string class.
Definition: TString.h:136
This class represents a WWW compatible URL.
Definition: TUrl.h:33
const char * GetValueFromOptions(const char *key) const
Return a value for a given key from the URL options.
Definition: TUrl.cxx:659
void SetOptions(const char *opt)
Definition: TUrl.h:87
Bool_t HasOption(const char *key) const
Returns true if the given key appears in the URL options list.
Definition: TUrl.cxx:682
tbb::task_arena is an alias of tbb::interface7::task_arena, which doesn't allow to forward declare tb...
static constexpr double s