XRootD
XrdHttpProtocol Class Reference

#include <XrdHttpProtocol.hh>

+ Inheritance diagram for XrdHttpProtocol:
+ Collaboration diagram for XrdHttpProtocol:

Classes

struct  StaticPreloadInfo
 

Public Member Functions

 XrdHttpProtocol (bool imhttps)
 
 XrdHttpProtocol (const XrdHttpProtocol &)=default
 Ctor, dtors and copy ctor. More...
 
 ~XrdHttpProtocol ()
 
int doChksum (const XrdOucString &fname)
 Perform a checksum request. More...
 
void DoIt ()
 Override from the base class. More...
 
int doStat (char *fname)
 Perform a Stat request. More...
 
bool isHTTPS ()
 called via https More...
 
XrdProtocolMatch (XrdLink *lp)
 Tells if the oustanding bytes on the socket match this protocol implementation. More...
 
XrdHttpProtocol operator= (const XrdHttpProtocol &rhs)
 
int Process (XrdLink *lp)
 Process data incoming from the socket. More...
 
void Recycle (XrdLink *lp, int consec, const char *reason)
 Recycle this instance. More...
 
int Stats (char *buff, int blen, int do_sync=0)
 Get activity stats. More...
 
- Public Member Functions inherited from XrdProtocol
 XrdProtocol (const char *jname)
 
virtual ~XrdProtocol ()
 
- Public Member Functions inherited from XrdJob
 XrdJob (const char *desc="")
 
virtual ~XrdJob ()
 

Static Public Member Functions

static int Configure (char *parms, XrdProtocol_Config *pi)
 Read and apply the configuration. More...
 
static int parseHeader2CGI (XrdOucStream &Config, XrdSysError &err, std::map< std::string, std::string > &header2cgi)
 Use this function to parse header2cgi configurations. More...
 

Public Attributes

XrdObject< XrdHttpProtocolProtLink
 
XrdSecEntity SecEntity
 Authentication area. More...
 
- Public Attributes inherited from XrdJob
const char * Comment
 
XrdJobNextJob
 

Static Public Attributes

static XrdHttpChecksumHandler cksumHandler = XrdHttpChecksumHandler()
 
static XrdObjectQ< XrdHttpProtocolProtStack
 
static XrdHttpReadRangeHandler::Configuration ReadRangeConfig
 configuration for the read range handler More...
 

Protected Attributes

char * Addr_str
 
XrdXrootd::BridgeBridge
 The Bridge that we use to exercise the xrootd internals. More...
 
XrdHttpReq CurrentReq
 
XrdLinkLink
 The link we are bound to. More...
 

Static Protected Attributes

static XrdBuffManagerBPool = 0
 
static XrdSecServiceCIA = 0
 
static bool compatNameGeneration = false
 
static int crlRefIntervalSec = XrdTlsContext::DEFAULT_CRL_REF_INT_SEC
 CRL thread refresh interval. More...
 
static XrdSysError eDest = 0
 
static bool embeddedstatic = true
 If true, use the embedded css and icons. More...
 
static char * gridmap = 0
 Gridmap file location. The same used by XrdSecGsi. More...
 
static int hailWait = 60000
 Timeout for reading the handshake. More...
 
static std::map< std::string, std::string > hdr2cgimap
 Rules that turn HTTP headers to cgi tokens in the URL, for internal comsumption. More...
 
static bool isdesthttps = false
 True if the redirections must be towards https targets. More...
 
static bool isRequiredGridmap = false
 
static bool listdeny = false
 If true, any form of listing is denied. More...
 
static char * listredir = 0
 Url to redirect to in the case a listing is requested. More...
 
static BIO_METHOD * m_bio_method = NULL
 C-style vptr table for our custom BIO objects. More...
 
static int m_bio_type = 0
 Type identifier for our custom BIO objects. More...
 
static std::unordered_map< std::string, std::vector< std::pair< std::string, std::string > > > m_staticheader_map
 The static headers to always return; map is from verb to a list of (header, val) pairs. More...
 
static std::unordered_map< std::string, std::string > m_staticheaders
 
static kXR_int32 myRole = kXR_isManager
 Our role. More...
 
static XrdNetPMarkpmarkHandle = nullptr
 Packet marking handler pointer (assigned from the environment during the Config() call) More...
 
static int Port = 1094
 Our port. More...
 
static char * Port_str = 0
 Our port, as a string. More...
 
static int readWait = 300000
 Timeout for reading data. More...
 
static XrdSchedulerSched = 0
 
static char * secretkey = 0
 The key used to calculate the url hashes. More...
 
static bool selfhttps2http = false
 If client is HTTPS, self-redirect with HTTP+token. More...
 
static XrdOucGMapservGMap = 0
 The instance of the DN mapper. Created only when a valid path is given. More...
 
static char * sslcadir = 0
 
static char * sslcafile = 0
 
static char * sslcert = 0
 OpenSSL stuff. More...
 
static char * sslcipherfilter = 0
 
static char * sslkey = 0
 
static int sslverifydepth = 9
 Depth of verification of a certificate chain. More...
 
static XrdOucHash< StaticPreloadInfo > * staticpreload = 0
 
static char * staticredir = 0
 
static bool tpcForwardCreds = false
 If set to true, the HTTP TPC transfers will forward the credentials to redirected hosts. More...
 
static char * xrd_cslist = nullptr
 The list of checksums that were configured via the xrd.cksum parameter on the server config file. More...
 

Friends

class XrdHttpExtReq
 
class XrdHttpReq
 

Detailed Description

Definition at line 80 of file XrdHttpProtocol.hh.


Class Documentation

◆ XrdHttpProtocol::StaticPreloadInfo

struct XrdHttpProtocol::StaticPreloadInfo

Definition at line 443 of file XrdHttpProtocol.hh.

+ Collaboration diagram for XrdHttpProtocol::StaticPreloadInfo:
Class Members
char * data
int len

Constructor & Destructor Documentation

◆ XrdHttpProtocol() [1/2]

XrdHttpProtocol::XrdHttpProtocol ( const XrdHttpProtocol )
default

Ctor, dtors and copy ctor.

Referenced by Match().

+ Here is the caller graph for this function:

◆ XrdHttpProtocol() [2/2]

XrdHttpProtocol::XrdHttpProtocol ( bool  imhttps)

Definition at line 197 of file XrdHttpProtocol.cc.

198 : XrdProtocol("HTTP protocol handler"), ProtLink(this),
200  myBuff = 0;
201  Addr_str = 0;
202  Reset();
203  ishttps = imhttps;
204 
205 }
XrdObject< XrdHttpProtocol > ProtLink
XrdHttpReq CurrentReq
static XrdHttpReadRangeHandler::Configuration ReadRangeConfig
configuration for the read range handler
XrdSecEntity SecEntity
Authentication area.
XrdProtocol(const char *jname)
Definition: XrdProtocol.hh:156

References Addr_str.

◆ ~XrdHttpProtocol()

XrdHttpProtocol::~XrdHttpProtocol ( )
inline

Definition at line 124 of file XrdHttpProtocol.hh.

124  {
125  Cleanup();
126  }

Member Function Documentation

◆ Configure()

int XrdHttpProtocol::Configure ( char *  parms,
XrdProtocol_Config pi 
)
static

Read and apply the configuration.

Definition at line 1806 of file XrdHttpProtocol.cc.

