Logo ROOT   6.30.04
Reference Guide
 All Namespaces Files Pages
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 
27 class THttpEngine;
28 class THttpTimer;
29 class TRootSniffer;
30 
31 class THttpServer : public TNamed {
32 
33 protected:
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 
73 public:
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 */
134  Int_t ProcessRequests();
135 
136  /** Register object in subfolder */
137  Bool_t Register(const char *subfolder, TObject *obj);
138 
139  /** Unregister object */
140  Bool_t Unregister(TObject *obj);
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