53   void Send(
const void *buf, 
int len)
 override 
 
 
   87      const char *cfg = engine->
IsWebGui() ? 
"WebGui.HttpThreads parameter in rootrc" : 
"thrds=N parameter in config URL";
 
   88      const char *
place = 
longpoll ? 
"TCivetweb::LongpollHandler" : 
"TCivetweb::WebSocketHandler";
 
 
  111   auto arg = std::make_shared<THttpCallArg>();
 
  112   arg->SetPathAndFileName(request_info->
local_uri); 
 
  116   arg->SetMethod(
"WS_CONNECT");
 
  123   return execres && !arg->Is404() ? 0 : 1;
 
 
  141   auto arg = std::make_shared<THttpCallArg>();
 
  142   arg->SetPathAndFileName(request_info->
local_uri); 
 
  145   arg->SetMethod(
"WS_READY");
 
 
  171   auto arg = std::make_shared<THttpCallArg>();
 
  172   arg->SetPathAndFileName(request_info->
local_uri); 
 
  176   arg->SetMethod(
"WS_CLOSE");
 
 
  195   int fin = code & 0x80, opcode = code & 0x0F;
 
  238   auto arg = std::make_shared<THttpCallArg>();
 
  239   arg->SetPathAndFileName(request_info->
local_uri); 
 
  243   arg->SetMethod(
"WS_DATA");
 
  251      arg->SetPostData(std::string(
data,
len));
 
 
  296   if (
strcmp(arg->GetFileName(), 
"root.longpoll") != 0)
 
  299   const char *
q = arg->GetQuery();
 
 
  324   auto arg = std::make_shared<THttpCallArg>();
 
  337            arg->SetContent(std::move(buf));
 
  341               arg->AddNoCacheHeader();
 
  348      arg->SetPathAndFileName(request_info->
local_uri); 
 
  359      arg->SetRequestHeader(header);
 
  369            arg->SetPostData(std::move(buf));
 
  374         cont.Append(
"<title>Civetweb echo</title>");
 
  375         cont.Append(
"<h1>Civetweb echo</h1>\n");
 
  377         static int count = 0;
 
  385         if (arg->GetUserName())
 
  388         cont.Append(
"</pre><p>\n");
 
  390         cont.Append(
"Environment:<br/>\n<pre>\n");
 
  394         cont.Append(
"</pre><p>\n");
 
  396         arg->SetContentType(
"text/html");
 
  398         arg->SetContent(
cont);
 
  408   if (!
execres || arg->Is404()) {
 
  409      std::string 
hdr = arg->FillHttpHeader(
"HTTP/1.1");
 
  411   } 
