Logo ROOT  
Reference Guide
Loading...
Searching...
No Matches
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 {
27
28/// just wrapper to deliver websockets call-backs to the RWebWindow class
29
31
32protected:
33 Bool_t ProcessBatchHolder(std::shared_ptr<THttpCallArg> &arg) override
34 {
35 return IsDisabled() ? kFALSE : fWindow.ProcessBatchHolder(arg);
36 }
37
38 std::string GetCodeVersion() override { return fWindow.GetClientVersion(); }
39
40
41 void VerifyDefaultPageContent(std::shared_ptr<THttpCallArg> &arg) override
42 {
43 auto token = fWindow.GetConnToken();
44 if (!token.empty()) {
45 TUrl url;
46 url.SetOptions(arg->GetQuery());
47 // refuse connection which does not provide proper token
48 if (!url.HasOption("token") || (token != url.GetValueFromOptions("token"))) {
49 // refuse loading of default web page without token
50 arg->SetContent("refused");
51 arg->Set404();
52 return;
53 }
54 }
55
56 if (fWindow.IsRequireAuthKey()) {
57 TUrl url;
58 url.SetOptions(arg->GetQuery());
59 TString key = url.GetValueFromOptions("key");
60 if (key.IsNull() || !fWindow.HasKey(key.Data(), true)) {
61 // refuse loading of default web page without valid key
62 arg->SetContent("refused");
63 arg->Set404();
64 return;
65 }
66 }
67
68 auto version = fWindow.GetClientVersion();
69 if (!version.empty()) {
70 // replace link to JSROOT modules in import statements emulating new version for browser
71 std::string search = "from './jsrootsys/"s;
72 std::string replace = "from './"s + version + "/jsrootsys/"s;
73 arg->ReplaceAllinContent(search, replace);
74 // replace link to ROOT ui5 modules in import statements emulating new version for browser
75 search = "from './rootui5sys/"s;
76 replace = "from './"s + version + "/rootui5sys/"s;
77 arg->ReplaceAllinContent(search, replace);
78 // replace link on old JSRoot.core.js script - if still appears
79 search = "jsrootsys/scripts/JSRoot.core."s;
80 replace = version + "/jsrootsys/scripts/JSRoot.core."s;
81 arg->ReplaceAllinContent(search, replace, true);
82 arg->AddNoCacheHeader();
83 }
84
85 std::string more_args;
86
87 std::string wskind = arg->GetWSKind();
88 if ((wskind == "websocket") && (GetBoolEnv("WebGui.WSLongpoll") == 1))
89 wskind = "longpoll";
90 if (!wskind.empty() && (wskind != "websocket"))
91 more_args.append("socket_kind: \""s + wskind + "\","s);
92 std::string wsplatform = arg->GetWSPlatform();
93 if (!wsplatform.empty() && (wsplatform != "http"))
94 more_args.append("platform: \""s + wsplatform + "\","s);
95 const char *ui5source = gEnv->GetValue("WebGui.openui5src","");
96 if (ui5source && *ui5source)
97 more_args.append("openui5src: \""s + ui5source + "\","s);
98 const char *ui5libs = gEnv->GetValue("WebGui.openui5libs","");
99 if (ui5libs && *ui5libs)
100 more_args.append("openui5libs: \""s + ui5libs + "\","s);
101 const char *ui5theme = gEnv->GetValue("WebGui.openui5theme","");
102 if (ui5theme && *ui5theme)
103 more_args.append("openui5theme: \""s + ui5theme + "\","s);
104 if (GetBoolEnv("WebGui.DarkMode") == 1)
105 more_args.append("dark: true,"s);
106 int credits = gEnv->GetValue("WebGui.ConnCredits", 10);
107 if ((credits > 0) && (credits != 10))
108 more_args.append("credits: "s + std::to_string(credits) + ","s);
109 if ((fWindow.GetWidth() > 0) && (fWindow.GetHeight() > 0))
110 more_args.append("winW:"s + std::to_string(fWindow.GetWidth()) + ",winH:"s + std::to_string(fWindow.GetHeight()) + ","s);
111 if ((fWindow.GetX() >= 0) && (fWindow.GetY() >= 0))
112 more_args.append("winX:"s + std::to_string(fWindow.GetX()) + ",winY:"s + std::to_string(fWindow.GetY()) + ","s);
113 if (GetBoolEnv("WebGui.Debug") == 1)
114 more_args.append("debug: true,");
115 auto user_args = fWindow.GetUserArgs();
116 if (!user_args.empty())
117 more_args.append("user_args: "s + user_args + ","s);
118 if (!RWebWindow::gJSROOTsettings.empty())
119 more_args.append("settings: "s + RWebWindow::gJSROOTsettings + ","s);
120 if (!more_args.empty()) {
121 std::string search = "connectWebWindow({"s;
122 std::string replace = search + more_args;
123 arg->ReplaceAllinContent(search, replace, true);
124 arg->AddNoCacheHeader();
125 }
126 }
127
128public:
129 RWebWindow &fWindow; ///<! window reference
130
131 /// constructor
133 : THttpWSHandler(name, "RWebWindow websockets handler", kFALSE), fWindow(wind)
134 {
135 }
136
137 ~RWebWindowWSHandler() override = default;
138
139 /// returns content of default web-page
140 /// THttpWSHandler interface
141 TString GetDefaultPageContent() override { return IsDisabled() ? "" : fWindow.fDefaultPage.c_str(); }
142
143 /// returns true when window allowed to serve files relative to default page
144 Bool_t CanServeFiles() const override { return !IsDisabled(); }
145
146 /// Process websocket request - called from THttpServer thread
147 /// THttpWSHandler interface
149 {
150 if (!arg || IsDisabled()) return kFALSE;
151 return fWindow.ProcessWS(*arg);
152 }
153
154 /// Allow processing of WS actions in arbitrary thread
155 Bool_t AllowMTProcess() const override { return fWindow.fProcessMT; }
156
157 /// Allows usage of special threads for send operations
158 Bool_t AllowMTSend() const override { return fWindow.fSendMT; }
159
160 /// React on completion of multi-threaded send operation
161 void CompleteWSSend(UInt_t wsid) override { if (!IsDisabled()) fWindow.CompleteWSSend(wsid); }
162
163 static int GetBoolEnv(const std::string &name, int dfl = -1);
164};
165
166} // namespace ROOT
167
168#endif
bool Bool_t
Boolean (0=false, 1=true) (bool).
Definition RtypesCore.h:77
constexpr Bool_t kFALSE
Definition RtypesCore.h:108
externTEnv * gEnv
Definition TEnv.h:170
char name[80]
Definition TGX11.cxx:148
std::string GetCodeVersion() override
Method generate extra suffix for all kinds of loaded code.
RWebWindow & fWindow
! window reference
~RWebWindowWSHandler() override=default
Bool_t AllowMTSend() const override
Allows usage of special threads for send operations.
Bool_t CanServeFiles() const override
returns true when window allowed to serve files relative to default page
Bool_t ProcessWS(THttpCallArg *arg) override
Process websocket request - called from THttpServer thread THttpWSHandler interface.
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.
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.
void CompleteWSSend(UInt_t wsid) override
React on completion of multi-threaded send operation.
static int GetBoolEnv(const std::string &name, int dfl=-1)
Parse boolean gEnv variable which should be "yes" or "no".
TString GetDefaultPageContent() override
returns content of default web-page THttpWSHandler interface
RWebWindowWSHandler(RWebWindow &wind, const char *name)
constructor
Represents web window, which can be shown in web browser or any other supported environment.
static std::string gJSROOTsettings
! custom settings for JSROOT
Contains arguments for single HTTP call.
Bool_t IsDisabled() const
Returns true when processing of websockets is disabled, set shortly before handler need to be destroy...
THttpWSHandler(const char *name, const char *title, Bool_t syncmode=kTRUE)
normal constructor
Basic string class.
Definition TString.h:138
const char * Data() const
Definition TString.h:384
Bool_t IsNull() const
Definition TString.h:422
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:662
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:685