1806  {
1807  /*
1808  Function: Establish configuration at load time.
1809 
1810  Input: None.
1811 
1812  Output: 0 upon success or !0 otherwise.
1813  */
1814 
1815  char *rdf;
1816 
1817  // Copy out the special info we want to use at top level
1818  //
1819  eDest.logger(pi->eDest->logger());
1821  // SI = new XrdXrootdStats(pi->Stats);
1822  Sched = pi->Sched;
1823  BPool = pi->BPool;
1824  xrd_cslist = getenv("XRD_CSLIST");
1825 
1826  Port = pi->Port;
1827 
1828  // Copy out the current TLS context
1829  //
1830  xrdctx = pi->tlsCtx;
1831 
1832  {
1833  char buf[16];
1834  sprintf(buf, "%d", Port);
1835  Port_str = strdup(buf);
1836  }
1837 
1838  // Now process and configuration parameters
1839  //
1840  rdf = (parms && *parms ? parms : pi->ConfigFN);
1841  if (rdf && Config(rdf, pi->theEnv)) return 0;
1842  if (pi->DebugON) XrdHttpTrace.What = TRACE_ALL;
1843 
1844  // Set the redirect flag if we are a pure redirector
1845  myRole = kXR_isServer;
1846  if ((rdf = getenv("XRDROLE"))) {
1847  eDest.Emsg("Config", "XRDROLE: ", rdf);
1848 
1849  if (!strcasecmp(rdf, "manager") || !strcasecmp(rdf, "supervisor")) {
1851  eDest.Emsg("Config", "Configured as HTTP(s) redirector.");
1852  } else {
1853 
1854  eDest.Emsg("Config", "Configured as HTTP(s) data server.");
1855  }
1856 
1857  } else {
1858  eDest.Emsg("Config", "No XRDROLE specified.");
1859  }
1860 
1861  // Schedule protocol object cleanup
1862  //
1864  (XrdHttpTrace.What & TRACE_MEM ? TRACE_MEM : 0));
1865  ProtStack.Set((pi->ConnMax / 3 ? pi->ConnMax / 3 : 30), 60 * 60);
1866 
1867  // Return success
1868  //
1869 
1870  return 1;
1871 }
#define kXR_isManager
Definition: XProtocol.hh:1156
#define kXR_isServer
Definition: XProtocol.hh:1157
XrdSysTrace XrdHttpTrace("http")
#define TRACE_MEM
Definition: XrdTrace.hh:38
#define TRACE_ALL
Definition: XrdTrace.hh:35
static XrdScheduler * Sched
static kXR_int32 myRole
Our role.
static char * Port_str
Our port, as a string.
static XrdSysError eDest
static char * xrd_cslist
The list of checksums that were configured via the xrd.cksum parameter on the server config file.
static XrdObjectQ< XrdHttpProtocol > ProtStack
static int Port
Our port.
static XrdBuffManager * BPool
void Set(int inQMax, time_t agemax=1800)
Definition: XrdObject.icc:90
XrdBuffManager * BPool
Definition: XrdProtocol.hh:63
XrdScheduler * Sched
Definition: XrdProtocol.hh:64
XrdTlsContext * tlsCtx
Definition: XrdProtocol.hh:99
XrdSysError * eDest
Definition: XrdProtocol.hh:61
XrdOucEnv * theEnv
Definition: XrdProtocol.hh:66
int Emsg(const char *esfx, int ecode, const char *text1, const char *text2=0)
Definition: XrdSysError.cc:95
XrdSysLogger * logger(XrdSysLogger *lp=0)
Definition: XrdSysError.hh:141
void SetLogger(XrdSysLogger *logp)
Definition: XrdSysTrace.cc:65
XrdTlsContext * xrdctx

References XrdProtocol_Config::BPool, BPool, XrdCms::Config, XrdProtocol_Config::ConfigFN, XrdProtocol_Config::ConnMax, XrdProtocol_Config::DebugON, XrdProtocol_Config::eDest, eDest, XrdSysError::Emsg(), kXR_isManager, kXR_isServer, XrdSysError::logger(), myRole, XrdProtocol_Config::Port, Port, Port_str, ProtStack, XrdProtocol_Config::Sched, Sched, XrdObjectQ< T >::Set(), XrdSysTrace::SetLogger(), XrdProtocol_Config::theEnv, XrdProtocol_Config::tlsCtx, TRACE_ALL, TRACE_MEM, XrdSysTrace::What, xrd_cslist, XrdHttpProtoInfo::xrdctx, and XrdHttpTrace.

Referenced by XrdgetProtocol().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ doChksum()

int XrdHttpProtocol::doChksum ( const XrdOucString fname)

Perform a checksum request.

Definition at line 3170 of file XrdHttpProtocol.cc.

3170  {
3171  size_t length;
3172  memset(&CurrentReq.xrdreq, 0, sizeof (ClientRequest));
3176  memset(CurrentReq.xrdreq.query.fhandle, '\0', sizeof(CurrentReq.xrdreq.query.fhandle));
3178  length = fname.length() + 1;
3179  CurrentReq.xrdreq.query.dlen = htonl(length);
3180 
3181  if (!Bridge) return -1;
3182 
3183  return Bridge->Run(reinterpret_cast<char *>(&CurrentReq.xrdreq), const_cast<char *>(fname.c_str()), length) ? 0 : -1;
3184 }
kXR_unt16 requestid
Definition: XProtocol.hh:630
kXR_char reserved1[2]
Definition: XProtocol.hh:632
kXR_unt16 infotype
Definition: XProtocol.hh:631
kXR_char reserved2[8]
Definition: XProtocol.hh:634
kXR_char fhandle[4]
Definition: XProtocol.hh:633
@ kXR_query
Definition: XProtocol.hh:113
struct ClientQueryRequest query
Definition: XProtocol.hh:866
@ kXR_Qcksum
Definition: XProtocol.hh:617
XrdXrootd::Bridge * Bridge
The Bridge that we use to exercise the xrootd internals.
ClientRequest xrdreq
The last issued xrd request, often pending.
Definition: XrdHttpReq.hh:296
const char * c_str() const
int length() const
virtual bool Run(const char *xreqP, char *xdataP=0, int xdataL=0)=0

References Bridge, XrdOucString::c_str(), CurrentReq, ClientQueryRequest::dlen, ClientQueryRequest::fhandle, ClientQueryRequest::infotype, kXR_Qcksum, kXR_query, XrdOucString::length(), ClientRequest::query, ClientQueryRequest::requestid, ClientQueryRequest::reserved1, ClientQueryRequest::reserved2, XrdXrootd::Bridge::Run(), and XrdHttpReq::xrdreq.

Referenced by XrdHttpReq::ProcessHTTPReq().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ DoIt()

void XrdHttpProtocol::DoIt ( )
inlinevirtual

Override from the base class.

Implements XrdJob.

Definition at line 91 of file XrdHttpProtocol.hh.

91  {
92  if (Resume) (*this.*Resume)();
93  }

◆ doStat()

int XrdHttpProtocol::doStat ( char *  fname)

Perform a Stat request.

Definition at line 3142 of file XrdHttpProtocol.cc.

3142  {
3143  int l;
3144  bool b;
3145  CurrentReq.filesize = 0;
3146  CurrentReq.fileflags = 0;
3147  CurrentReq.filemodtime = 0;
3148 
3149  memset(&CurrentReq.xrdreq, 0, sizeof (ClientRequest));
3151  memset(CurrentReq.xrdreq.stat.reserved, 0,
3152  sizeof (CurrentReq.xrdreq.stat.reserved));
3153  l = strlen(fname) + 1;
3154  CurrentReq.xrdreq.stat.dlen = htonl(l);
3155 
3156  if (!Bridge) return -1;
3157  b = Bridge->Run((char *) &CurrentReq.xrdreq, fname, l);
3158  if (!b) {
3159  return -1;
3160  }
3161 
3162 
3163  return 0;
3164 }
kXR_char reserved[11]
Definition: XProtocol.hh:770
@ kXR_stat
Definition: XProtocol.hh:129
kXR_unt16 requestid
Definition: XProtocol.hh:768
struct ClientStatRequest stat
Definition: XProtocol.hh:873
kXR_int32 dlen
Definition: XProtocol.hh:772
long fileflags
Definition: XrdHttpReq.hh:312
long filemodtime
Definition: XrdHttpReq.hh:313
long long filesize
Definition: XrdHttpReq.hh:311