else if (arg->IsFile()) {
 
  412      filename = (
const char *)arg->GetContent();
 
  447      switch (arg->GetZipping()) {
 
  450         if (arg->GetContentLength() < 10000) 
break;
 
  467         arg->CompressWithGzip();
 
  469      std::string 
hdr = arg->FillHttpHeader(
"HTTP/1.1");
 
  472      if (arg->GetContentLength() > 0)
 
  473         mg_write(conn, arg->GetContent(), (
size_t)arg->GetContentLength());
 
 
  519   : 
THttpEngine(
"civetweb", 
"compact embedded http server"),
 
 
  538   if ((
gDebug > 0) || (
strstr(message, 
"cannot bind to") != 0))
 
  539      Error(
"Log", 
"%s", message);
 
 
  549   std::lock_guard<std::mutex> guard(
fMutex);
 
 
  558   std::lock_guard<std::mutex> guard(
fMutex);
 
 
  621      while ((*args != 0) && (*args != 
'?') && (
is_socket || (*args != 
'/')))
 
  622         sport.Append(*args++);
 
  627      while ((*args != 0) && (*args != 
'?'))
 
  638            const char *top = 
url.GetValueFromOptions(
"top");
 
  642            const char *log = 
url.GetValueFromOptions(
"log");
 
  650            const char *
afile = 
url.GetValueFromOptions(
"auth_file");
 
  654            const char *
adomain = 
url.GetValueFromOptions(
"auth_domain");
 
  658            const char *
sslc = 
url.GetValueFromOptions(
"ssl_cert");
 
  668            if (
url.HasOption(
"websocket_disable"))
 
  671            if (
url.HasOption(
"debug"))
 
  678            const char *
dls = 
url.GetValueFromOptions(
"dirlisting");
 
  682            const char *
smode = 
url.GetValueFromOptions(
"socket_mode");
 
  686            if (
url.HasOption(
"loopback") && (
sport.Index(
":") == 
kNPOS))
 
  690               const char *
addr = 
url.GetValueFromOptions(
"bind");
 
  696               const char *
cors = 
url.GetValueFromOptions(
"cors");
 
  701               const char *
cred = 
url.GetValueFromOptions(
"cred_cors");
 
  705            if (
url.HasOption(
"nocache"))
 
  708            if (
url.HasOption(
"max_age"))
 
  709               fMaxAge = 
url.GetIntValueFromOptions(
"max_age");
 
  718   const char *options[30];
 
  721   Info(
"Create", 
"Starting HTTP server on port %s", 
sport.Data());
 
  723   options[
op++] = 
"listening_ports";
 
  725   options[
op++] = 
"num_threads";
 
  729      options[
op++] = 
"websocket_timeout_ms";
 
  734      options[
op++] = 
"global_auth_file";
 
  736      options[
op++] = 
"authentication_domain";
 
  739      options[
op++] = 
"enable_auth_domain_check";
 
  740      options[
op++] = 
"no";
 
  744      options[
op++] = 
"error_log_file";
 
  749      options[
op++] = 
"ssl_certificate";
 
  752      Error(
"Create", 
"No SSL certificate file configured");
 
  756      options[
op++] = 
"static_file_max_age";
 
  762      options[
op++] = 
"access_control_allow_origin";
 
  767      options[
op++] = 
"access_control_allow_credentials";
 
  777   options[
op++] = 
"enable_directory_listing";
 
  780   options[
op++] = 
nullptr;
 
 
int websocket_connect_handler(const struct mg_connection *conn, void *)
 
static int begin_request_handler(struct mg_connection *conn, void *)
 
static int log_message_handler(const struct mg_connection *conn, const char *message)
 
int websocket_data_handler(struct mg_connection *conn, int code, char *data, size_t len, void *)
 
void websocket_close_handler(const struct mg_connection *conn, void *)
 
Bool_t CheckEngineThreads(TCivetweb *engine, const char *uri, Bool_t longpoll)
Check if engine has enough threads to process connect to new websocket handle.
 
void websocket_ready_handler(struct mg_connection *conn, void *)
 
Bool_t IsBadLongPollConnect(TCivetweb *engine, const std::shared_ptr< THttpCallArg > &arg)
Returns kTRUE in case of longpoll connection request - or at least looks like that.
 
ROOT::Detail::TRangeCast< T, true > TRangeDynCast
TRangeDynCast is an adapter class that allows the typed iteration through a TCollection.
 
void Error(const char *location, const char *msgfmt,...)
Use this function in case an error occurred.
 
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 void data
 
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
 
#define INVALID_HANDLE_VALUE
 
R__EXTERN TSystem * gSystem
 
int mg_printf(struct mg_connection *conn, const char *fmt,...)
 
void mg_send_file(struct mg_connection *conn, const char *path)
 
struct mg_context * mg_start(const struct mg_callbacks *callbacks, void *user_data, const char **options)
 
void mg_set_websocket_handler(struct mg_context *ctx, const char *uri, mg_websocket_connect_handler connect_handler, mg_websocket_ready_handler ready_handler, mg_websocket_data_handler data_handler, mg_websocket_close_handler close_handler, void *cbdata)
 
void mg_send_mime_file(struct mg_connection *conn, const char *path, const char *mime_type)
 
const char * mg_get_header(const struct mg_connection *conn, const char *name)
 
int mg_write(struct mg_connection *conn, const void *buf, size_t len)
 
const struct mg_request_info * mg_get_request_info(const struct mg_connection *conn)
 
void mg_set_user_connection_data(const struct mg_connection *const_conn, void *data)
 
void * mg_get_user_connection_data(const struct mg_connection *conn)
 
int mg_read(struct mg_connection *conn, void *buf, size_t len)
 
void mg_set_request_handler(struct mg_context *ctx, const char *uri, mg_request_handler handler, void *cbdata)
 
struct mg_context * mg_get_context(const struct mg_connection *conn)
 
void mg_stop(struct mg_context *ctx)
 
void * mg_get_user_data(const struct mg_context *ctx)
 
int mg_websocket_write(struct mg_connection *conn, int opcode, const char *data, size_t data_len)
 
@ MG_WEBSOCKET_OPCODE_CONNECTION_CLOSE
 
@ MG_WEBSOCKET_OPCODE_BINARY
 
@ MG_WEBSOCKET_OPCODE_TEXT
 
struct mg_connection * fWSconn
 
UInt_t GetId() const override
 
void SendCharStar(const char *str) override
Envelope for sending string via the websocket.
 
void ClearHandle(Bool_t terminate) override
 
Bool_t SupportSendThrd() const override
True websocket requires extra thread to parallelize sending.
 
~TCivetwebWSEngine() override=default
 
void SendHeader(const char *hdr, const void *buf, int len) override
Special method to send binary data with text header For normal websocket it is two separated operatio...
 
void Send(const void *buf, int len) override
 
TCivetwebWSEngine(struct mg_connection *conn)
 
THttpEngine implementation, based on civetweb embedded server.
 
Int_t fNumThreads
! number of configured threads
 
Int_t fNumActiveThreads
! number of active threads - used in request and websocket handling
 
struct mg_context * fCtx
! civetweb context
 
std::mutex fMutex
! mutex to read/write fNumActiveThreads
 
Bool_t fWinSymLinks
! resolve symbolic links on Windows
 
Bool_t IsTerminating() const
 
const char * GetTopName() const
 
TCivetweb(Bool_t only_secured=kFALSE)
constructor
 
Int_t fMaxAge
! max-age parameter
 
Int_t ProcessLog(const char *message)
process civetweb log message, can be used to detect critical errors
 
TString fTopName
! name of top item
 
Int_t GetNumAvailableThreads()
Returns number of actively used threads.
 
Bool_t fTerminating
! server doing shutdown and not react on requests
 
Bool_t Create(const char *args) override
Creates embedded civetweb server.
 
Int_t ChangeNumActiveThrerads(int cnt=0)
Returns number of actively used threads.
 
Int_t GetNumThreads() const
 
Bool_t IsDebugMode() const
 
virtual ~TCivetweb()
destructor
 
Bool_t IsWinSymLinks() const
 
Bool_t fWebGui
! if server used for webgui
 
Bool_t fDebug
! debug mode
 
struct mg_callbacks fCallbacks
! call-back table for civetweb webserver
 
Abstract class for implementing http protocol for THttpServer.
 
THttpServer * GetServer() const
Returns pointer to THttpServer associated with engine.
 
Online http server for arbitrary ROOT application.
 
const char * GetCors() const
Returns specified CORS domain.
 
void SetCorsCredentials(const std::string &value="true")
Enable/disable usage Access-Control-Allow-Credentials response header.
 
void SetCors(const std::string &domain="*")
Enable CORS header to ProcessRequests() responses Specified location (typically "*") add as "Access-C...
 
const char * GetCorsCredentials() const
Returns specified CORS credentials value - if any.
 
static char * ReadFileContent(const char *filename, Int_t &len)
Reads content of file from the disk.
 
static const char * GetMimeType(const char *path)
Guess mime type base on file extension.
 
Internal instance used to exchange WS functionality between THttpServer and THttpWSHandler.
 
virtual void Error(const char *method, const char *msgfmt,...) const
Issue error message.
 
virtual void Info(const char *method, const char *msgfmt,...) const
Issue info message.
 
Int_t Atoi() const
Return integer value of string.
 
UInt_t Hash(ECaseCompare cmp=kExact) const
Return hash value.
 
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.
 
virtual int Chmod(const char *file, UInt_t mode)
Set the file permission bits. Returns -1 in case or error, 0 otherwise.
 
virtual int Unlink(const char *name)
Unlink, i.e.
 
This class represents a WWW compatible URL.
 
TEngineHolder(TCivetweb *engine)
 
struct mg_header http_headers[(64)]
 
const char * request_method
 
const char * query_string