Logo ROOT  
Reference Guide
THttpServer.h
Go to the documentation of this file.
1// $Id$
2// Author: Sergey Linev 21/12/2013
3
4/*************************************************************************
5 * Copyright (C) 1995-2013, Rene Brun and Fons Rademakers. *
6 * All rights reserved. *
7 * *
8 * For the licensing terms see $ROOTSYS/LICENSE. *
9 * For the list of contributors see $ROOTSYS/README/CREDITS. *
10 *************************************************************************/
11
12#ifndef ROOT_THttpServer
13#define ROOT_THttpServer
14
15#include "TObject.h"
16#include "TList.h"
17#include "TNamed.h"
18#include "THttpCallArg.h"
19
20#include <mutex>
21#include <map>
22#include <string>
23#include <memory>
24#include <queue>
25#include <thread>
26
27class THttpEngine;
28class THttpTimer;
29class TRootSniffer;
30
31class THttpServer : public TNamed {
32
33protected:
34 TList fEngines; ///<! engines which runs http server
35 THttpTimer *fTimer{nullptr}; ///<! timer used to access main thread
36 TRootSniffer *fSniffer{nullptr}; ///<! sniffer provides access to ROOT objects hierarchy
37 Bool_t fTerminated{kFALSE}; ///<! termination flag, disables all requests processing
38 Long_t fMainThrdId{0}; ///<! id of the thread for processing requests
39 Bool_t fOwnThread{kFALSE}; ///<! true when specialized thread allocated for processing requests
40 std::thread fThrd; ///<! own thread
41 Bool_t fOldProcessSignature{kFALSE}; ///<! flag used to detect usage of old signature of Process() method
42
43 TString fJSROOTSYS; ///<! location of local JSROOT files
44 TString fTopName{"ROOT"}; ///<! name of top folder, default - "ROOT"
45 TString fJSROOT; ///<! location of external JSROOT files
46
47 std::map<std::string, std::string> fLocations; ///<! list of local directories, which could be accessed via server
48
49 std::string fDefaultPage; ///<! file name for default page name
50 std::string fDefaultPageCont; ///<! content of default html page
51 std::string fDrawPage; ///<! file name for drawing of single element
52 std::string fDrawPageCont; ///<! content of draw html page
53 std::string fCors; ///<! CORS: sets Access-Control-Allow-Origin header for ProcessRequest responses
54
55 std::mutex fMutex; ///<! mutex to protect list with arguments
56 std::queue<std::shared_ptr<THttpCallArg>> fArgs; ///<! submitted arguments
57
58 std::mutex fWSMutex; ///<! mutex to protect WS handler lists
59 std::vector<std::shared_ptr<THttpWSHandler>> fWSHandlers; ///<! list of WS handlers
60
61 virtual void MissedRequest(THttpCallArg *arg);
62
63 virtual void ProcessRequest(std::shared_ptr<THttpCallArg> arg);
64
65 virtual void ProcessBatchHolder(std::shared_ptr<THttpCallArg> &arg);
66
67 virtual void ProcessRequest(THttpCallArg *arg);
68
69 void StopServerThread();
70
71 static Bool_t VerifyFilePath(const char *fname);
72
73public:
74 THttpServer(const char *engine = "civetweb:8080");
75 virtual ~THttpServer();
76
77 Bool_t CreateEngine(const char *engine);
78
79 Bool_t IsAnyEngine() const { return fEngines.GetSize() > 0; }
80
81 /** returns pointer on objects sniffer */
82 TRootSniffer *GetSniffer() const { return fSniffer; }
83
84 void SetSniffer(TRootSniffer *sniff);
85
86 Bool_t IsReadOnly() const;
87
88 void SetReadOnly(Bool_t readonly);
89
90 /** set termination flag, no any further requests will be processed */
91 void SetTerminate();
92
93 /** returns kTRUE, if server was terminated */
94 Bool_t IsTerminated() const { return fTerminated; }
95
96 /** Enable CORS header to ProcessRequests() responses
97 * Specified location (typically "*") add as "Access-Control-Allow-Origin" header */
98 void SetCors(const std::string &domain = "*") { fCors = domain; }
99
100 /** Returns kTRUE if CORS was configured */
101 Bool_t IsCors() const { return !fCors.empty(); }
102
103 /** Returns specified CORS domain */
104 const char *GetCors() const { return fCors.c_str(); }
105
106 /** set name of top item in objects hierarchy */
107 void SetTopName(const char *top) { fTopName = top; }
108
109 /** returns name of top item in objects hierarchy */
110 const char *GetTopName() const { return fTopName.Data(); }
111
112 void SetJSROOT(const char *location);
113
114 void AddLocation(const char *prefix, const char *path);
115
116 void SetDefaultPage(const std::string &filename = "");
117
118 void SetDrawPage(const std::string &filename = "");
119
120 void SetTimer(Long_t milliSec = 100, Bool_t mode = kTRUE);
121
122 void CreateServerThread();
123
124 /** Check if file is requested, thread safe */
125 Bool_t IsFileRequested(const char *uri, TString &res) const;
126
127 /** Execute HTTP request */
128 Bool_t ExecuteHttp(std::shared_ptr<THttpCallArg> arg);
129
130 /** Submit HTTP request */
131 Bool_t SubmitHttp(std::shared_ptr<THttpCallArg> arg, Bool_t can_run_immediately = kFALSE);
132
133 /** Process submitted requests, must be called from appropriate thread */
135
136 /** Register object in subfolder */
137 Bool_t Register(const char *subfolder, TObject *obj);
138
139 /** Unregister object */
141
142 /** Register WS handler*/
143 void RegisterWS(std::shared_ptr<THttpWSHandler> ws);
144
145 /** Unregister WS handler*/
146 void UnregisterWS(std::shared_ptr<THttpWSHandler> ws);
147
148 /** Find web-socket handler with given name */
149 std::shared_ptr<THttpWSHandler> FindWS(const char *name);
150
151 /** Execute WS request */
152 Bool_t ExecuteWS(std::shared_ptr<THttpCallArg> &arg, Bool_t external_thrd = kFALSE, Bool_t wait_process = kFALSE);
153
154 /** Restrict access to specified object */
155 void Restrict(const char *path, const char *options);
156
157 Bool_t RegisterCommand(const char *cmdname, const char *method, const char *icon = 0);
158
159 Bool_t Hide(const char *fullname, Bool_t hide = kTRUE);
160
161 Bool_t SetIcon(const char *fullname, const char *iconname);
162
163 Bool_t CreateItem(const char *fullname, const char *title);
164
165 Bool_t SetItemField(const char *fullname, const char *name, const char *value);
166
167 const char *GetItemField(const char *fullname, const char *name);
168
169 /** Guess mime type base on file extension */
170 static const char *GetMimeType(const char *path);
171
172 /** Reads content of file from the disk */
173 static char *ReadFileContent(const char *filename, Int_t &len);
174
175 /** Reads content of file from the disk, use std::string in return value */
176 static std::string ReadFileContent(const std::string &filename);
177
178 ClassDef(THttpServer, 0) // HTTP server for ROOT analysis
179};
180
181#endif
int Int_t
Definition: RtypesCore.h:41
const Bool_t kFALSE
Definition: RtypesCore.h:88
long Long_t
Definition: RtypesCore.h:50
bool Bool_t
Definition: RtypesCore.h:59
const Bool_t kTRUE
Definition: RtypesCore.h:87
#define ClassDef(name, id)
Definition: Rtypes.h:326
char name[80]
Definition: TGX11.cxx:109
virtual Int_t GetSize() const
Return the capacity of the collection, i.e.
Definition: TCollection.h:182
Bool_t IsReadOnly() const
returns read-only mode
TString fJSROOT
! location of external JSROOT files
Definition: THttpServer.h:45
virtual void ProcessRequest(std::shared_ptr< THttpCallArg > arg)
Process single http request Depending from requested path and filename different actions will be perf...
const char * GetTopName() const
returns name of top item in objects hierarchy
Definition: THttpServer.h:110
std::shared_ptr< THttpWSHandler > FindWS(const char *name)
Find web-socket handler with given name.
void SetTimer(Long_t milliSec=100, Bool_t mode=kTRUE)
create timer which will invoke ProcessRequests() function periodically Timer is required to perform a...
virtual void ProcessBatchHolder(std::shared_ptr< THttpCallArg > &arg)
Process special http request for root_batch_holder.js script This kind of requests used to hold web b...
std::vector< std::shared_ptr< THttpWSHandler > > fWSHandlers
! list of WS handlers
Definition: THttpServer.h:59
virtual ~THttpServer()
destructor delete all http engines and sniffer
void SetTerminate()
set termination flag, no any further requests will be processed
virtual void MissedRequest(THttpCallArg *arg)
Method called when THttpServer cannot process request By default such requests replied with 404 code ...
Bool_t fOwnThread
! true when specialized thread allocated for processing requests
Definition: THttpServer.h:39
void SetSniffer(TRootSniffer *sniff)
Set TRootSniffer to the server Server takes ownership over sniffer.
Bool_t IsFileRequested(const char *uri, TString &res) const
Check if file is requested, thread safe.
const char * GetItemField(const char *fullname, const char *name)
const char * GetCors() const
Returns specified CORS domain.
Definition: THttpServer.h:104
std::thread fThrd
! own thread
Definition: THttpServer.h:40
void StopServerThread()
Stop server thread Normally called shortly before http server destructor.
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.
TString fTopName
! name of top folder, default - "ROOT"
Definition: THttpServer.h:44
TRootSniffer * fSniffer
! sniffer provides access to ROOT objects hierarchy
Definition: THttpServer.h:36
void SetDrawPage(const std::string &filename="")
Set file name of HTML page, delivered by the server when objects drawing page is requested from the b...
Bool_t CreateItem(const char *fullname, const char *title)
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
THttpServer(const char *engine="civetweb:8080")
constructor
void AddLocation(const char *prefix, const char *path)
add files location, which could be used in the server one could map some system folder to the server ...
Bool_t IsAnyEngine() const
Definition: THttpServer.h:79
std::map< std::string, std::string > fLocations
! list of local directories, which could be accessed via server
Definition: THttpServer.h:47
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
Definition: THttpServer.h:38
std::string fCors
! CORS: sets Access-Control-Allow-Origin header for ProcessRequest responses
Definition: THttpServer.h:53
Bool_t IsTerminated() const
returns kTRUE, if server was terminated
Definition: THttpServer.h:94
TString fJSROOTSYS
! location of local JSROOT files
Definition: THttpServer.h:43
Bool_t Register(const char *subfolder, TObject *obj)
Register object in subfolder.
TList fEngines
! engines which runs http server
Definition: THttpServer.h:34
void SetCors(const std::string &domain="*")
Enable CORS header to ProcessRequests() responses Specified location (typically "*") add as "Access-C...
Definition: THttpServer.h:98
Bool_t IsCors() const
Returns kTRUE if CORS was configured.
Definition: THttpServer.h:101
std::queue< std::shared_ptr< THttpCallArg > > fArgs
! submitted arguments
Definition: THttpServer.h:56
void SetDefaultPage(const std::string &filename="")
Set file name of HTML page, delivered by the server when http address is opened in the browser.
static char * ReadFileContent(const char *filename, Int_t &len)
Reads content of file from the disk.
Bool_t fOldProcessSignature
! flag used to detect usage of old signature of Process() method
Definition: THttpServer.h:41
void CreateServerThread()
Creates special thread to process all requests, directed to http server.
std::string fDrawPageCont
! content of draw html page
Definition: THttpServer.h:52
Bool_t Unregister(TObject *obj)
Unregister object.
THttpTimer * fTimer
! timer used to access main thread
Definition: THttpServer.h:35
std::mutex fWSMutex
! mutex to protect WS handler lists
Definition: THttpServer.h:58
Bool_t CreateEngine(const char *engine)
factory method to create different http engines At the moment two engine kinds are supported: civetwe...
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
Definition: THttpServer.h:51
std::string fDefaultPageCont
! content of default html page
Definition: THttpServer.h:50
static Bool_t VerifyFilePath(const char *fname)
Checked that filename does not contains relative path below current directory Used to prevent access ...
void SetReadOnly(Bool_t readonly)
Set read-only mode for the server (default on) In read-only server is not allowed to change any ROOT ...
Bool_t SetItemField(const char *fullname, const char *name, const char *value)
void SetJSROOT(const char *location)
Set location of JSROOT to use with the server One could specify address like: https://root....
std::mutex fMutex
! mutex to protect list with arguments
Definition: THttpServer.h:55
std::string fDefaultPage
! file name for default page name
Definition: THttpServer.h:49
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
Definition: THttpServer.h:82
Bool_t RegisterCommand(const char *cmdname, const char *method, const char *icon=0)
Register command which can be executed from web interface.
Bool_t fTerminated
! termination flag, disables all requests processing
Definition: THttpServer.h:37
void SetTopName(const char *top)
set name of top item in objects hierarchy
Definition: THttpServer.h:107
void Restrict(const char *path, const char *options)
Restrict access to specified object.
A doubly linked list.
Definition: TList.h:44
The TNamed class is the base class for all named ROOT classes.
Definition: TNamed.h:29
Mother of all ROOT objects.
Definition: TObject.h:37
Basic string class.
Definition: TString.h:131
const char * Data() const
Definition: TString.h:364
void ws()
Definition: ws.C:66