22#include "RConfigure.h"
164 const char *jsrootsys =
gSystem->Getenv(
"JSROOTSYS");
166 jsrootsys =
gEnv->GetValue(
"HttpServ.JSRootPath", jsrootsys);
168 if (jsrootsys && *jsrootsys) {
169 if ((strncmp(jsrootsys,
"http://", 7)==0) || (strncmp(jsrootsys,
"https://", 8)==0))
176 TString jsdir = TString::Format(
"%s/js", TROOT::GetDataDir().Data());
177 if (gSystem->ExpandPathName(jsdir)) {
178 ::Warning(
"THttpServer::THttpServer",
"problems resolving '%s', set JSROOTSYS to proper JavaScript ROOT location",
186 Bool_t basic_sniffer = strstr(engine,
"basic_sniffer") !=
nullptr;
188 AddLocation(
"jsrootsys/", fJSROOTSYS.Data());
190 if (!basic_sniffer) {
191 AddLocation(
"currentdir/",
".");
195 fDefaultPage = fJSROOTSYS +
"/files/online.htm";
196 fDrawPage = fJSROOTSYS +
"/files/draw.htm";
213 if (strchr(engine,
';') == 0) {
214 CreateEngine(engine);
220 if ((strcmp(opt,
"readonly") == 0) || (strcmp(opt,
"ro") == 0)) {
221 GetSniffer()->SetReadOnly(
kTRUE);
222 }
else if ((strcmp(opt,
"readwrite") == 0) || (strcmp(opt,
"rw") == 0)) {
223 GetSniffer()->SetReadOnly(
kFALSE);
224 }
else if (strcmp(opt,
"global") == 0) {
225 GetSniffer()->SetScanGlobalDir(
kTRUE);
226 }
else if (strcmp(opt,
"noglobal") == 0) {
227 GetSniffer()->SetScanGlobalDir(
kFALSE);
228 }
else if (strncmp(opt,
"cors=", 5) == 0) {
230 }
else if (strcmp(opt,
"cors") == 0) {
251 while (
auto engine =
dynamic_cast<THttpEngine *
>(iter()))
324 fSniffer->SetAllowPostObject(allow_post_obj);
359 if (!prefix || (*prefix == 0))
382 fJSROOT = location ? location :
"";
449 const char *arg = strchr(engine,
':');
455 clname.
Append(engine, arg - engine);
460 if ((clname.
Length() == 0) || (clname ==
"http") || (clname ==
"civetweb")) {
463 }
else if (clname ==
"socket") {
469 }
else if (clname ==
"https") {
471 }
else if (clname ==
"fastcgi") {
523 Error(
"SetTimer",
"Server runs already in special thread, therefore no any timer can be created");
525 fTimer = std::make_unique<THttpTimer>(milliSec,
mode, *
this);
549 std::thread thrd([
this] {
559 std::this_thread::sleep_for(std::chrono::milliseconds(1));
564 fThrd = std::move(thrd);
589 if (!fname || (*fname == 0))
597 const char *next = strpbrk(fname,
"/\\");
602 if ((next == fname + 2) && (*fname ==
'.') && (*(fname + 1) ==
'.')) {
611 if ((next == fname + 1) && (*fname ==
'.')) {
639 if (!uri || (*uri == 0))
648 fname.
Remove(0, pos + (entry.first.length() - 1));
651 res = entry.second.c_str();
652 if ((fname[0] ==
'/') && (res[res.
Length() - 1] ==
'/'))
684 std::unique_lock<std::mutex> lk(
fMutex);
713 arg->NotifyCondition();
718 std::unique_lock<std::mutex> lk(
fMutex);
739 Warning(
"ProcessRequests",
"Changing main thread to %ld", (
long)
id);
759 std::unique_lock<std::mutex> lk(
fMutex, std::defer_lock);
763 std::shared_ptr<THttpCallArg> arg;
766 if (!
fArgs.empty()) {
775 if (arg->fFileName ==
"root_batch_holder.js") {
780 auto prev =
fSniffer->SetCurrentCallArg(arg.get());
790 arg->NotifyCondition();
795 while (
auto engine =
static_cast<THttpEngine *
>(iter())) {
826 auto wsptr =
FindWS(arg->GetPathName());
828 if (!wsptr || !wsptr->ProcessBatchHolder(arg)) {
830 arg->NotifyCondition();
840 std::string arr =
"[";
843 std::lock_guard<std::mutex> grd(
fWSMutex);
845 if (arr.length() > 1)
848 arr.append(
TString::Format(
"{ name: \"%s\", title: \"%s\" }", ws->GetName(), ws->GetTitle()).Data());
856 std::string arg =
"\"$$$wslist$$$\"";
858 auto pos = res.find(arg);
859 if (pos != std::string::npos)
860 res.replace(pos, arg.length(), arr);
874 const std::string place_holder =
"<!--jsroot_importmap-->";
876 auto p = arg->fContent.find(place_holder);
878 bool old_format = (p == std::string::npos);
882 if (arg->fPathName.Length() > 0)
884 for (
Int_t n = 1;
n < arg->fPathName.Length()-1; ++
n)
885 if (arg->fPathName[
n] ==
'/') {
886 if (arg->fPathName[
n-1] !=
'/') {
898 if (!version.empty()) {
900 std::string search =
"from './jsrootsys/";
901 std::string replace =
"from './" + version +
"/jsrootsys/";
902 arg->ReplaceAllinContent(search, replace);
904 search =
"from './rootui5sys/";
905 replace =
"from './" + version +
"/rootui5sys/";
906 arg->ReplaceAllinContent(search, replace);
908 search =
"jsrootsys/scripts/JSRoot.core.";
909 replace = version +
"/jsrootsys/scripts/JSRoot.core.";
910 arg->ReplaceAllinContent(search, replace,
true);
911 arg->AddNoCacheHeader();
919 if (repl.back() !=
'/')
924 while (slash_cnt-- > 0) repl.append(
"../");
925 repl.append(
"jsrootsys/");
930 arg->ReplaceAllinContent(
"=\"jsrootsys/", repl);
931 arg->ReplaceAllinContent(
"from './jsrootsys/",
TString::Format(
"from '%s", repl.substr(2).c_str()).Data());
936 std::string path_prefix, jsroot_prefix;
939 while (slash_cnt-- > 0)
940 path_prefix.append(
"../");
945 if (!version.empty())
946 path_prefix.append(version +
"/");
949 jsroot_prefix =
fJSROOT.Data();
950 if (jsroot_prefix.back() !=
'/')
951 jsroot_prefix.append(
"/");
953 jsroot_prefix = path_prefix +
"jsrootsys/";
956 static std::map<std::string, std::string> modules = {
957 {
"jsroot",
"main.mjs"}, {
"jsroot/core",
"core.mjs"}, {
"jsroot/io",
"io.mjs"}, {
"jsroot/tree",
"tree.mjs"},
958 {
"jsroot/draw",
"draw.mjs"}, {
"jsroot/geom",
"geom.mjs"}, {
"jsroot/gui",
"gui.mjs"}, {
"jsroot/webwindow",
"webwindow.mjs"}
962 TString importmap =
"<script type=\"importmap\">\n{\n \"imports\": ";
963 for (
auto &entry : modules) {
964 importmap.
Append(
TString::Format(
"%s\n \"%s\": \"%smodules/%s\"", first ?
"{" :
",", entry.first.c_str(), jsroot_prefix.c_str(), entry.second.c_str()));
970 if (entry.first !=
"jsrootsys/")
971 importmap.
Append(
TString::Format(
",\n \"%s\": \"%s%s\"", entry.first.c_str(), path_prefix.c_str(), entry.first.c_str()));
972 importmap.
Append(
"\n }\n}\n</script>\n");
974 arg->fContent.erase(p, place_holder.length());
976 arg->fContent.insert(p, importmap.
Data());
993 if ((arg->fFileName ==
"root.websocket") || (arg->fFileName ==
"root.longpoll")) {
998 if (arg->fFileName.IsNull() || (arg->fFileName ==
"index.htm") || (arg->fFileName ==
"default.htm")) {
1000 std::string version;
1002 if (arg->fFileName ==
"default.htm") {
1008 auto wsptr =
FindWS(arg->GetPathName());
1010 auto handler = wsptr.get();
1017 arg->fContent = handler->GetDefaultPageContent().Data();
1019 if (arg->fContent.find(
"file:") == 0) {
1020 const char *fname = arg->fContent.c_str() + 5;
1026 version = handler->GetCodeVersion();
1028 handler->VerifyDefaultPageContent(arg);
1032 if (arg->fContent.empty() && arg->fFileName.IsNull() && arg->fPathName.IsNull() &&
IsWSOnly()) {
1037 arg->SetContent(
"refused");
1041 if (arg->fContent.empty() && !
IsWSOnly()) {
1049 if (arg->fContent.empty()) {
1052 }
else if (!arg->Is404()) {
1056 const char *hjsontag =
"\"$$$h.json$$$\"";
1059 if (arg->fContent.find(hjsontag) != std::string::npos) {
1062 const char *topname =
fTopName.Data();
1063 if (arg->fTopName.Length() > 0)
1064 topname = arg->fTopName.Data();
1065 fSniffer->ScanHierarchy(topname, arg->fPathName.Data(), &store);
1067 arg->ReplaceAllinContent(hjsontag, h_json.
Data());
1069 arg->AddNoCacheHeader();
1071 if (arg->fQuery.Index(
"nozip") ==
kNPOS)
1074 arg->SetContentType(
"text/html");
1079 if ((arg->fFileName ==
"draw.htm") && !
IsWSOnly()) {
1086 const char *rootjsontag =
"\"$$$root.json$$$\"";
1087 const char *hjsontag =
"\"$$$h.json$$$\"";
1093 if ((arg->fQuery.Index(
"no_h_json") ==
kNPOS) && (arg->fQuery.Index(
"webcanvas") ==
kNPOS) &&
1094 (arg->fContent.find(hjsontag) != std::string::npos)) {
1097 const char *topname =
fTopName.Data();
1098 if (arg->fTopName.Length() > 0)
1099 topname = arg->fTopName.Data();
1100 fSniffer->ScanHierarchy(topname, arg->fPathName.Data(), &store,
kTRUE);
1102 arg->ReplaceAllinContent(hjsontag, h_json.
Data());
1105 if ((arg->fQuery.Index(
"no_root_json") ==
kNPOS) && (arg->fQuery.Index(
"webcanvas") ==
kNPOS) &&
1106 (arg->fContent.find(rootjsontag) != std::string::npos)) {
1108 if (
fSniffer->Produce(arg->fPathName.Data(),
"root.json",
"compact=23", str))
1109 arg->ReplaceAllinContent(rootjsontag, str);
1111 arg->AddNoCacheHeader();
1112 if (arg->fQuery.Index(
"nozip") ==
kNPOS)
1114 arg->SetContentType(
"text/html");
1119 if ((arg->fFileName ==
"favicon.ico") && arg->fPathName.IsNull()) {
1120 arg->SetFile(
fJSROOTSYS +
"/img/RootIcon.ico");
1131 if (!arg->fPathName.IsNull() && !arg->fFileName.IsNull()) {
1132 TString wsname = arg->fPathName, fname;
1133 auto pos = wsname.
First(
'/');
1135 wsname = arg->fPathName;
1137 wsname = arg->fPathName(0, pos);
1138 fname = arg->fPathName(pos + 1, arg->fPathName.Length() - pos);
1142 fname.Append(arg->fFileName);
1148 if (ws && ws->CanServeFiles()) {
1149 TString fdir = ws->GetDefaultPageContent();
1151 if (fdir.
Index(
"file:") == 0) {
1153 auto separ = fdir.
Last(
'/');
1176 if (arg->fContent.empty())
1180 Bool_t compact = arg->fQuery.Index(
"compact") !=
kNPOS;
1184 res.
Form(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
1193 const char *topname =
fTopName.Data();
1194 if (arg->fTopName.Length() > 0)
1195 topname = arg->fTopName.Data();
1196 fSniffer->ScanHierarchy(topname, arg->fPathName.Data(), &store,
filename ==
"get.xml");
1203 arg->SetContent(std::string(res.
Data()));
1209 const char *topname =
fTopName.Data();
1210 if (arg->fTopName.Length() > 0)
1211 topname = arg->fTopName.Data();
1212 fSniffer->ScanHierarchy(topname, arg->fPathName.Data(), &store);
1213 arg->SetContent(std::string(res.
Data()));
1215 }
else if (
fSniffer->Produce(arg->fPathName.Data(),
filename.Data(), arg->fQuery.Data(), arg->fContent)) {
1232 const char *parname =
fSniffer->IsStreamerInfoItem(arg->fPathName.Data()) ?
"BVersion" :
"MVersion";
1237 arg->AddNoCacheHeader();
1241 arg->AddHeader(
"Access-Control-Allow-Origin",
GetCors());
1253 return fSniffer->RegisterObject(subfolder, obj);
1263 return fSniffer->UnregisterObject(obj);
1273 std::lock_guard<std::mutex> grd(
fWSMutex);
1282 std::lock_guard<std::mutex> grd(
fWSMutex);
1295 std::lock_guard<std::mutex> grd(
fWSMutex);
1297 if (strcmp(
name, ws->GetName()) == 0)
1314 auto wsptr =
FindWS(arg->GetPathName());
1316 auto handler = wsptr.get();
1318 if (!handler && !external_thrd)
1321 if (external_thrd && (!handler || !handler->AllowMTProcess())) {
1326 std::unique_lock<std::mutex> lk(
fMutex);
1330 arg->fCond.wait(lk);
1342 if (arg->fFileName ==
"root.websocket") {
1344 process = handler->HandleWS(arg);
1345 }
else if (arg->fFileName ==
"root.longpoll") {
1347 if (arg->fQuery.BeginsWith(
"raw_connect") || arg->fQuery.BeginsWith(
"txt_connect")) {
1350 arg->SetMethod(
"WS_CONNECT");
1352 bool israw = arg->fQuery.BeginsWith(
"raw_connect");
1357 if (handler->HandleWS(arg)) {
1358 arg->SetMethod(
"WS_READY");
1360 if (handler->HandleWS(arg))
1361 arg->SetTextContent(std::string(israw ?
"txt:" :
"") + std::to_string(arg->GetWSId()));
1363 arg->TakeWSEngine();
1366 process = arg->IsText();
1373 arg->SetWSId(std::stoul(connid));
1375 arg->SetMethod(
"WS_CLOSE");
1376 arg->SetTextContent(
"OK");
1378 arg->SetMethod(
"WS_DATA");
1381 process = handler->HandleWS(arg);
1440 return fSniffer->RegisterCommand(cmdname, method, icon);
1448 return SetItemField(foldername,
"_hidden", hide ?
"true" : (
const char *)0);
1467 return fSniffer->CreateItem(fullname, title);
1491 static const struct {
1496 {
".json", 5,
"application/json"},
1497 {
".bin", 4,
"application/x-binary"},
1498 {
".gif", 4,
"image/gif"},
1499 {
".jpg", 4,
"image/jpeg"},
1500 {
".png", 4,
"image/png"},
1501 {
".html", 5,
"text/html"},
1502 {
".htm", 4,
"text/html"},
1503 {
".shtm", 5,
"text/html"},
1504 {
".shtml", 6,
"text/html"},
1505 {
".css", 4,
"text/css"},
1506 {
".js", 3,
"application/x-javascript"},
1507 {
".mjs", 4,
"text/javascript"},
1508 {
".ico", 4,
"image/x-icon"},
1509 {
".jpeg", 5,
"image/jpeg"},
1510 {
".svg", 4,
"image/svg+xml"},
1511 {
".txt", 4,
"text/plain"},
1512 {
".torrent", 8,
"application/x-bittorrent"},
1513 {
".wav", 4,
"audio/x-wav"},
1514 {
".mp3", 4,
"audio/x-mp3"},
1515 {
".mid", 4,
"audio/mid"},
1516 {
".m3u", 4,
"audio/x-mpegurl"},
1517 {
".ogg", 4,
"application/ogg"},
1518 {
".ram", 4,
"audio/x-pn-realaudio"},
1519 {
".xslt", 5,
"application/xml"},
1520 {
".xsl", 4,
"application/xml"},
1521 {
".ra", 3,
"audio/x-pn-realaudio"},
1522 {
".doc", 4,
"application/msword"},
1523 {
".exe", 4,
"application/octet-stream"},
1524 {
".zip", 4,
"application/x-zip-compressed"},
1525 {
".xls", 4,
"application/excel"},
1526 {
".tgz", 4,
"application/x-tar-gz"},
1527 {
".tar", 4,
"application/x-tar"},
1528 {
".gz", 3,
"application/x-gunzip"},
1529 {
".arj", 4,
"application/x-arj-compressed"},
1530 {
".rar", 4,
"application/x-arj-compressed"},
1531 {
".rtf", 4,
"application/rtf"},
1532 {
".pdf", 4,
"application/pdf"},
1533 {
".swf", 4,
"application/x-shockwave-flash"},
1534 {
".mpg", 4,
"video/mpeg"},
1535 {
".webm", 5,
"video/webm"},
1536 {
".mpeg", 5,
"video/mpeg"},
1537 {
".mov", 4,
"video/quicktime"},
1538 {
".mp4", 4,
"video/mp4"},
1539 {
".m4v", 4,
"video/x-m4v"},
1540 {
".asf", 4,
"video/x-ms-asf"},
1541 {
".avi", 4,
"video/x-msvideo"},
1542 {
".bmp", 4,
"image/bmp"},
1543 {
".ttf", 4,
"application/x-font-ttf"},
1544 {
".woff", 5,
"font/woff"},
1545 {
".woff2", 6,
"font/woff2"},
1548 int path_len = strlen(path);
1559 return "text/plain";
1571 std::ifstream is(
filename, std::ios::in | std::ios::binary);
1575 is.seekg(0, is.end);
1577 is.seekg(0, is.beg);
1595 std::ifstream is(
filename, std::ios::in | std::ios::binary);
1598 is.seekg(0, std::ios::end);
1599 res.resize(is.tellg());
1600 is.seekg(0, std::ios::beg);
1601 is.read((
char *)res.data(), res.length());
if(isa< VarDecl >(D)||isa< FieldDecl >(D)||isa< EnumConstantDecl >(D))
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char filename
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize id
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void on
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void value
Option_t Option_t TPoint TPoint const char GetTextMagnitude GetFillStyle GetLineColor GetLineWidth GetMarkerStyle GetTextAlign GetTextColor GetTextSize void char Point_t Rectangle_t WindowAttributes_t Float_t Float_t Float_t Int_t Int_t UInt_t UInt_t Rectangle_t Int_t Int_t Window_t TString Int_t GCValues_t GetPrimarySelectionOwner GetDisplay GetScreen GetColormap GetNativeEvent const char const char dpyName wid window const char font_name cursor keysym reg const char only_if_exist regb h Point_t winding char text const char depth char const char Int_t count const char ColorStruct_t color const char Pixmap_t Pixmap_t PictureAttributes_t attr const char char ret_data h unsigned char height h Atom_t Int_t ULong_t ULong_t unsigned char prop_list Atom_t Atom_t Atom_t Time_t UChar_t len
Option_t Option_t TPoint TPoint const char mode
R__EXTERN TSystem * gSystem
static const struct @243147061004330160235326056313274363054075327066 builtin_mime_types[]
THttpEngine implementation, based on civetweb embedded server.
TClass instances represent classes, structs and namespaces in the ROOT type system.
void * New(ENewType defConstructor=kClassNew, Bool_t quiet=kFALSE) const
Return a pointer to a newly allocated object of this class.
static TClass * GetClass(const char *name, Bool_t load=kTRUE, Bool_t silent=kFALSE)
Static method returning pointer to TClass of the specified class name.
THttpEngine implementation, based on fastcgi package.
Contains arguments for single HTTP call.
void Set404()
mark reply as 404 error - page/request not exists or refused
Abstract class for implementing http protocol for THttpServer.
void SetServer(THttpServer *serv)
virtual Bool_t Create(const char *)
Method to create all components of engine.
Emulation of websocket with long poll requests.
Online http server for arbitrary ROOT application.
Bool_t IsReadOnly() const
returns read-only mode
Bool_t RegisterCommand(const char *cmdname, const char *method, const char *icon=nullptr)
Register command which can be executed from web interface.
TString fJSROOT
! location of external JSROOT files
virtual void ProcessRequest(std::shared_ptr< THttpCallArg > arg)
Process single http request.
std::shared_ptr< THttpWSHandler > FindWS(const char *name)
Find web-socket handler with given name.
std::unique_ptr< TRootSniffer > fSniffer
! sniffer provides access to ROOT objects hierarchy
void SetTimer(Long_t milliSec=100, Bool_t mode=kTRUE)
Create timer which will invoke ProcessRequests() function periodically.
virtual void ProcessBatchHolder(std::shared_ptr< THttpCallArg > &arg)
Process special http request for root_batch_holder.js script.
std::vector< std::shared_ptr< THttpWSHandler > > fWSHandlers
! list of WS handlers
virtual ~THttpServer()
destructor
void SetTerminate()
set termination flag, no any further requests will be processed
virtual void MissedRequest(THttpCallArg *arg)
Method called when THttpServer cannot process request.
Bool_t fOwnThread
! true when specialized thread allocated for processing requests
void SetSniffer(TRootSniffer *sniff)
Set TRootSniffer to the server.
Bool_t IsFileRequested(const char *uri, TString &res) const
Check if file is requested, thread safe.
void SetReadOnly(Bool_t readonly=kTRUE)
Set read-only mode for the server (default on)
const char * GetItemField(const char *fullname, const char *name)
Get item field from sniffer.
const char * GetCors() const
Returns specified CORS domain.
std::thread fThrd
! own thread
void StopServerThread()
Stop server thread.
Int_t ProcessRequests()
Process submitted requests, must be called from appropriate thread.
Bool_t ExecuteWS(std::shared_ptr< THttpCallArg > &arg, Bool_t external_thrd=kFALSE, Bool_t wait_process=kFALSE)
Execute WS request.
void RegisterWS(std::shared_ptr< THttpWSHandler > ws)
Register WS handler.
Long_t fProcessingThrdId
! id of the thread where events are recently processing
TString fTopName
! name of top folder, default - "ROOT"
void SetDrawPage(const std::string &filename="")
Set drawing HTML page.
Bool_t CreateItem(const char *fullname, const char *title)
Create item in sniffer.
Bool_t ExecuteHttp(std::shared_ptr< THttpCallArg > arg)
Execute HTTP request.
Bool_t Hide(const char *fullname, Bool_t hide=kTRUE)
Hides folder or element from web gui.
Bool_t IsCorsCredentials() const
Returns kTRUE if Access-Control-Allow-Credentials header should be used.
void AddLocation(const char *prefix, const char *path)
Add files location, which could be used in the server.
std::map< std::string, std::string > fLocations
! list of local directories, which could be accessed via server
Bool_t SubmitHttp(std::shared_ptr< THttpCallArg > arg, Bool_t can_run_immediately=kFALSE)
Submit HTTP request.
Long_t fMainThrdId
! id of the thread for processing requests
TString fJSROOTSYS
! location of local JSROOT files
std::unique_ptr< THttpTimer > fTimer
! timer used to access main thread
Bool_t fWSOnly
! when true, handle only websockets / longpoll engine
Bool_t Register(const char *subfolder, TObject *obj)
Register object in subfolder.
TList fEngines
! engines which runs http server
Bool_t IsCors() const
Returns kTRUE if CORS was configured.
const char * GetCorsCredentials() const
Returns specified CORS credentials value - if any.
std::queue< std::shared_ptr< THttpCallArg > > fArgs
! submitted arguments
void SetDefaultPage(const std::string &filename="")
Set default HTML page.
THttpServer(const THttpServer &)=delete
static char * ReadFileContent(const char *filename, Int_t &len)
Reads content of file from the disk.
void CreateServerThread()
Creates special thread to process all requests, directed to http server.
std::string fDrawPageCont
! content of draw html page
Bool_t Unregister(TObject *obj)
Unregister object.
void SetWSOnly(Bool_t on=kTRUE)
Set websocket-only mode.
std::string BuildWSEntryPage()
Create summary page with active WS handlers.
Bool_t IsWSOnly() const
returns true if only websockets are handled by the server
std::mutex fWSMutex
! mutex to protect WS handler lists
Bool_t CreateEngine(const char *engine)
Factory method to create different http engines.
Bool_t SetIcon(const char *fullname, const char *iconname)
Set name of icon, used in browser together with the item.
std::string fDrawPage
! file name for drawing of single element
std::string fDefaultPageCont
! content of default html page
static Bool_t VerifyFilePath(const char *fname)
Checked that filename does not contains relative path below current directory.
Bool_t IsAllowPostObject() const
Returns true if server accept object content in POST reequests.
Bool_t SetItemField(const char *fullname, const char *name, const char *value)
Set item field in sniffer.
void SetAllowPostObject(Bool_t allow_post_obj)
Set flag to allow receive and desereilize objects in POST requests.
void SetJSROOT(const char *location)
Set location of JSROOT to use with the server.
std::mutex fMutex
! mutex to protect list with arguments
std::string fDefaultPage
! file name for default page name
void UnregisterWS(std::shared_ptr< THttpWSHandler > ws)
Unregister WS handler.
static const char * GetMimeType(const char *path)
Guess mime type base on file extension.
void ReplaceJSROOTLinks(std::shared_ptr< THttpCallArg > &arg, const std::string &version="")
Replaces all references like "jsrootsys/..." or other pre-configured pathes.
Bool_t fTerminated
! termination flag, disables all requests processing
void Restrict(const char *path, const char *options)
Restrict access to specified object.
void Timeout() override
timeout handler used to process http requests in main ROOT thread
void SetSlow(Bool_t flag)
THttpTimer(Long_t milliSec, Bool_t mode, THttpServer &serv)
!< server processing requests
Class for user-side handling of websocket with THttpServer.
TObject * At(Int_t idx) const override
Int_t GetLast() const override
Return index of last object in array.
virtual const char * GetName() const
Returns name of object.
virtual void Warning(const char *method, const char *msgfmt,...) const
Issue warning message.
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
TObject()
TObject constructor.
static const TString & GetRootSys()
Get the rootsys directory in the installation. Static utility function.
static const TString & GetDataDir()
Get the data directory in the installation. Static utility function.
Storage of hierarchy scan in TRootSniffer in JSON format.
Storage of hierarchy scan in TRootSniffer in XML format.
Sniffer of ROOT objects, data provider for THttpServer.
void CreateOwnTopFolder()
Create own TFolder structures independent from gROOT This allows to have many independent TRootSniffe...
void SetScanGlobalDir(Bool_t on=kTRUE)
When enabled (default), sniffer scans gROOT for files, canvases, histograms.
Ssiz_t First(char c) const
Find first occurrence of a character c.
const char * Data() const
void Resize(Ssiz_t n)
Resize the string. Truncate or add blanks as necessary.
Ssiz_t Last(char c) const
Find last occurrence of a character c.
TObjArray * Tokenize(const TString &delim) const
This function is used to isolate sequential tokens in a TString.
TString & Remove(Ssiz_t pos)
TString & Append(const char *cs)
static TString Format(const char *fmt,...)
Static method which formats a string using a printf style format descriptor and return a TString.
void Form(const char *fmt,...)
Formats a string using a printf style format descriptor.
Ssiz_t Index(const char *pat, Ssiz_t i=0, ECaseCompare cmp=kExact) const
static Long_t SelfId()
Static method returning the id for the current thread.
void SetTime(Long_t milliSec)
TTimer(const TTimer &)=delete
This class represents a WWW compatible URL.
const char * GetValueFromOptions(const char *key) const
Return a value for a given key from the URL options.
void SetOptions(const char *opt)
void ParseOptions() const
Parse URL options into a key/value map.
Bool_t HasOption(const char *key) const
Returns true if the given key appears in the URL options list.