22#include "RConfigure.h" 
  176         ::Warning(
"THttpServer::THttpServer", 
"problems resolving '%s', set JSROOTSYS to proper JavaScript ROOT location",
 
  204         ::Warning(
"THttpServer::THttpServer", 
"Fail to load TRootSnifferFull class, use basic functionality");
 
  210      sniff->CreateOwnTopFolder(); 
 
  224         const char *opt = 
lst->At(
n)->GetName();
 
  225         if ((
strcmp(opt, 
"readonly") == 0) || (
strcmp(opt, 
"ro") == 0)) {
 
  227         } 
else if ((
strcmp(opt, 
"readwrite") == 0) || (
strcmp(opt, 
"rw") == 0)) {
 
  229         } 
else if (
strcmp(opt, 
"global") == 0) {
 
  231         } 
else if (
strcmp(opt, 
"noglobal") == 0) {
 
  233         } 
else if (
strncmp(opt, 
"cors=", 5) == 0) {
 
  235         } 
else if (
strcmp(opt, 
"cors") == 0) {
 
 
  339   if (!prefix || (*prefix == 0))
 
 
  362   fJSROOT = location ? location : 
"";
 
 
  443   } 
else if (
clname == 
"socket") {
 
  449   } 
else if (
clname == 
"https") {
 
  451   } 
else if (
clname == 
"fastcgi") {
 
  466   eng->SetServer(
this);
 
  468   if (!
eng->Create(arg)) {
 
 
  503         Error(
"SetTimer", 
"Server runs already in special thread, therefore no any timer can be created");
 
 
  529   std::thread 
thrd([
this] {
 
  539            std::this_thread::sleep_for(std::chrono::milliseconds(1));
 
 
  619   if (!uri || (*uri == 0))
 
  628      fname.Remove(0, pos + (
entry.first.length() - 1));
 
  631      res = 
entry.second.c_str();
 
  632      if ((
fname[0] == 
'/') && (res[res.
Length() - 1] == 
'/'))
 
 
  664   std::unique_lock<std::mutex> 
lk(
fMutex);
 
 
  693      arg->NotifyCondition();
 
  698   std::unique_lock<std::mutex> 
lk(
fMutex);
 
 
  719         Warning(
"ProcessRequests", 
"Changing main thread to %ld", (
long)
id);
 
  739   std::unique_lock<std::mutex> 
lk(
fMutex, std::defer_lock);
 
  743      std::shared_ptr<THttpCallArg> arg;
 
  746      if (!
fArgs.empty()) {
 
  755      if (arg->fFileName == 
"root_batch_holder.js") {
 
  760      auto prev = 
fSniffer->SetCurrentCallArg(arg.get());
 
  770      arg->NotifyCondition();
 
 
  808   if (!
wsptr || !
wsptr->ProcessBatchHolder(arg)) {
 
  810      arg->NotifyCondition();
 
 
  820   std::string 
arr = 
"[";
 
  825         if (
arr.length() > 1)
 
  828         arr.append(
TString::Format(
"{ name: \"%s\", title: \"%s\" }", ws->GetName(), ws->GetTitle()).Data());
 
  836   std::string arg = 
"\"$$$wslist$$$\"";
 
  838   auto pos = res.find(arg);
 
  839   if (pos != std::string::npos)
 
  840      res.replace(pos, arg.length(), 
arr);
 
 
  854   const std::string 
place_holder = 
"<!--jsroot_importmap-->";
 
  862   if (arg->fPathName.Length() > 0)
 
  864   for (
Int_t n = 1; 
n < arg->fPathName.Length()-1; ++
n)
 
  865      if (arg->fPathName[
n] == 
'/') {
 
  866         if (arg->fPathName[
n-1] != 
'/') {
 
  880         std::string 
search = 
"from './jsrootsys/";
 
  881         std::string replace = 
"from './" + 
version + 
"/jsrootsys/";
 
  882         arg->ReplaceAllinContent(
search, replace);
 
  884         search = 
"from './rootui5sys/";
 
  885         replace = 
"from './" + 
version + 
"/rootui5sys/";
 
  886         arg->ReplaceAllinContent(
search, replace);
 
  888         search = 
"jsrootsys/scripts/JSRoot.core.";
 
  889         replace = 
version + 
"/jsrootsys/scripts/JSRoot.core.";
 
  890         arg->ReplaceAllinContent(
search, replace, 
true);
 
  891         arg->AddNoCacheHeader();
 
  899         if (
repl.back() != 
'/')
 
  905            repl.append(
"jsrootsys/");
 
  910         arg->ReplaceAllinContent(
"=\"jsrootsys/", 
repl);
 
  911         arg->ReplaceAllinContent(
"from './jsrootsys/", 
TString::Format(
"from '%s", 
repl.substr(2).c_str()).Data());
 
  936      static std::map<std::string, std::string> 
modules = {
 
  937         {
"jsroot", 
"main.mjs"}, {
"jsroot/core", 
"core.mjs"},
 
  938         {
"jsroot/io", 
"io.mjs"}, {
"jsroot/tree", 
"tree.mjs"},
 
  939         {
"jsroot/draw", 
"draw.mjs"}, {
"jsroot/gui", 
"gui.mjs"},
 
  940         {
"jsroot/d3", 
"d3.mjs"}, {
"jsroot/three", 
"three.mjs"}, {
"jsroot/three_addons", 
"three_addons.mjs"},
 
  941         {
"jsroot/geom", 
"geom/TGeoPainter.mjs"}, {
"jsroot/hpainter", 
"gui/HierarchyPainter.mjs"},
 
  942         {
"jsroot/webwindow", 
"webwindow.mjs"}
 
  961         if (
entry.first != 
"jsrootsys/")
 
 
  987   if ((arg->fFileName == 
"root.websocket") || (arg->fFileName == 
"root.longpoll")) {
 
  992   if (arg->fFileName.IsNull() || (arg->fFileName == 
"index.htm") || (arg->fFileName == 
"default.htm")) {
 
  996      if (arg->fFileName == 
"default.htm") {
 
 1004         auto handler = 
wsptr.get();
 
 1011            arg->fContent = handler->GetDefaultPageContent().Data();
 
 1013            if (arg->fContent.find(
"file:") == 0) {
 
 1014               const char *
fname = arg->fContent.c_str() + 5;
 
 1020            version = handler->GetCodeVersion();
 
 1022            handler->VerifyDefaultPageContent(arg);
 
 1026      if (arg->fContent.empty() && arg->fFileName.IsNull() && arg->fPathName.IsNull() && 
IsWSOnly()) {
 
 1031         arg->SetContent(
"refused");
 
 1035      if (arg->fContent.empty() && !
IsWSOnly()) {
 
 1043      if (arg->fContent.empty()) {
 
 1046      } 
else if (!arg->Is404()) {
 
 1050         const char *
hjsontag = 
"\"$$$h.json$$$\"";
 
 1053         if (arg->fContent.find(
hjsontag) != std::string::npos) {
 
 1057            if (arg->fTopName.Length() > 0)
 
 1058               topname = arg->fTopName.Data();
 
 1063            arg->AddNoCacheHeader();
 
 1065            if (arg->fQuery.Index(
"nozip") == 
kNPOS)
 
 1068         arg->SetContentType(
"text/html");
 
 1073   if ((arg->fFileName == 
"draw.htm") && !
IsWSOnly()) {
 
 1081         const char *
hjsontag = 
"\"$$$h.json$$$\"";
 
 1087         if ((arg->fQuery.Index(
"no_h_json") == 
kNPOS) && (arg->fQuery.Index(
"webcanvas") == 
kNPOS) &&
 
 1088             (arg->fContent.find(
hjsontag) != std::string::npos)) {
 
 1092            if (arg->fTopName.Length() > 0)
 
 1093               topname = arg->fTopName.Data();
 
 1099         if ((arg->fQuery.Index(
"no_root_json") == 
kNPOS) && (arg->fQuery.Index(
"webcanvas") == 
kNPOS) &&
 
 1100             (arg->fContent.find(
rootjsontag) != std::string::npos)) {
 
 1102            if (
fSniffer->Produce(arg->fPathName.Data(), 
"root.json", 
"compact=23", str))
 
 1105         arg->AddNoCacheHeader();
 
 1106         if (arg->fQuery.Index(
"nozip") == 
kNPOS)
 
 1108         arg->SetContentType(
"text/html");
 
 1113   if ((arg->fFileName == 
"favicon.ico") && arg->fPathName.IsNull()) {
 
 1114      arg->SetFile(
fJSROOTSYS + 
"/img/RootIcon.ico");
 
 1125   if (!arg->fPathName.IsNull() && !arg->fFileName.IsNull()) {
 
 1127      auto pos = 
wsname.First(
'/');
 
 1131         wsname = arg->fPathName(0, pos);
 
 1132         fname = arg->fPathName(pos + 1, arg->fPathName.Length() - pos);
 
 1136      fname.Append(arg->fFileName);
 
 1142         if (ws && ws->CanServeFiles()) {
 
 1143            TString fdir = ws->GetDefaultPageContent();
 
 1145            if (fdir.
Index(
"file:") == 0) {
 
 1170      if (arg->fContent.empty())
 
 1178      res.
Form(
"<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
 
 1188         if (arg->fTopName.Length() > 0)
 
 1189            topname = arg->fTopName.Data();
 
 1197      arg->SetContent(std::string(res.
Data()));
 
 1204      if (arg->fTopName.Length() > 0)
 
 1205         topname = arg->fTopName.Data();
 
 1207      arg->SetContent(std::string(res.
Data()));
 
 1209   } 
else if (
fSniffer->Produce(arg->fPathName.Data(), 
filename.Data(), arg->fQuery.Data(), arg->fContent)) {
 
 1226      const char *
parname = 
fSniffer->IsStreamerInfoItem(arg->fPathName.Data()) ? 
"BVersion" : 
"MVersion";
 
 1231   arg->AddNoCacheHeader();
 
 1235      arg->AddHeader(
"Access-Control-Allow-Origin", 
GetCors());
 
 
 1257   return fSniffer->UnregisterObject(obj);
 
 
 1310   auto handler = 
wsptr.get();
 
 1315   if (
external_thrd && (!handler || !handler->AllowMTProcess())) {
 
 1320      std::unique_lock<std::mutex> 
lk(
fMutex);
 
 1324         arg->fCond.wait(
lk);
 
 1334   if (arg->fFileName == 
"root.websocket") {
 
 1336      process = handler->HandleWS(arg);
 
 1337   } 
else if (arg->fFileName == 
"root.longpoll") {
 
 1339      if (arg->fQuery.BeginsWith(
"raw_connect") || arg->fQuery.BeginsWith(
"txt_connect")) {
 
 1342         arg->SetMethod(
"WS_CONNECT");
 
 1344         bool israw = arg->fQuery.BeginsWith(
"raw_connect");
 
 1349         if (handler->HandleWS(arg)) {
 
 1350            arg->SetMethod(
"WS_READY");
 
 1352            if (handler->HandleWS(arg))
 
 1353               arg->SetTextContent(std::string(
israw ? 
"txt:" : 
"") + std::to_string(arg->GetWSId()));
 
 1355            arg->TakeWSEngine(); 
 
 1358         process = arg->IsText();
 
 1361         url.SetOptions(arg->fQuery);
 
 1363         const char *connid = 
url.GetValueFromOptions(
"connection");
 
 1365            arg->SetWSId(std::stoul(connid));
 
 1366         if (
url.HasOption(
"close")) {
 
 1367            arg->SetMethod(
"WS_CLOSE");
 
 1368            arg->SetTextContent(
"OK");
 
 1370            arg->SetMethod(
"WS_DATA");
 
 1373         process = handler->HandleWS(arg);
 
 
 1459   return fSniffer->CreateItem(fullname, title);
 
 
 1483   static const struct {
 
 1488                             {
".json", 5, 
"application/json"},
 
 1489                             {
".bin", 4, 
"application/x-binary"},
 
 1490                             {
".gif", 4, 
"image/gif"},
 
 1491                             {
".jpg", 4, 
"image/jpeg"},
 
 1492                             {
".png", 4, 
"image/png"},
 
 1493                             {
".html", 5, 
"text/html"},
 
 1494                             {
".htm", 4, 
"text/html"},
 
 1495                             {
".shtm", 5, 
"text/html"},
 
 1496                             {
".shtml", 6, 
"text/html"},
 
 1497                             {
".css", 4, 
"text/css"},
 
 1498                             {
".js", 3, 
"application/x-javascript"},
 
 1499                             {
".mjs", 4, 
"text/javascript"},
 
 1500                             {
".ico", 4, 
"image/x-icon"},
 
 1501                             {
".jpeg", 5, 
"image/jpeg"},
 
 1502                             {
".svg", 4, 
"image/svg+xml"},
 
 1503                             {
".txt", 4, 
"text/plain"},
 
 1504                             {
".torrent", 8, 
"application/x-bittorrent"},
 
 1505                             {
".wav", 4, 
"audio/x-wav"},
 
 1506                             {
".mp3", 4, 
"audio/x-mp3"},
 
 1507                             {
".mid", 4, 
"audio/mid"},
 
 1508                             {
".m3u", 4, 
"audio/x-mpegurl"},
 
 1509                             {
".ogg", 4, 
"application/ogg"},
 
 1510                             {
".ram", 4, 
"audio/x-pn-realaudio"},
 
 1511                             {
".xslt", 5, 
"application/xml"},
 
 1512                             {
".xsl", 4, 
"application/xml"},
 
 1513                             {
".ra", 3, 
"audio/x-pn-realaudio"},
 
 1514                             {
".doc", 4, 
"application/msword"},
 
 1515                             {
".exe", 4, 
"application/octet-stream"},
 
 1516                             {
".zip", 4, 
"application/x-zip-compressed"},
 
 1517                             {
".xls", 4, 
"application/excel"},
 
 1518                             {
".tgz", 4, 
"application/x-tar-gz"},
 
 1519                             {
".tar", 4, 
"application/x-tar"},
 
 1520                             {
".gz", 3, 
"application/x-gunzip"},
 
 1521                             {
".arj", 4, 
"application/x-arj-compressed"},
 
 1522                             {
".rar", 4, 
"application/x-arj-compressed"},
 
 1523                             {
".rtf", 4, 
"application/rtf"},
 
 1524                             {
".pdf", 4, 
"application/pdf"},
 
 1525                             {
".swf", 4, 
"application/x-shockwave-flash"},
 
 1526                             {
".mpg", 4, 
"video/mpeg"},
 
 1527                             {
".webm", 5, 
"video/webm"},
 
 1528                             {
".mpeg", 5, 
"video/mpeg"},
 
 1529                             {
".mov", 4, 
"video/quicktime"},
 
 1530                             {
".mp4", 4, 
"video/mp4"},
 
 1531                             {
".m4v", 4, 
"video/x-m4v"},
 
 1532                             {
".asf", 4, 
"video/x-ms-asf"},
 
 1533                             {
".avi", 4, 
"video/x-msvideo"},
 
 1534                             {
".bmp", 4, 
"image/bmp"},
 
 1535                             {
".ttf", 4, 
"application/x-font-ttf"},
 
 1536                             {
".woff", 5, 
"font/woff"},
 
 1537                             {
".woff2", 6, 
"font/woff2"},
 
 1551   return "text/plain";
 
 
 1563   std::ifstream 
is(
filename, std::ios::in | std::ios::binary);
 
 1569   is.seekg(0, 
is.beg);
 
 
 1587   std::ifstream 
is(
filename, std::ios::in | std::ios::binary);
 
 1590      is.seekg(0, std::ios::end);
 
 1591      res.resize(
is.tellg());
 
 1592      is.seekg(0, std::ios::beg);
 
 1593      is.read((
char *)res.data(), res.length());
 
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
winID h TVirtualViewer3D TVirtualGLPainter p
 
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 @140 builtin_mime_types[]
 
const_iterator end() const
 
THttpEngine implementation, based on civetweb embedded server.
 
TClass instances represent classes, structs and namespaces in the ROOT type system.
 
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.
 
virtual Int_t GetValue(const char *name, Int_t dflt) const
Returns the integer value for a resource.
 
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.
 
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
 
void SetCors(const std::string &domain="*")
Enable CORS header to ProcessRequests() responses Specified location (typically "*") add as "Access-C...
 
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 SetItemField(const char *fullname, const char *name, const char *value)
Set item field in sniffer.
 
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.
 
TRootSniffer * GetSniffer() const
returns pointer on objects sniffer
 
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.
 
void Add(TObject *obj) override
 
void Delete(Option_t *option="") override
Remove all objects from the list AND delete all heap based objects.
 
The TNamed class is the base class for all named ROOT classes.
 
Mother of all ROOT objects.
 
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.
 
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 SetReadOnly(Bool_t on=kTRUE)
When readonly on (default), sniffer is not allowed to change ROOT structures For instance,...
 
void SetScanGlobalDir(Bool_t on=kTRUE)
When enabled (default), sniffer scans gROOT for files, canvases, histograms.
 
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
 
virtual Bool_t ExpandPathName(TString &path)
Expand a pathname getting rid of special shell characters like ~.
 
virtual const char * Getenv(const char *env)
Get environment variable.
 
static Long_t SelfId()
Static method returning the id for the current thread.
 
Handles synchronous and a-synchronous timer events.
 
void SetTime(Long_t milliSec)
 
This class represents a WWW compatible URL.