References Bridge, CurrentReq, ClientStatRequest::dlen, XrdHttpReq::fileflags, XrdHttpReq::filemodtime, XrdHttpReq::filesize, kXR_stat, ClientStatRequest::requestid, ClientStatRequest::reserved, XrdXrootd::Bridge::Run(), ClientRequest::stat, and XrdHttpReq::xrdreq.

Referenced by XrdHttpReq::ProcessHTTPReq().

+ Here is the call graph for this function:
+ Here is the caller graph for this function:

◆ isHTTPS()

bool XrdHttpProtocol::isHTTPS ( )
inline

called via https

Definition at line 142 of file XrdHttpProtocol.hh.

142 { return ishttps; }

Referenced by XrdHttpExtReq::XrdHttpExtReq().

+ Here is the caller graph for this function:

◆ Match()

XrdProtocol * XrdHttpProtocol::Match ( XrdLink lp)
virtual

Tells if the oustanding bytes on the socket match this protocol implementation.

Implements XrdProtocol.

Definition at line 223 of file XrdHttpProtocol.cc.

223  {
224  char mybuf[16], mybuf2[1024];
225  XrdHttpProtocol *hp;
226  int dlen;
227  bool myishttps = false;
228 
229  // Peek at the first 20 bytes of data
230  //
231  if ((dlen = lp->Peek(mybuf, (int) sizeof (mybuf), hailWait)) < (int) sizeof (mybuf)) {
232  if (dlen <= 0) lp->setEtext("handshake not received");
233  return (XrdProtocol *) 0;
234  }
235  mybuf[dlen - 1] = '\0';
236 
237  // Trace the data
238  //
239 
240  TRACEI(DEBUG, "received dlen: " << dlen);
241  //TRACEI(REQ, "received buf: " << mybuf);
242  mybuf2[0] = '\0';
243  for (int i = 0; i < dlen; i++) {
244  char mybuf3[16];
245  sprintf(mybuf3, "%.02d ", mybuf[i]);
246  strcat(mybuf2, mybuf3);
247 
248  }
249  TRACEI(DEBUG, "received dump: " << mybuf2);
250 
251  // Decide if it looks http or not. For now we are happy if all the received characters are alphanumeric
252  bool ismine = true;
253  for (int i = 0; i < dlen - 1; i++)
254  if (!isprint(mybuf[i]) && (mybuf[i] != '\r') && (mybuf[i] != '\n')) {
255  ismine = false;
256  TRACEI(DEBUG, "This does not look like http at pos " << i);
257  break;
258  }
259 
260  // If it does not look http then look if it looks like https
261  if ((!ismine) && (dlen >= 4)) {
262  char check[4] = {00, 00, 00, 00};
263  if (memcmp(mybuf, check, 4)) {
264 
265  if (httpsmode) {
266  ismine = true;
267  myishttps = true;
268  TRACEI(DEBUG, "This may look like https");
269  } else {
270  TRACEI(ALL, "This may look like https, but https is not configured");
271  }
272 
273  }
274  }
275 
276  if (!ismine) {
277  TRACEI(DEBUG, "This does not look like https. Protocol not matched.");
278  return (XrdProtocol *) 0;
279  }
280 
281  // It does look http or https...
282  // Get a protocol object off the stack (if none, allocate a new one)
283  //
284 
285  TRACEI(REQ, "Protocol matched. https: " << myishttps);
286  if (!(hp = ProtStack.Pop())) hp = new XrdHttpProtocol(myishttps);
287  else
288  hp->ishttps = myishttps;
289 
290  // We now have to do some work arounds to tell the underlying framework
291  // that is is https without invoking TLS on the actual link. Eventually,
292  // we should just use the link's TLS native implementation.
293  //
294  hp->SecEntity.addrInfo = lp->AddrInfo();
295  XrdNetAddr *netP = const_cast<XrdNetAddr*>(lp->NetAddr());
296  netP->SetDialect("https");
297  netP->SetTLS(true);
298 
299  // Allocate 1MB buffer from pool
300  if (!hp->myBuff) {
301  hp->myBuff = BPool->Obtain(1024 * 1024);
302  }
303  hp->myBuffStart = hp->myBuffEnd = hp->myBuff->buff;
304 
305  // Bind the protocol to the link and return the protocol
306  //
307  hp->Link = lp;
308  return (XrdProtocol *) hp;
309 }
#define DEBUG(x)
Definition: XrdBwmTrace.hh:54
#define TRACEI(act, x)
Definition: XrdTrace.hh:66
XrdBuffer * Obtain(int bsz)
Definition: XrdBuffer.cc:140
char * buff
Definition: XrdBuffer.hh:45
static int hailWait
Timeout for reading the handshake.
XrdLink * Link
The link we are bound to.
XrdHttpProtocol(const XrdHttpProtocol &)=default
Ctor, dtors and copy ctor.
void SetDialect(const char *dP)
Definition: XrdNetAddr.hh:205
void SetTLS(bool val)
Definition: XrdNetAddr.cc:590
T * Pop()
Definition: XrdObject.hh:93
XrdNetAddrInfo * addrInfo
Entity's connection details.
Definition: XrdSecEntity.hh:80

References XrdHttpProtocol(), XrdLink::AddrInfo(), XrdSecEntity::addrInfo, BPool, XrdBuffer::buff, DEBUG, hailWait, XrdHttpProtoInfo::httpsmode, Link, XrdLink::NetAddr(), XrdBuffManager::Obtain(), XrdLink::Peek(), XrdObjectQ< T >::Pop(), ProtStack, SecEntity, XrdNetAddr::SetDialect(), XrdLink::setEtext(), XrdNetAddr::SetTLS(), and TRACEI.

+ Here is the call graph for this function:

◆ operator=()

XrdHttpProtocol XrdHttpProtocol::operator= ( const XrdHttpProtocol rhs)

Definition at line 212 of file XrdHttpProtocol.cc.

212  {
213 
214  return *this;
215 }

◆ parseHeader2CGI()

int XrdHttpProtocol::parseHeader2CGI ( XrdOucStream Config,
XrdSysError err,
std::map< std::string, std::string > &  header2cgi 
)
static

Use this function to parse header2cgi configurations.

Definition at line 1876 of file XrdHttpProtocol.cc.

1876  {
1877  char *val, keybuf[1024], parmbuf[1024];
1878  char *parm;
1879 
1880  // Get the header key
1881  val = Config.GetWord();
1882  if (!val || !val[0]) {
1883  err.Emsg("Config", "No headerkey specified.");
1884  return 1;
1885  } else {
1886 
1887  // Trim the beginning, in place
1888  while ( *val && !isalnum(*val) ) val++;
1889  strcpy(keybuf, val);
1890 
1891  // Trim the end, in place
1892  char *pp;
1893  pp = keybuf + strlen(keybuf) - 1;
1894  while ( (pp >= keybuf) && (!isalnum(*pp)) ) {
1895  *pp = '\0';
1896  pp--;
1897  }
1898 
1899  parm = Config.GetWord();
1900 
1901  // Avoids segfault in case a key is given without value
1902  if(!parm || !parm[0]) {
1903  err.Emsg("Config", "No header2cgi value specified. key: '", keybuf, "'");
1904  return 1;
1905  }
1906 
1907  // Trim the beginning, in place
1908  while ( *parm && !isalnum(*parm) ) parm++;
1909  strcpy(parmbuf, parm);
1910 
1911  // Trim the end, in place
1912  pp = parmbuf + strlen(parmbuf) - 1;
1913  while ( (pp >= parmbuf) && (!isalnum(*pp)) ) {
1914  *pp = '\0';
1915  pp--;
1916  }
1917 
1918  // Add this mapping to the map that will be used
1919  try {
1920  header2cgi[keybuf] = parmbuf;
1921  } catch ( ... ) {
1922  err.Emsg("Config", "Can't insert new header2cgi rule. key: '", keybuf, "'");
1923  return 1;
1924  }
1925 
1926  }
1927  return 0;
1928 }
XrdCmsConfig Config

References XrdCms::Config, and XrdSysError::Emsg().

+ Here is the call graph for this function:

◆ Process()

int XrdHttpProtocol::Process ( XrdLink lp)
virtual

Process data incoming from the socket.

Implements XrdProtocol.

Definition at line 502 of file XrdHttpProtocol.cc.

503 {
504  int rc = 0;
505 
506  TRACEI(DEBUG, " Process. lp:"<<(void *)lp<<" reqstate: "<<CurrentReq.reqstate);
507 
508  if (!myBuff || !myBuff->buff || !myBuff->bsize) {
509  TRACE(ALL, " Process. No buffer available. Internal error.");
510  return -1;
511  }
512 
513 
514  if (!SecEntity.host) {
515  char *nfo = GetClientIPStr();
516  if (nfo) {
517  TRACEI(REQ, " Setting host: " << nfo);
518  SecEntity.host = nfo;
519  strcpy(SecEntity.prot, "http");
520  }
521  }
522 
523 
524 
525  // If https then check independently for the ssl handshake
526  if (ishttps && !ssldone) {
527 
528  if (!ssl) {
529  sbio = CreateBIO(Link);
530  BIO_set_nbio(sbio, 1);
532  ssl = (SSL*)xrdctx->Session();
533  postheaderauth = false;
534  postheaderwait = false;
535  postheaderauthdone = false;
536  }
537 
538  if (!ssl) {
539  TRACEI(DEBUG, " SSL_new returned NULL");
540  ERR_print_errors(sslbio_err);
541  return -1;
542  }
543 
544  // If a secxtractor has been loaded
545  // maybe it wants to add its own initialization bits
546  if (secxtractor)
547  secxtractor->InitSSL(ssl, sslcadir);
548 
549  SSL_set_bio(ssl, sbio, sbio);
550  //SSL_set_connect_state(ssl);
551 
552  //SSL_set_fd(ssl, Link->FDnum());
553  struct timeval tv;
554  tv.tv_sec = 10;
555  tv.tv_usec = 0;
556  setsockopt(Link->FDnum(), SOL_SOCKET, SO_RCVTIMEO, (struct timeval *)&tv, sizeof(struct timeval));
557  setsockopt(Link->FDnum(), SOL_SOCKET, SO_SNDTIMEO, (struct timeval *)&tv, sizeof(struct timeval));
558 
559  TRACEI(DEBUG, " Entering SSL_accept...");
560  int res = SSL_accept(ssl);
561  TRACEI(DEBUG, " SSL_accept returned :" << res);
562  if ((res == -1) && (SSL_get_error(ssl, res) == SSL_ERROR_WANT_READ)) {
563  TRACEI(DEBUG, " SSL_accept wants to read more bytes... err:" << SSL_get_error(ssl, res));
564  return 1;
565  }
566 
567  if(res <= 0) {
568  ERR_print_errors(sslbio_err);
569  if (res < 0) {
570 
571  SSL_free(ssl);
572  ssl = 0;
573  return -1;
574  }
575  }
576 
577  BIO_set_nbio(sbio, 0);
578 
579  strcpy(SecEntity.prot, "https");
580 
581  // Get the voms string and auth information
582  if (tlsClientAuth == XrdTlsContext::ClientAuthSetting::kOn && HandleAuthentication(Link)) {
583  SSL_free(ssl);
584  ssl = 0;
585  return -1;
586  }
587 
588  ssldone = true;
589  if (TRACING(TRACE_AUTH)) {
591  }
592  }
593 
594 
595 
596  if (!DoingLogin) {
597  // Re-invocations triggered by the bridge have lp==0
598  // In this case we keep track of a different request state
599  if (lp) {
600 
601  // This is an invocation that was triggered by a socket event
602  // Read all the data that is available, throw it into the buffer
603  if ((rc = getDataOneShot(BuffAvailable())) < 0) {
604  // Error -> exit
605  return -1;
606  }
607 
608  // If we need more bytes, let's wait for another invokation
609  if (BuffUsed() < ResumeBytes) return 1;
610 
611 
612  } else
614  } else if (!DoneSetInfo && !postheaderwait && !postheaderauth && !CurrentReq.userAgent().empty()) { // DoingLogin is true, meaning the login finished.
615  std::string mon_info = "monitor info " + CurrentReq.userAgent();
616  DoneSetInfo = true;
617  if (mon_info.size() >= 1024) {
618  TRACEI(ALL, "User agent string too long");
619  } else if (!Bridge) {
620  TRACEI(ALL, "Internal logic error: Bridge is null after login");
621  } else {
622  TRACEI(DEBUG, "Setting " << mon_info);
623  memset(&CurrentReq.xrdreq, 0, sizeof (ClientRequest));
625  CurrentReq.xrdreq.set.modifier = '\0';
626  memset(CurrentReq.xrdreq.set.reserved, '\0', sizeof(CurrentReq.xrdreq.set.reserved));
627  CurrentReq.xrdreq.set.dlen = htonl(mon_info.size());
628  if (!Bridge->Run((char *) &CurrentReq.xrdreq, (char *) mon_info.c_str(), mon_info.size())) {
629  SendSimpleResp(500, nullptr, nullptr, "Could not set user agent.", 0, false);
630  return -1;
631  }
632  return 0;
633  }
634  } else if (!postheaderwait) {
635  DoingLogin = false;
636  }
637 
638  // Read the next request header, that is, read until a double CRLF is found
639 
640 
641  if (!CurrentReq.headerok) {
642 
643  // Read as many lines as possible into the buffer. An empty line breaks
644  while ((rc = BuffgetLine(tmpline)) > 0) {
645  std::string traceLine = tmpline.c_str();
646  if (TRACING(TRACE_DEBUG)) {
647  traceLine = obfuscateAuth(traceLine);
648  }
649  TRACE(DEBUG, " rc:" << rc << " got hdr line: " << traceLine);
650  if ((rc == 2) && (tmpline.length() > 1) && (tmpline[rc - 1] == '\n')) {
651  CurrentReq.headerok = true;
652  TRACE(DEBUG, " rc:" << rc << " detected header end.");
653  break;
654  }
655 
656 
658  TRACE(DEBUG, " Parsing first line: " << traceLine.c_str());
659  int result = CurrentReq.parseFirstLine((char *)tmpline.c_str(), rc);
660  if (result < 0) {
661  TRACE(DEBUG, " Parsing of first line failed with " << result);
662  return -1;
663  }
664 
665 #if OPENSSL_VERSION_NUMBER >= 0x10100010L
666  // We permit TLS client auth to be deferred until after the request path is sent.
667  // If this is a path requiring client auth, then do that now.
668  if (!postheaderauthdone && tlsClientAuth == XrdTlsContext::ClientAuthSetting::kDefer)
669  {for (const auto &prefix : tlsAuthRequestPrefixes) {
670  {if (!strncmp(prefix.c_str(), CurrentReq.resource.c_str(), prefix.length()))
671  {postheaderwait = true;
672  DoingLogin = true;
673  break;
674  }
675  }
676  }
677  }
678 #endif
679  } else {
680  int result = CurrentReq.parseLine((char *) tmpline.c_str(), rc);
681  if(result < 0) {
682  TRACE(DEBUG, " Parsing of header line failed with " << result)
683  SendSimpleResp(400,NULL,NULL,"Malformed header line. Hint: ensure the line finishes with \"\\r\\n\"", 0, false);
684  return -1;
685  }
686  }
687 
688 
689  }
690 
691  // Here we have CurrentReq loaded with the header, or its relevant fields
692 
693  if (!CurrentReq.headerok) {
694  TRACEI(REQ, " rc:" << rc << "Header not yet complete.");
695 
696  // Here a subtle error condition. IF we failed reading a line AND the buffer
697  // has a reasonable amount of data available THEN we consider the header
698  // as corrupted and shutdown the client
699  if ((rc <= 0) && (BuffUsed() >= 16384)) {
700  TRACEI(ALL, "Corrupted header detected, or line too long. Disconnecting client.");
701  return -1;
702  }
703 
704 
705  if (CurrentReq.reqstate > 0)
707  // Waiting for more data
708  return 1;
709  }
710 
711  }
712 
713 
714 #if OPENSSL_VERSION_NUMBER >= 0x10100010L
715  if (postheaderwait) {
716  postheaderwait = false;
717  if (SSL_verify_client_post_handshake(ssl) != 1) {
718  // This is hit if the remote client doesn't support the post-handshake authentication
719  // (curl, Mac OSX) or TLS v1.3 (RHEL7).
720  TRACEI(ALL, "Unable to request client X.509 authentication");
721  ERR_print_errors(sslbio_err);
722  } else {
723  // We must invoke an empty write to trigger the authentication request in the TLS layer.
724  size_t write_size;
725  auto res = SSL_write_ex(ssl, nullptr, 0, &write_size);
726  if (res <= 0) {
727  TRACEI(DEBUG, " SSL post-handshake auth failed; err:" << SSL_get_error(ssl, res));
728  ERR_print_errors(sslbio_err);
729  SendSimpleResp(500, nullptr, nullptr, "Failed post-handshake authentication", 0, false);
730  return -1;
731  } else {
732  TRACEI(DEBUG, " SSL post-handshake auth finished successfully");
733  postheaderauth = true;
734  return 1;
735  }
736  }
737  }
738  if (postheaderauth) {
739  postheaderauth = false;
740  postheaderauthdone = true;
741  size_t readbytes;
742  TRACEI(REQ, "Reading out response to post-handshake authentication");
743  BIO_set_nbio(sbio, 1);
744  auto res = SSL_peek_ex(ssl, nullptr, 0, &readbytes);
745  if ((res <= 0) && SSL_get_error(ssl, res) != SSL_ERROR_WANT_READ) {
746  SendSimpleResp(500, nullptr, nullptr, "Failed to process authentication frames", 0, false);
747  return -1;
748  }
749  BIO_set_nbio(sbio, 0);
750  if (HandleAuthentication(Link)) {
751  SendSimpleResp(500, nullptr, nullptr, "Failed to extract authentication information from handshake", 0, false);
752  return -1;
753  }
754  }
755 #endif
756 
757  // If we are in self-redirect mode, then let's do it
758  // Do selfredirect only with 'simple' requests, otherwise poor clients may misbehave
759  if (ishttps && ssldone && selfhttps2http &&
762  char hash[512];
763  time_t timenow = time(0);
764 
765 
767  &SecEntity,
768  timenow,
769  secretkey);
770 
771 
772 
773  if (hash[0]) {
774 
775  // Workaround... delete the previous opaque information
776  if (CurrentReq.opaque) {
777  delete CurrentReq.opaque;
778  CurrentReq.opaque = 0;
779  }
780 
781  TRACEI(REQ, " rc:" << rc << " self-redirecting to http with security token.");
782 
783  XrdOucString dest = "Location: http://";
784  // Here I should put the IP addr of the server
785 
786  // We have to recompute it here because we don't know to which
787  // interface the client had connected to
788  struct sockaddr_storage sa;
789  socklen_t sl = sizeof(sa);
790  getsockname(this->Link->AddrInfo()->SockFD(), (struct sockaddr*)&sa, &sl);
791 
792  // now get it back and print it
793  char buf[256];
794  bool ok = false;
795 
796  switch (sa.ss_family) {
797  case AF_INET:
798  if (inet_ntop(AF_INET, &(((sockaddr_in*)&sa)->sin_addr), buf, INET_ADDRSTRLEN)) {
799  if (Addr_str) free(Addr_str);
800  Addr_str = strdup(buf);
801  ok = true;
802  }
803  break;
804  case AF_INET6:
805  if (inet_ntop(AF_INET6, &(((sockaddr_in6*)&sa)->sin6_addr), buf, INET6_ADDRSTRLEN)) {
806  if (Addr_str) free(Addr_str);
807  Addr_str = (char *)malloc(strlen(buf)+3);
808  strcpy(Addr_str, "[");
809  strcat(Addr_str, buf);
810  strcat(Addr_str, "]");
811  ok = true;
812  }
813  break;
814  default:
815  TRACEI(REQ, " Can't recognize the address family of the local host.");
816  }
817 
818  if (ok) {
819  dest += Addr_str;
820  dest += ":";
821  dest += Port_str;
822  dest += CurrentReq.resource.c_str();
823  TRACEI(REQ," rc:"<<rc<<" self-redirecting to http with security token: '"
824  << dest.c_str() << "'");
825 
826 
827  CurrentReq.appendOpaque(dest, &SecEntity, hash, timenow);
828  SendSimpleResp(302, NULL, (char *) dest.c_str(), 0, 0, true);
829  CurrentReq.reset();
830  return -1;
831  }
832 
833  TRACEI(REQ, " rc:" << rc << " Can't perform self-redirection.");
834 
835  }
836  else {
837  TRACEI(ALL, " Could not calculate self-redirection hash");
838  }
839  }
840 
841  // If this is not https, then extract the signed information from the url
842  // and fill the SecEntity structure as if we were using https
843  if (!ishttps && !ssldone) {
844 
845 
846  if (CurrentReq.opaque) {
847  char * tk = CurrentReq.opaque->Get("xrdhttptk");
848  // If there is a hash then we use it as authn info
849  if (tk) {
850 
851  time_t tim = 0;
852  char * t = CurrentReq.opaque->Get("xrdhttptime");
853  if (t) tim = atoi(t);
854  if (!t) {
855  TRACEI(REQ, " xrdhttptime not specified. Authentication failed.");
856  return -1;
857  }
858  if (abs(time(0) - tim) > XRHTTP_TK_GRACETIME) {
859  TRACEI(REQ, " Token expired. Authentication failed.");
860  return -1;
861  }
862 
863  // Fill the Secentity from the fields in the URL:name, vo, host
864  char *nfo;
865 
866  nfo = CurrentReq.opaque->Get("xrdhttpvorg");
867  if (nfo) {
868  TRACEI(DEBUG, " Setting vorg: " << nfo);
869  SecEntity.vorg = strdup(nfo);
870  TRACEI(REQ, " Setting vorg: " << SecEntity.vorg);
871  }
872 
873  nfo = CurrentReq.opaque->Get("xrdhttpname");
874  if (nfo) {
875  TRACEI(DEBUG, " Setting name: " << nfo);
876  SecEntity.name = unquote(nfo);
877  TRACEI(REQ, " Setting name: " << SecEntity.name);
878  }
879 
880  nfo = CurrentReq.opaque->Get("xrdhttphost");
881  if (nfo) {
882  TRACEI(DEBUG, " Setting host: " << nfo);
883  if (SecEntity.host) free(SecEntity.host);
884  SecEntity.host = unquote(nfo);
885  TRACEI(REQ, " Setting host: " << SecEntity.host);
886  }
887 
888  nfo = CurrentReq.opaque->Get("xrdhttpdn");
889  if (nfo) {
890  TRACEI(DEBUG, " Setting dn: " << nfo);
891  SecEntity.moninfo = unquote(nfo);
892  TRACEI(REQ, " Setting dn: " << SecEntity.moninfo);
893  }
894 
895  nfo = CurrentReq.opaque->Get("xrdhttprole");
896  if (nfo) {
897  TRACEI(DEBUG, " Setting role: " << nfo);
898  SecEntity.role = unquote(nfo);
899  TRACEI(REQ, " Setting role: " << SecEntity.role);
900  }
901 
902  nfo = CurrentReq.opaque->Get("xrdhttpgrps");
903  if (nfo) {
904  TRACEI(DEBUG, " Setting grps: " << nfo);
905  SecEntity.grps = unquote(nfo);
906  TRACEI(REQ, " Setting grps: " << SecEntity.grps);
907  }
908 
909  nfo = CurrentReq.opaque->Get("xrdhttpendorsements");
910  if (nfo) {
911  TRACEI(DEBUG, " Setting endorsements: " << nfo);
913  TRACEI(REQ, " Setting endorsements: " << SecEntity.endorsements);
914  }
915 
916  nfo = CurrentReq.opaque->Get("xrdhttpcredslen");
917  if (nfo) {
918  TRACEI(DEBUG, " Setting credslen: " << nfo);
919  char *s1 = unquote(nfo);
920  if (s1 && s1[0]) {
921  SecEntity.credslen = atoi(s1);
922  TRACEI(REQ, " Setting credslen: " << SecEntity.credslen);
923  }
924  if (s1) free(s1);
925  }
926 
927  if (SecEntity.credslen) {
928  nfo = CurrentReq.opaque->Get("xrdhttpcreds");
929  if (nfo) {
930  TRACEI(DEBUG, " Setting creds: " << nfo);
931  SecEntity.creds = unquote(nfo);
932  TRACEI(REQ, " Setting creds: " << SecEntity.creds);
933  }
934  }
935 
936  char hash[512];
937 
939  &SecEntity,
940  tim,
941  secretkey);
942 
943  if (compareHash(hash, tk)) {
944  TRACEI(REQ, " Invalid tk '" << tk << "' != '" << hash << "'(calculated). Authentication failed.");
945  return -1;
946  }
947 
948  } else {
949  // Client is plain http. If we have a secret key then we reject it
950  if (secretkey) {
951  TRACEI(ALL, " Rejecting plain http with no valid token as we have a secretkey.");
952  return -1;
953  }
954  }
955 
956  } else {
957  // Client is plain http. If we have a secret key then we reject it
958  if (secretkey) {
959  TRACEI(ALL, " Rejecting plain http with no valid token as we have a secretkey.");
960  return -1;
961  }
962  }
963 
964  ssldone = true;
965  }
966 
967 
968 
969  // Now we have everything that is needed to try the login
970  // Remember that if there is an exthandler then it has the responsibility
971  // for authorization in the paths that it manages
972  if (!Bridge && !FindMatchingExtHandler(CurrentReq)) {
973  if (SecEntity.name)
974  Bridge = XrdXrootd::Bridge::Login(&CurrentReq, Link, &SecEntity, SecEntity.name, ishttps ? "https" : "http");
975  else
976  Bridge = XrdXrootd::Bridge::Login(&CurrentReq, Link, &SecEntity, "unknown", ishttps ? "https" : "http");
977 
978  if (!Bridge) {
979  TRACEI(REQ, " Authorization failed.");
980  return -1;
981  }
982 
983  // Let the bridge process the login, and then reinvoke us
984  DoingLogin = true;
985  return 0;
986  }
987 
988  // Compute and send the response. This may involve further reading from the socket
989  rc = CurrentReq.ProcessHTTPReq();
990  if (rc < 0)
991  CurrentReq.reset();
992 
993 
994 
995  TRACEI(REQ, "Process is exiting rc:" << rc);
996  return rc;
997 }
struct ClientSetRequest set
Definition: XProtocol.hh:871
@ kXR_set
Definition: XProtocol.hh:130
kXR_unt16 requestid
Definition: XProtocol.hh:719
kXR_int32 dlen
Definition: XProtocol.hh:722
kXR_char modifier
Definition: XProtocol.hh:721
kXR_char reserved[15]
Definition: XProtocol.hh:720
short kXR_int16
Definition: XPtypes.hh:66
#define XRHTTP_TK_GRACETIME
#define TRACE_AUTH
Definition: XrdHttpTrace.hh:48
int compareHash(const char *h1, const char *h2)
char * unquote(char *str)
void calcHashes(char *hash, const char *fn, kXR_int16 request, XrdSecEntity *secent, time_t tim, const char *key)
std::string obfuscateAuth(const std::string &input)
#define TRACE_DEBUG
Definition: XrdTrace.hh:36
#define TRACE(act, x)
Definition: XrdTrace.hh:63
#define TRACING(x)
Definition: XrdTrace.hh:70
int bsize
Definition: XrdBuffer.hh:46
static char * secretkey
The key used to calculate the url hashes.
static bool selfhttps2http
If client is HTTPS, self-redirect with HTTP+token.
static char * sslcadir
int reqstate
State machine to talk to the bridge.
Definition: XrdHttpReq.hh:322
XrdOucString resource
The resource specified by the request, stripped of opaque data.
Definition: XrdHttpReq.hh:244
bool headerok
Tells if we have finished reading the header.
Definition: XrdHttpReq.hh:252
ReqType request
The request we got.
Definition: XrdHttpReq.hh:236
int ProcessHTTPReq()
Definition: XrdHttpReq.cc:928
XrdOucEnv * opaque
The opaque data, after parsing.
Definition: XrdHttpReq.hh:246
int parseFirstLine(char *line, int len)
Parse the first line of the header.
Definition: XrdHttpReq.cc:256
int parseLine(char *line, int len)
Parse the header.
Definition: XrdHttpReq.cc:116
void appendOpaque(XrdOucString &s, XrdSecEntity *secent, char *hash, time_t tnow)
Definition: XrdHttpReq.cc:629
const std::string & userAgent() const
Definition: XrdHttpReq.hh:210
virtual void reset()
Definition: XrdHttpReq.cc:2752
virtual int InitSSL(SSL *, char *)
char * Get(const char *varname)
Definition: XrdOucEnv.hh:69
char * vorg
Entity's virtual organization(s)
Definition: XrdSecEntity.hh:71
int credslen
Length of the 'creds' data.
Definition: XrdSecEntity.hh:78
char prot[XrdSecPROTOIDSIZE]
Auth protocol used (e.g. krb5)
Definition: XrdSecEntity.hh:67
char * creds
Raw entity credentials or cert.
Definition: XrdSecEntity.hh:77
char * grps
Entity's group name(s)
Definition: XrdSecEntity.hh:73
char * name
Entity's name.
Definition: XrdSecEntity.hh:69
char * role
Entity's role(s)
Definition: XrdSecEntity.hh:72
char * endorsements
Protocol specific endorsements.
Definition: XrdSecEntity.hh:75
void Display(XrdSysError &mDest)
Definition: XrdSecEntity.cc:58
char * moninfo
Information for monitoring.
Definition: XrdSecEntity.hh:76
char * host
Entity's host name dnr dependent.
Definition: XrdSecEntity.hh:70
void SetTlsClientAuth(ClientAuthSetting setting)
void * Session()
static Bridge * Login(Result *rsltP, XrdLink *linkP, XrdSecEntity *seceP, const char *nameP, const char *protP)
std::vector< std::string > tlsAuthRequestPrefixes
XrdTlsContext::ClientAuthSetting tlsClientAuth

References Addr_str, XrdLink::AddrInfo(), XrdHttpReq::appendOpaque(), Bridge, XrdBuffer::bsize, XrdBuffer::buff, XrdOucString::c_str(), calcHashes(), compareHash(), XrdSecEntity::creds, XrdSecEntity::credslen, CurrentReq, DEBUG, XrdSecEntity::Display(), ClientSetRequest::dlen, eDest, XrdSecEntity::endorsements, XrdLink::FDnum(), XrdOucEnv::Get(), XrdSecEntity::grps, XrdHttpReq::headerok, XrdSecEntity::host, XrdHttpSecXtractor::InitSSL(), kXR_set, XrdOucString::length(), Link, XrdXrootd::Bridge::Login(), ClientSetRequest::modifier, XrdSecEntity::moninfo, XrdSecEntity::name, obfuscateAuth(), XrdHttpReq::opaque, XrdHttpReq::parseFirstLine(), XrdHttpReq::parseLine(), Port_str, XrdHttpReq::ProcessHTTPReq(), XrdSecEntity::prot, XrdHttpReq::reqstate, XrdHttpReq::request, ClientSetRequest::requestid, ClientSetRequest::reserved, XrdHttpReq::reset(), XrdHttpReq::resource, XrdSecEntity::role, XrdHttpReq::rtGET, XrdHttpReq::rtPROPFIND, XrdHttpReq::rtPUT, XrdHttpReq::rtUnset, XrdXrootd::Bridge::Run(), SecEntity, secretkey, selfhttps2http, XrdTlsContext::Session(), ClientRequest::set, XrdTlsContext::SetTlsClientAuth(), XrdNetAddrInfo::SockFD(), sslcadir, XrdHttpProtoInfo::tlsAuthRequestPrefixes, XrdHttpProtoInfo::tlsClientAuth, TRACE, TRACE_AUTH, TRACE_DEBUG, TRACEI, TRACING, unquote(), XrdHttpReq::userAgent(), XrdSecEntity::vorg, XrdHttpProtoInfo::xrdctx, XrdHttpReq::xrdreq, and XRHTTP_TK_GRACETIME.

+ Here is the call graph for this function:

◆ Recycle()

void XrdHttpProtocol::Recycle ( XrdLink lp,
int  consec,
const char *  reason 
)
virtual

Recycle this instance.

Implements XrdProtocol.

Definition at line 1005 of file XrdHttpProtocol.cc.

1005  {
1006 
1007  // Release all appendages
1008  //
1009 
1010  Cleanup();
1011 
1012 
1013  // Set fields to starting point (debugging mostly)
1014  //
1015  Reset();
1016 
1017  // Push ourselves on the stack
1018  //
1020 }
void Push(XrdObject< T > *Node)
Definition: XrdObject.hh:101

References ProtLink, ProtStack, and XrdObjectQ< T >::Push().

+ Here is the call graph for this function:

◆ Stats()

int XrdHttpProtocol::Stats ( char *  buff,
int  blen,
int  do_sync = 0 
)
virtual

Get activity stats.

Implements XrdProtocol.

Definition at line 1022 of file XrdHttpProtocol.cc.

1022  {
1023  // Synchronize statistics if need be
1024  //
1025  // if (do_sync) {
1026  //
1027  // SI->statsMutex.Lock();
1028  // SI->readCnt += numReads;
1029  // cumReads += numReads;
1030  // numReads = 0;
1031  // SI->prerCnt += numReadP;
1032  // cumReadP += numReadP;
1033  // numReadP = 0;
1034  // SI->rvecCnt += numReadV;
1035  // cumReadV += numReadV;
1036  // numReadV = 0;
1037  // SI->rsegCnt += numSegsV;
1038  // cumSegsV += numSegsV;
1039  // numSegsV = 0;
1040  // SI->writeCnt += numWrites;
1041  // cumWrites += numWrites;
1042  // numWrites = 0;
1043  // SI->statsMutex.UnLock();
1044  // }
1045  //
1046  // // Now return the statistics
1047  // //
1048  // return SI->Stats(buff, blen, do_sync);
1049 
1050  return 0;
1051 }

Friends And Related Function Documentation

◆ XrdHttpExtReq

friend class XrdHttpExtReq
friend

Definition at line 83 of file XrdHttpProtocol.hh.

◆ XrdHttpReq

friend class XrdHttpReq
friend

Definition at line 82 of file XrdHttpProtocol.hh.

Member Data Documentation

◆ Addr_str

char* XrdHttpProtocol::Addr_str
protected

Our IP address, as a string. Please remember that this may not be unique for a given machine, hence we need to keep it here and recompute ad every new connection.

Definition at line 377 of file XrdHttpProtocol.hh.

Referenced by XrdHttpProtocol(), and Process().

◆ BPool

XrdBuffManager * XrdHttpProtocol::BPool = 0
staticprotected

Definition at line 368 of file XrdHttpProtocol.hh.

Referenced by Configure(), and Match().

◆ Bridge

XrdXrootd::Bridge* XrdHttpProtocol::Bridge
protected

The Bridge that we use to exercise the xrootd internals.

Definition at line 383 of file XrdHttpProtocol.hh.

Referenced by doChksum(), doStat(), Process(), and XrdHttpReq::ProcessHTTPReq().

◆ CIA

XrdSecService * XrdHttpProtocol::CIA = 0
staticprotected

Definition at line 370 of file XrdHttpProtocol.hh.

◆ cksumHandler

XrdHttpChecksumHandler XrdHttpProtocol::cksumHandler = XrdHttpChecksumHandler()
static

Definition at line 136 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::ProcessHTTPReq().

◆ compatNameGeneration

bool XrdHttpProtocol::compatNameGeneration = false
staticprotected

Definition at line 416 of file XrdHttpProtocol.hh.

◆ crlRefIntervalSec

int XrdHttpProtocol::crlRefIntervalSec = XrdTlsContext::DEFAULT_CRL_REF_INT_SEC
staticprotected

CRL thread refresh interval.

Definition at line 411 of file XrdHttpProtocol.hh.

◆ CurrentReq

XrdHttpReq XrdHttpProtocol::CurrentReq
protected

Area for coordinating request and responses to/from the bridge This also can process HTTP/DAV stuff

Definition at line 388 of file XrdHttpProtocol.hh.

Referenced by doChksum(), doStat(), and Process().

◆ eDest

XrdSysError XrdHttpProtocol::eDest = 0
staticprotected

Definition at line 369 of file XrdHttpProtocol.hh.

Referenced by Configure(), and Process().

◆ embeddedstatic

bool XrdHttpProtocol::embeddedstatic = true
staticprotected

If true, use the embedded css and icons.

Definition at line 437 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::ProcessHTTPReq().

◆ gridmap

char * XrdHttpProtocol::gridmap = 0
staticprotected

Gridmap file location. The same used by XrdSecGsi.

Definition at line 414 of file XrdHttpProtocol.hh.

◆ hailWait

int XrdHttpProtocol::hailWait = 60000
staticprotected

Timeout for reading the handshake.

Definition at line 396 of file XrdHttpProtocol.hh.

Referenced by Match().

◆ hdr2cgimap

std::map< std::string, std::string > XrdHttpProtocol::hdr2cgimap
staticprotected

Rules that turn HTTP headers to cgi tokens in the URL, for internal comsumption.

Definition at line 453 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::parseLine().

◆ isdesthttps

bool XrdHttpProtocol::isdesthttps = false
staticprotected

True if the redirections must be towards https targets.

Definition at line 425 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::Redir().

◆ isRequiredGridmap

bool XrdHttpProtocol::isRequiredGridmap = false
staticprotected

Definition at line 415 of file XrdHttpProtocol.hh.

◆ Link

XrdLink* XrdHttpProtocol::Link
protected

The link we are bound to.

Definition at line 373 of file XrdHttpProtocol.hh.

Referenced by XrdHttpExtReq::GetClientID(), Match(), and Process().

◆ listdeny

bool XrdHttpProtocol::listdeny = false
staticprotected

If true, any form of listing is denied.

Definition at line 431 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::ProcessHTTPReq().

◆ listredir

char * XrdHttpProtocol::listredir = 0
staticprotected

Url to redirect to in the case a listing is requested.

Definition at line 428 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::ProcessHTTPReq().

◆ m_bio_method

BIO_METHOD * XrdHttpProtocol::m_bio_method = NULL
staticprotected

C-style vptr table for our custom BIO objects.

Definition at line 459 of file XrdHttpProtocol.hh.

◆ m_bio_type

int XrdHttpProtocol::m_bio_type = 0
staticprotected

Type identifier for our custom BIO objects.

Definition at line 456 of file XrdHttpProtocol.hh.

◆ m_staticheader_map

std::unordered_map<std::string, std::vector<std::pair<std::string, std::string> > > XrdHttpProtocol::m_staticheader_map
staticprotected

The static headers to always return; map is from verb to a list of (header, val) pairs.

Definition at line 471 of file XrdHttpProtocol.hh.

◆ m_staticheaders

std::unordered_map<std::string, std::string> XrdHttpProtocol::m_staticheaders
staticprotected

The static string version of m_staticheader_map. After config parsing is done, this is computed and we won't need to reference m_staticheader_map in the response path.

Definition at line 475 of file XrdHttpProtocol.hh.

◆ myRole

kXR_int32 XrdHttpProtocol::myRole = kXR_isManager
staticprotected

Our role.

Definition at line 450 of file XrdHttpProtocol.hh.

Referenced by Configure(), and XrdHttpReq::ProcessHTTPReq().

◆ pmarkHandle

XrdNetPMark * XrdHttpProtocol::pmarkHandle = nullptr
staticprotected

Packet marking handler pointer (assigned from the environment during the Config() call)

Definition at line 465 of file XrdHttpProtocol.hh.

Referenced by XrdHttpExtReq::XrdHttpExtReq(), and XrdHttpReq::parseLine().

◆ Port

int XrdHttpProtocol::Port = 1094
staticprotected

Our port.

Definition at line 402 of file XrdHttpProtocol.hh.

Referenced by Configure().

◆ Port_str

char * XrdHttpProtocol::Port_str = 0
staticprotected

Our port, as a string.

Definition at line 405 of file XrdHttpProtocol.hh.

Referenced by Configure(), and Process().

◆ ProtLink

XrdObject<XrdHttpProtocol> XrdHttpProtocol::ProtLink

Definition at line 129 of file XrdHttpProtocol.hh.

Referenced by Recycle().

◆ ProtStack

XrdObjectQ< XrdHttpProtocol > XrdHttpProtocol::ProtStack
static

Definition at line 128 of file XrdHttpProtocol.hh.

Referenced by Configure(), Match(), and Recycle().

◆ ReadRangeConfig

XrdHttpReadRangeHandler::Configuration XrdHttpProtocol::ReadRangeConfig
static

configuration for the read range handler

Definition at line 139 of file XrdHttpProtocol.hh.

◆ readWait

int XrdHttpProtocol::readWait = 300000
staticprotected

Timeout for reading data.

Definition at line 399 of file XrdHttpProtocol.hh.

◆ Sched

XrdScheduler * XrdHttpProtocol::Sched = 0
staticprotected

Definition at line 367 of file XrdHttpProtocol.hh.

Referenced by Configure().

◆ SecEntity

XrdSecEntity XrdHttpProtocol::SecEntity

Authentication area.

Definition at line 133 of file XrdHttpProtocol.hh.

Referenced by XrdHttpExtReq::XrdHttpExtReq(), XrdHttpExtReq::GetSecEntity(), Match(), Process(), and XrdHttpReq::Redir().

◆ secretkey

char * XrdHttpProtocol::secretkey = 0
staticprotected

The key used to calculate the url hashes.

Definition at line 419 of file XrdHttpProtocol.hh.

Referenced by Process(), and XrdHttpReq::Redir().

◆ selfhttps2http

bool XrdHttpProtocol::selfhttps2http = false
staticprotected

If client is HTTPS, self-redirect with HTTP+token.

Definition at line 434 of file XrdHttpProtocol.hh.

Referenced by Process().

◆ servGMap

XrdOucGMap * XrdHttpProtocol::servGMap = 0
staticprotected

The instance of the DN mapper. Created only when a valid path is given.

Definition at line 380 of file XrdHttpProtocol.hh.

◆ sslcadir

char * XrdHttpProtocol::sslcadir = 0
staticprotected

Definition at line 408 of file XrdHttpProtocol.hh.

Referenced by Process().

◆ sslcafile

char * XrdHttpProtocol::sslcafile = 0
staticprotected

Definition at line 408 of file XrdHttpProtocol.hh.

◆ sslcert

char * XrdHttpProtocol::sslcert = 0
staticprotected

OpenSSL stuff.

Definition at line 408 of file XrdHttpProtocol.hh.

◆ sslcipherfilter

char * XrdHttpProtocol::sslcipherfilter = 0
staticprotected

Definition at line 408 of file XrdHttpProtocol.hh.

◆ sslkey

char * XrdHttpProtocol::sslkey = 0
staticprotected

Definition at line 408 of file XrdHttpProtocol.hh.

◆ sslverifydepth

int XrdHttpProtocol::sslverifydepth = 9
staticprotected

Depth of verification of a certificate chain.

Definition at line 422 of file XrdHttpProtocol.hh.

◆ staticpreload

XrdOucHash< XrdHttpProtocol::StaticPreloadInfo > * XrdHttpProtocol::staticpreload = 0
staticprotected

Definition at line 447 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::ProcessHTTPReq().

◆ staticredir

char * XrdHttpProtocol::staticredir = 0
staticprotected

Definition at line 440 of file XrdHttpProtocol.hh.

Referenced by XrdHttpReq::ProcessHTTPReq().

◆ tpcForwardCreds

bool XrdHttpProtocol::tpcForwardCreds = false
staticprotected

If set to true, the HTTP TPC transfers will forward the credentials to redirected hosts.

Definition at line 468 of file XrdHttpProtocol.hh.

Referenced by XrdHttpExtReq::XrdHttpExtReq().

◆ xrd_cslist

char * XrdHttpProtocol::xrd_cslist = nullptr
staticprotected

The list of checksums that were configured via the xrd.cksum parameter on the server config file.

Definition at line 462 of file XrdHttpProtocol.hh.

Referenced by Configure().


The documentation for this class was generated from the following files: