XRootD
XrdHttpUtils.hh File Reference

Utility functions for XrdHTTP. More...

#include "XProtocol/XPtypes.hh"
#include "XrdSec/XrdSecEntity.hh"
#include "XrdOuc/XrdOucIOVec.hh"
#include "XrdOuc/XrdOucTUtils.hh"
#include <string>
#include <cstring>
#include <vector>
#include <memory>
#include <sstream>
+ Include dependency graph for XrdHttpUtils.hh:
+ This graph shows which files directly or indirectly include this file:

Go to the source code of this file.

Typedefs

typedef std::vector< XrdOucIOVec2XrdHttpIOList
 

Enumerations

enum  : int {
  HTTP_CONTINUE = 100 ,
  HTTP_SWITCHING_PROTOCOLS = 101 ,
  HTTP_PROCESSING = 102 ,
  HTTP_EARLY_HINTS = 103 ,
  HTTP_OK = 200 ,
  HTTP_CREATED = 201 ,
  HTTP_ACCEPTED = 202 ,
  HTTP_NON_AUTHORITATIVE_INFORMATION = 203 ,
  HTTP_NO_CONTENT = 204 ,
  HTTP_RESET_CONTENT = 205 ,
  HTTP_PARTIAL_CONTENT = 206 ,
  HTTP_MULTI_STATUS = 207 ,
  HTTP_ALREADY_REPORTED = 208 ,
  HTTP_IM_USED = 226 ,
  HTTP_MULTIPLE_CHOICES = 300 ,
  HTTP_MOVED_PERMANENTLY = 301 ,
  HTTP_FOUND = 302 ,
  HTTP_SEE_OTHER = 303 ,
  HTTP_NOT_MODIFIED = 304 ,
  HTTP_USE_PROXY = 305 ,
  HTTP_TEMPORARY_REDIRECT = 307 ,
  HTTP_PERMANENT_REDIRECT = 308 ,
  HTTP_BAD_REQUEST = 400 ,
  HTTP_UNAUTHORIZED = 401 ,
  HTTP_PAYMENT_REQUIRED = 402 ,
  HTTP_FORBIDDEN = 403 ,
  HTTP_NOT_FOUND = 404 ,
  HTTP_METHOD_NOT_ALLOWED = 405 ,
  HTTP_NOT_ACCEPTABLE = 406 ,
  HTTP_PROXY_AUTHENTICATION_REQUIRED = 407 ,
  HTTP_REQUEST_TIMEOUT = 408 ,
  HTTP_CONFLICT = 409 ,
  HTTP_GONE = 410 ,
  HTTP_LENGTH_REQUIRED = 411 ,
  HTTP_PRECONDITION_FAILED = 412 ,
  HTTP_PAYLOAD_TOO_LARGE = 413 ,
  HTTP_URI_TOO_LONG = 414 ,
  HTTP_UNSUPPORTED_MEDIA_TYPE = 415 ,
  HTTP_RANGE_NOT_SATISFIABLE = 416 ,
  HTTP_EXPECTATION_FAILED = 417 ,
  HTTP_IM_A_TEAPOT = 418 ,
  HTTP_MISDIRECTED_REQUEST = 421 ,
  HTTP_UNPROCESSABLE_ENTITY = 422 ,
  HTTP_LOCKED = 423 ,
  HTTP_FAILED_DEPENDENCY = 424 ,
  HTTP_TOO_EARLY = 425 ,
  HTTP_UPGRADE_REQUIRED = 426 ,
  HTTP_PRECONDITION_REQUIRED = 428 ,
  HTTP_TOO_MANY_REQUESTS = 429 ,
  HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE = 431 ,
  HTTP_UNAVAILABLE_FOR_LEGAL_REASONS = 451 ,
  HTTP_INTERNAL_SERVER_ERROR = 500 ,
  HTTP_NOT_IMPLEMENTED = 501 ,
  HTTP_BAD_GATEWAY = 502 ,
  HTTP_SERVICE_UNAVAILABLE = 503 ,
  HTTP_GATEWAY_TIMEOUT = 504 ,
  HTTP_HTTP_VERSION_NOT_SUPPORTED = 505 ,
  HTTP_VARIANT_ALSO_NEGOTIATES = 506 ,
  HTTP_INSUFFICIENT_STORAGE = 507 ,
  HTTP_LOOP_DETECTED = 508 ,
  HTTP_NOT_EXTENDED = 510 ,
  HTTP_NETWORK_AUTHENTICATION_REQUIRED = 511
}
 

Functions

void calcHashes (char *hash, const char *fn, kXR_int16 req, XrdSecEntity *secent, time_t tim, const char *key)
 
int compareHash (const char *h1, const char *h2)
 
char * decode_raw (const std::string &str)
 
std::string decode_str (const std::string &str)
 
std::string encode_opaque (const std::string &opaque)
 
char * encode_raw (const std::string &str)
 
std::string encode_str (const std::string &str)
 
char * escapeXML (const char *str)
 
bool Fromhexdigest (const unsigned char *input, int length, unsigned char *out)
 
std::string httpStatusToString (int status)
 
std::string itos (long i)
 
int mapErrNoToHttp (int err)
 
char * mystrchrnul (const char *s, int c)
 
int parseURL (char *url, char *host, int &port, char **path)
 
char * quote (const char *str)
 
void Tobase64 (const unsigned char *input, int length, char *out)
 
char * unquote (char *str)
 

Detailed Description

Utility functions for XrdHTTP.

Author
Fabrizio Furano
Date
April 2013

Definition in file XrdHttpUtils.hh.

Typedef Documentation

◆ XrdHttpIOList

typedef std::vector<XrdOucIOVec2> XrdHttpIOList

Definition at line 249 of file XrdHttpUtils.hh.

Enumeration Type Documentation

◆ anonymous enum

anonymous enum : int
Enumerator
HTTP_CONTINUE 
HTTP_SWITCHING_PROTOCOLS 
HTTP_PROCESSING 
HTTP_EARLY_HINTS 
HTTP_OK 
HTTP_CREATED 
HTTP_ACCEPTED 
HTTP_NON_AUTHORITATIVE_INFORMATION 
HTTP_NO_CONTENT 
HTTP_RESET_CONTENT 
HTTP_PARTIAL_CONTENT 
HTTP_MULTI_STATUS 
HTTP_ALREADY_REPORTED 
HTTP_IM_USED 
HTTP_MULTIPLE_CHOICES 
HTTP_MOVED_PERMANENTLY 
HTTP_FOUND 
HTTP_SEE_OTHER 
HTTP_NOT_MODIFIED 
HTTP_USE_PROXY 
HTTP_TEMPORARY_REDIRECT 
HTTP_PERMANENT_REDIRECT 
HTTP_BAD_REQUEST 
HTTP_UNAUTHORIZED 
HTTP_PAYMENT_REQUIRED 
HTTP_FORBIDDEN 
HTTP_NOT_FOUND 
HTTP_METHOD_NOT_ALLOWED 
HTTP_NOT_ACCEPTABLE 
HTTP_PROXY_AUTHENTICATION_REQUIRED 
HTTP_REQUEST_TIMEOUT 
HTTP_CONFLICT 
HTTP_GONE 
HTTP_LENGTH_REQUIRED 
HTTP_PRECONDITION_FAILED 
HTTP_PAYLOAD_TOO_LARGE 
HTTP_URI_TOO_LONG 
HTTP_UNSUPPORTED_MEDIA_TYPE 
HTTP_RANGE_NOT_SATISFIABLE 
HTTP_EXPECTATION_FAILED 
HTTP_IM_A_TEAPOT 
HTTP_MISDIRECTED_REQUEST 
HTTP_UNPROCESSABLE_ENTITY 
HTTP_LOCKED 
HTTP_FAILED_DEPENDENCY 
HTTP_TOO_EARLY 
HTTP_UPGRADE_REQUIRED 
HTTP_PRECONDITION_REQUIRED 
HTTP_TOO_MANY_REQUESTS 
HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE 
HTTP_UNAVAILABLE_FOR_LEGAL_REASONS 
HTTP_INTERNAL_SERVER_ERROR 
HTTP_NOT_IMPLEMENTED 
HTTP_BAD_GATEWAY 
HTTP_SERVICE_UNAVAILABLE 
HTTP_GATEWAY_TIMEOUT 
HTTP_HTTP_VERSION_NOT_SUPPORTED 
HTTP_VARIANT_ALSO_NEGOTIATES 
HTTP_INSUFFICIENT_STORAGE 
HTTP_LOOP_DETECTED 
HTTP_NOT_EXTENDED 
HTTP_NETWORK_AUTHENTICATION_REQUIRED 

Definition at line 51 of file XrdHttpUtils.hh.

51  : int {
52  HTTP_CONTINUE = 100,
54  HTTP_PROCESSING = 102,
55  HTTP_EARLY_HINTS = 103,
56 
57  // 2xx Success
58  HTTP_OK = 200,
59  HTTP_CREATED = 201,
60  HTTP_ACCEPTED = 202,
62  HTTP_NO_CONTENT = 204,
63  HTTP_RESET_CONTENT = 205,
65  HTTP_MULTI_STATUS = 207,
67  HTTP_IM_USED = 226,
68 
69  // 3xx Redirection
72  HTTP_FOUND = 302,
73  HTTP_SEE_OTHER = 303,
74  HTTP_NOT_MODIFIED = 304,
75  HTTP_USE_PROXY = 305,
78 
79  // 4xx Client Errors
80  HTTP_BAD_REQUEST = 400,
81  HTTP_UNAUTHORIZED = 401,
83  HTTP_FORBIDDEN = 403,
84  HTTP_NOT_FOUND = 404,
86  HTTP_NOT_ACCEPTABLE = 406,
89  HTTP_CONFLICT = 409,
90  HTTP_GONE = 410,
94  HTTP_URI_TOO_LONG = 414,
98  HTTP_IM_A_TEAPOT = 418, // RFC 2324
101  HTTP_LOCKED = 423,
103  HTTP_TOO_EARLY = 425,
104  HTTP_UPGRADE_REQUIRED = 426,
109 
110  // 5xx Server Errors
112  HTTP_NOT_IMPLEMENTED = 501,
113  HTTP_BAD_GATEWAY = 502,
115  HTTP_GATEWAY_TIMEOUT = 504,
119  HTTP_LOOP_DETECTED = 508,
120  HTTP_NOT_EXTENDED = 510,
122 };
@ HTTP_HTTP_VERSION_NOT_SUPPORTED
@ HTTP_INSUFFICIENT_STORAGE
@ HTTP_PRECONDITION_FAILED
Definition: XrdHttpUtils.hh:92
@ HTTP_BAD_REQUEST
Definition: XrdHttpUtils.hh:80
@ HTTP_NOT_EXTENDED
@ HTTP_FAILED_DEPENDENCY
@ HTTP_VARIANT_ALSO_NEGOTIATES
@ HTTP_CREATED
Definition: XrdHttpUtils.hh:59
@ HTTP_IM_A_TEAPOT
Definition: XrdHttpUtils.hh:98
@ HTTP_MULTIPLE_CHOICES
Definition: XrdHttpUtils.hh:70
@ HTTP_LOCKED
@ HTTP_OK
Definition: XrdHttpUtils.hh:58
@ HTTP_NOT_MODIFIED
Definition: XrdHttpUtils.hh:74
@ HTTP_NON_AUTHORITATIVE_INFORMATION
Definition: XrdHttpUtils.hh:61
@ HTTP_LOOP_DETECTED
@ HTTP_EXPECTATION_FAILED
Definition: XrdHttpUtils.hh:97
@ HTTP_SERVICE_UNAVAILABLE
@ HTTP_PROXY_AUTHENTICATION_REQUIRED
Definition: XrdHttpUtils.hh:87
@ HTTP_LENGTH_REQUIRED
Definition: XrdHttpUtils.hh:91
@ HTTP_URI_TOO_LONG
Definition: XrdHttpUtils.hh:94
@ HTTP_UNAVAILABLE_FOR_LEGAL_REASONS
@ HTTP_UNAUTHORIZED
Definition: XrdHttpUtils.hh:81
@ HTTP_UNSUPPORTED_MEDIA_TYPE
Definition: XrdHttpUtils.hh:95
@ HTTP_NOT_FOUND
Definition: XrdHttpUtils.hh:84
@ HTTP_FORBIDDEN
Definition: XrdHttpUtils.hh:83
@ HTTP_CONTINUE
Definition: XrdHttpUtils.hh:52
@ HTTP_MULTI_STATUS
Definition: XrdHttpUtils.hh:65
@ HTTP_PERMANENT_REDIRECT
Definition: XrdHttpUtils.hh:77
@ HTTP_FOUND
Definition: XrdHttpUtils.hh:72
@ HTTP_RESET_CONTENT
Definition: XrdHttpUtils.hh:63
@ HTTP_TEMPORARY_REDIRECT
Definition: XrdHttpUtils.hh:76
@ HTTP_NO_CONTENT
Definition: XrdHttpUtils.hh:62
@ HTTP_MISDIRECTED_REQUEST
Definition: XrdHttpUtils.hh:99
@ HTTP_PARTIAL_CONTENT
Definition: XrdHttpUtils.hh:64
@ HTTP_BAD_GATEWAY
@ HTTP_GATEWAY_TIMEOUT
@ HTTP_NETWORK_AUTHENTICATION_REQUIRED
@ HTTP_TOO_EARLY
@ HTTP_METHOD_NOT_ALLOWED
Definition: XrdHttpUtils.hh:85
@ HTTP_NOT_ACCEPTABLE
Definition: XrdHttpUtils.hh:86
@ HTTP_ALREADY_REPORTED
Definition: XrdHttpUtils.hh:66
@ HTTP_EARLY_HINTS
Definition: XrdHttpUtils.hh:55
@ HTTP_GONE
Definition: XrdHttpUtils.hh:90
@ HTTP_INTERNAL_SERVER_ERROR
@ HTTP_UPGRADE_REQUIRED
@ HTTP_IM_USED
Definition: XrdHttpUtils.hh:67
@ HTTP_TOO_MANY_REQUESTS
@ HTTP_PAYLOAD_TOO_LARGE
Definition: XrdHttpUtils.hh:93
@ HTTP_NOT_IMPLEMENTED
@ HTTP_SEE_OTHER
Definition: XrdHttpUtils.hh:73
@ HTTP_PAYMENT_REQUIRED
Definition: XrdHttpUtils.hh:82
@ HTTP_REQUEST_TIMEOUT
Definition: XrdHttpUtils.hh:88
@ HTTP_UNPROCESSABLE_ENTITY
@ HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE
@ HTTP_SWITCHING_PROTOCOLS
Definition: XrdHttpUtils.hh:53
@ HTTP_MOVED_PERMANENTLY
Definition: XrdHttpUtils.hh:71
@ HTTP_USE_PROXY
Definition: XrdHttpUtils.hh:75
@ HTTP_PRECONDITION_REQUIRED
@ HTTP_RANGE_NOT_SATISFIABLE
Definition: XrdHttpUtils.hh:96
@ HTTP_ACCEPTED
Definition: XrdHttpUtils.hh:60
@ HTTP_CONFLICT
Definition: XrdHttpUtils.hh:89
@ HTTP_PROCESSING
Definition: XrdHttpUtils.hh:54

Function Documentation

◆ calcHashes()

void calcHashes ( char *  hash,
const char *  fn,
kXR_int16  req,
XrdSecEntity secent,
time_t  tim,
const char *  key 
)

Definition at line 220 of file XrdHttpUtils.cc.

231  {
232 
233 
234 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
235  EVP_MAC *mac;
236  EVP_MAC_CTX *ctx;
237  size_t len;
238 #else
239  HMAC_CTX *ctx;
240  unsigned int len;
241 #endif
242  unsigned char mdbuf[EVP_MAX_MD_SIZE];
243  char buf[64];
244  struct tm tms;
245 
246 
247  if (!hash) {
248  return;
249  }
250  hash[0] = '\0';
251 
252  if (!key) {
253  return;
254  }
255 
256  if (!fn || !secent) {
257  return;
258  }
259 
260 #if OPENSSL_VERSION_NUMBER >= 0x30000000L
261 
262  mac = EVP_MAC_fetch(0, "sha256", 0);
263  ctx = EVP_MAC_CTX_new(mac);
264 
265  if (!ctx) {
266  return;
267  }
268 
269 
270  EVP_MAC_init(ctx, (const unsigned char *) key, strlen(key), 0);
271 
272 
273  if (fn)
274  EVP_MAC_update(ctx, (const unsigned char *) fn,
275  strlen(fn) + 1);
276 
277  EVP_MAC_update(ctx, (const unsigned char *) &request,
278  sizeof (request));
279 
280  if (secent->name)
281  EVP_MAC_update(ctx, (const unsigned char *) secent->name,
282  strlen(secent->name) + 1);
283 
284  if (secent->vorg)
285  EVP_MAC_update(ctx, (const unsigned char *) secent->vorg,
286  strlen(secent->vorg) + 1);
287 
288  if (secent->host)
289  EVP_MAC_update(ctx, (const unsigned char *) secent->host,
290  strlen(secent->host) + 1);
291 
292  if (secent->moninfo)
293  EVP_MAC_update(ctx, (const unsigned char *) secent->moninfo,
294  strlen(secent->moninfo) + 1);
295 
296  localtime_r(&tim, &tms);
297  strftime(buf, sizeof (buf), "%s", &tms);
298  EVP_MAC_update(ctx, (const unsigned char *) buf,
299  strlen(buf) + 1);
300 
301  EVP_MAC_final(ctx, mdbuf, &len, EVP_MAX_MD_SIZE);
302 
303  EVP_MAC_CTX_free(ctx);
304  EVP_MAC_free(mac);
305 
306 #else
307 
308  ctx = HMAC_CTX_new();
309 
310  if (!ctx) {
311  return;
312  }
313 
314 
315 
316  HMAC_Init_ex(ctx, (const void *) key, strlen(key), EVP_sha256(), 0);
317 
318 
319  if (fn)
320  HMAC_Update(ctx, (const unsigned char *) fn,
321  strlen(fn) + 1);
322 
323  HMAC_Update(ctx, (const unsigned char *) &request,
324  sizeof (request));
325 
326  if (secent->name)
327  HMAC_Update(ctx, (const unsigned char *) secent->name,
328  strlen(secent->name) + 1);
329 
330  if (secent->vorg)
331  HMAC_Update(ctx, (const unsigned char *) secent->vorg,
332  strlen(secent->vorg) + 1);
333 
334  if (secent->host)
335  HMAC_Update(ctx, (const unsigned char *) secent->host,
336  strlen(secent->host) + 1);
337 
338  if (secent->moninfo)
339  HMAC_Update(ctx, (const unsigned char *) secent->moninfo,
340  strlen(secent->moninfo) + 1);
341 
342  localtime_r(&tim, &tms);
343  strftime(buf, sizeof (buf), "%s", &tms);
344  HMAC_Update(ctx, (const unsigned char *) buf,
345  strlen(buf) + 1);
346 
347  HMAC_Final(ctx, mdbuf, &len);
348 
349  HMAC_CTX_free(ctx);
350 
351 #endif
352 
353  Tobase64(mdbuf, len / 2, hash);
354 }
void Tobase64(const unsigned char *input, int length, char *out)
static void HMAC_CTX_free(HMAC_CTX *ctx)
Definition: XrdHttpUtils.cc:66
static HMAC_CTX * HMAC_CTX_new()
Definition: XrdHttpUtils.cc:60
char * vorg
Entity's virtual organization(s)
Definition: XrdSecEntity.hh:71
char * name
Entity's name.
Definition: XrdSecEntity.hh:69
char * moninfo
Information for monitoring.
Definition: XrdSecEntity.hh:76
char * host
Entity's host name dnr dependent.
Definition: XrdSecEntity.hh:70

References HMAC_CTX_free(), HMAC_CTX_new(), XrdSecEntity::host, XrdSecEntity::moninfo, XrdSecEntity::name, Tobase64(), and XrdSecEntity::vorg.

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

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

◆ compareHash()

int compareHash ( const char *  h1,
const char *  h2 
)

Definition at line 356 of file XrdHttpUtils.cc.

358  {
359 
360  if (h1 == h2) return 0;
361 
362  if (!h1 || !h2)
363  return 1;
364 
365  return strcmp(h1, h2);
366 
367 }

Referenced by XrdHttpProtocol::Process().

+ Here is the caller graph for this function:

◆ decode_raw()

char* decode_raw ( const std::string &  str)
inline

Creates a non-const copy of the string passed in parameter and calls unquote() on it before returning the pointer to the unquoted string

Parameters
strthe string to unquote
Returns
the malloc'd and unquoted string !!! IT MUST BE FREED AFTER USAGE USING free(...) !!!

Definition at line 171 of file XrdHttpUtils.hh.

171  {
172  size_t strLength = str.length();
173  // uniquely own the temporary copy
174  std::unique_ptr<char[]> buf(new char[strLength + 1]);
175  std::memcpy(buf.get(), str.c_str(), strLength + 1);
176  // unquote returns a fresh malloc()'d pointer
177  return unquote(buf.get());
178 }
char * unquote(char *str)

References unquote().

Referenced by decode_str().

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

◆ decode_str()

std::string decode_str ( const std::string &  str)
inline

Decodes the string passed in parameter (converts all XX codes to their 8bit versions) Calls unquote() Returns the std::string containing the decoded string.

Definition at line 209 of file XrdHttpUtils.hh.

209  {
210  char * decodedRaw = decode_raw(str);
211  std::string decoded { decodedRaw };
212  free(decodedRaw);
213  return decoded;
214 }
char * decode_raw(const std::string &str)

References decode_raw().

Referenced by XrdHttpProtocol::Process().

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

◆ encode_opaque()

std::string encode_opaque ( const std::string &  opaque)
inline

Encodes opaque query string parameters example: authz=Bearer token --> authz=Bearer%20token

Parameters
opaquethe opaque query string to encode
Returns
the opaque query string with encoded values

Definition at line 222 of file XrdHttpUtils.hh.

222  {
223  std::ostringstream output;
224  std::vector<std::string> allKeyValues;
225  XrdOucTUtils::splitString(allKeyValues,opaque,"&");
226  bool first = true;
227  for(auto & kv: allKeyValues) {
228  size_t equal = kv.find('=');
229  if(equal != std::string::npos) {
230  std::string key = kv.substr(0, equal);
231  std::string value = kv.substr(equal + 1);
232  if(!first) {
233  output << "&";
234  }
235  output << key << "=" << encode_str(value);
236  first = false;
237  }
238  }
239  return output.str();
240 }
std::string encode_str(const std::string &str)
static void splitString(Container &result, const std::string &input, const std::string &delimiter)
Split a string.
Definition: XrdOucTUtils.hh:51

References encode_str(), and XrdOucTUtils::splitString().

Referenced by XrdHttpReq::appendOpaque(), XrdHttpReq::ProcessHTTPReq(), and XrdHttpReq::Redir().

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

◆ encode_raw()

char* encode_raw ( const std::string &  str)
inline

Calls quote() on the string passed in parameter

Parameters
strthe string to quote
Returns
the pointer to the quoted string !!! IT MUST BE FREED AFTER USAGE USING free(...) !!!

Definition at line 186 of file XrdHttpUtils.hh.

186  {
187  return quote(str.c_str());
188 }
char * quote(const char *str)

References quote().

Referenced by encode_str().

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

◆ encode_str()

std::string encode_str ( const std::string &  str)
inline

Encodes the URL passed in parameter (converts all letters consider illegal in URLs to their XX versions). Calls quote() Returns a std::string containing the encoded string

Definition at line 196 of file XrdHttpUtils.hh.

196  {
197  char * encodedRaw = encode_raw(str);
198  std::string encoded { encodedRaw };
199  free(encodedRaw);
200  return encoded;
201 }
char * encode_raw(const std::string &str)

References encode_raw().

Referenced by XrdHttpReq::appendOpaque(), encode_opaque(), and XrdHttpReq::Redir().

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

◆ escapeXML()

char* escapeXML ( const char *  str)

Definition at line 459 of file XrdHttpUtils.cc.

459  {
460  int l = strlen(str);
461  char *r = (char *) malloc(l*6 + 1);
462  r[0] = '\0';
463  int i, j = 0;
464 
465  for (i = 0; i < l; i++) {
466  char c = str[i];
467 
468  switch (c) {
469  case '"':
470  strcpy(r + j, "&quot;");
471  j += 6;
472  break;
473  case '&':
474  strcpy(r + j, "&amp;");
475  j += 5;
476  break;
477  case '<':
478  strcpy(r + j, "&lt;");
479  j += 4;
480  break;
481  case '>':
482  strcpy(r + j, "&gt;");
483  j += 4;
484  break;
485  case '\'':
486  strcpy(r + j, "&apos;");
487  j += 6;
488  break;
489 
490  default:
491  r[j++] = c;
492  }
493  }
494 
495  r[j] = '\0';
496 
497  return r;
498 }

Referenced by XrdHttpReq::Error().

+ Here is the caller graph for this function:

◆ Fromhexdigest()

bool Fromhexdigest ( const unsigned char *  input,
int  length,
unsigned char *  out 
)

Definition at line 170 of file XrdHttpUtils.cc.

170  {
171  for (int idx=0; idx < length; idx += 2) {
172  int upper = char_to_int(input[idx]);
173  int lower = char_to_int(input[idx+1]);
174  if ((upper < 0) || (lower < 0)) {
175  return false;
176  }
177  out[idx/2] = (upper << 4) + lower;
178  }
179  return true;
180 }
static int char_to_int(int c)

References char_to_int().

+ Here is the call graph for this function:

◆ httpStatusToString()

std::string httpStatusToString ( int  status)

Definition at line 573 of file XrdHttpUtils.cc.

573  {
574  switch (status) {
575  // 1xx Informational
576  case 100: return "Continue";
577  case 101: return "Switching Protocols";
578  case 102: return "Processing";
579  case 103: return "Early Hints";
580 
581  // 2xx Success
582  case 200: return "OK";
583  case 201: return "Created";
584  case 202: return "Accepted";
585  case 203: return "Non-Authoritative Information";
586  case 204: return "No Content";
587  case 205: return "Reset Content";
588  case 206: return "Partial Content";
589  case 207: return "Multi-Status";
590  case 208: return "Already Reported";
591  case 226: return "IM Used";
592 
593  // 3xx Redirection
594  case 300: return "Multiple Choices";
595  case 301: return "Moved Permanently";
596  case 302: return "Found";
597  case 303: return "See Other";
598  case 304: return "Not Modified";
599  case 305: return "Use Proxy";
600  case 307: return "Temporary Redirect";
601  case 308: return "Permanent Redirect";
602 
603  // 4xx Client Errors
604  case 400: return "Bad Request";
605  case 401: return "Unauthorized";
606  case 402: return "Payment Required";
607  case 403: return "Forbidden";
608  case 404: return "Not Found";
609  case 405: return "Method Not Allowed";
610  case 406: return "Not Acceptable";
611  case 407: return "Proxy Authentication Required";
612  case 408: return "Request Timeout";
613  case 409: return "Conflict";
614  case 410: return "Gone";
615  case 411: return "Length Required";
616  case 412: return "Precondition Failed";
617  case 413: return "Payload Too Large";
618  case 414: return "URI Too Long";
619  case 415: return "Unsupported Media Type";
620  case 416: return "Range Not Satisfiable";
621  case 417: return "Expectation Failed";
622  case 418: return "I'm a teapot";
623  case 421: return "Misdirected Request";
624  case 422: return "Unprocessable Entity";
625  case 423: return "Locked";
626  case 424: return "Failed Dependency";
627  case 425: return "Too Early";
628  case 426: return "Upgrade Required";
629  case 428: return "Precondition Required";
630  case 429: return "Too Many Requests";
631  case 431: return "Request Header Fields Too Large";
632  case 451: return "Unavailable For Legal Reasons";
633 
634  // 5xx Server Errors
635  case 500: return "Internal Server Error";
636  case 501: return "Not Implemented";
637  case 502: return "Bad Gateway";
638  case 503: return "Service Unavailable";
639  case 504: return "Gateway Timeout";
640  case 505: return "HTTP Version Not Supported";
641  case 506: return "Variant Also Negotiates";
642  case 507: return "Insufficient Storage";
643  case 508: return "Loop Detected";
644  case 510: return "Not Extended";
645  case 511: return "Network Authentication Required";
646 
647  default:
648  switch (status) {
649  case 100 ... 199: return "Informational";
650  case 200 ... 299: return "Success";
651  case 300 ... 399: return "Redirection";
652  case 400 ... 499: return "Client Error";
653  case 500 ... 599: return "Server Error";
654  default: return "Unknown";
655  }
656  }
657 }

◆ itos()

std::string itos ( long  i)

Definition at line 184 of file XrdHttpUtils.cc.

184  {
185  char buf[128];
186  sprintf(buf, "%ld", i);
187 
188  return buf;
189 }

◆ mapErrNoToHttp()

int mapErrNoToHttp ( int  err)

Definition at line 500 of file XrdHttpUtils.cc.

500  {
501 
502  switch (errNo) {
503 
504  case EACCES:
505  case EROFS:
506  return HTTP_FORBIDDEN;
507 
508  case EPERM:
509  return HTTP_UNAUTHORIZED;
510 
511  case ENOENT:
512  return HTTP_NOT_FOUND;
513 
514  case EEXIST:
515  case ENOTEMPTY:
516  return HTTP_CONFLICT;
517 
518  case ENOTDIR:
519  case EISDIR:
520  case EXDEV:
522 
523  case ENAMETOOLONG:
524  return HTTP_URI_TOO_LONG;
525 
526  case ELOOP:
527  return HTTP_LOOP_DETECTED;
528 
529  case ENOSPC:
530  case EDQUOT:
532 
533  case EFBIG:
534  return HTTP_PAYLOAD_TOO_LARGE;
535 
536  case EINVAL:
537  case EBADF:
538  case EFAULT:
539  case ENXIO:
540  case ESPIPE:
541  case ENODEV:
542  case EOVERFLOW:
543  return HTTP_BAD_REQUEST;
544 
545  case ENOTSUP: // EOPNOTSUPP
546  return HTTP_NOT_IMPLEMENTED;
547 
548  case EBUSY:
549  case EAGAIN:
550  case EINTR:
551  case ENOMEM:
552  case EMFILE:
553  case ENFILE:
554  case ETXTBSY:
556 
557  case ETIMEDOUT:
558  return HTTP_GATEWAY_TIMEOUT;
559 
560  case ECONNREFUSED:
561  case ECONNRESET:
562  case ENETDOWN:
563  case ENETUNREACH:
564  case EHOSTUNREACH:
565  case EPIPE:
566  return HTTP_BAD_GATEWAY;
567 
568  default:
570  }
571 }

References HTTP_BAD_GATEWAY, HTTP_BAD_REQUEST, HTTP_CONFLICT, HTTP_FORBIDDEN, HTTP_GATEWAY_TIMEOUT, HTTP_INSUFFICIENT_STORAGE, HTTP_INTERNAL_SERVER_ERROR, HTTP_LOOP_DETECTED, HTTP_NOT_FOUND, HTTP_NOT_IMPLEMENTED, HTTP_PAYLOAD_TOO_LARGE, HTTP_SERVICE_UNAVAILABLE, HTTP_UNAUTHORIZED, HTTP_UNPROCESSABLE_ENTITY, and HTTP_URI_TOO_LONG.

◆ mystrchrnul()

char* mystrchrnul ( const char *  s,
int  c 
)

Definition at line 194 of file XrdHttpUtils.cc.

194  {
195  char *ptr = strchr((char *)s, c);
196 
197  if (!ptr)
198  return strchr((char *)s, '\0');
199 
200  return ptr;
201 }

◆ parseURL()

int parseURL ( char *  url,
char *  host,
int &  port,
char **  path 
)

Definition at line 78 of file XrdHttpUtils.cc.

78  {
79  // http://x.y.z.w:p/path
80 
81  *path = 0;
82 
83  // look for the second slash
84  char *p = strstr(url, "//");
85  if (!p) return -1;
86 
87 
88  p += 2;
89 
90  // look for the end of the host:port
91  char *p2 = strchr(p, '/');
92  if (!p2) return -1;
93 
94  *path = p2;
95 
96  char buf[256];
97  int l = std::min((int)(p2 - p), (int)sizeof (buf));
98  strncpy(buf, p, l);
99  buf[l] = '\0';
100 
101  // Now look for :
102  p = strchr(buf, ':');
103  if (p) {
104  int l = std::min((int)(p - buf), (int)sizeof (buf));
105  strncpy(host, buf, l);
106  host[l] = '\0';
107 
108  port = atoi(p + 1);
109  } else {
110  port = 0;
111 
112 
113  strcpy(host, buf);
114  }
115 
116  return 0;
117 }

Referenced by XrdHttpReq::ProcessHTTPReq().

+ Here is the caller graph for this function:

◆ quote()

char* quote ( const char *  str)

Definition at line 400 of file XrdHttpUtils.cc.

400  {
401  int l = strlen(str);
402  char *r = (char *) malloc(l*3 + 1);
403  r[0] = '\0';
404  int i, j = 0;
405 
406  for (i = 0; i < l; i++) {
407  char c = str[i];
408 
409  switch (c) {
410  case ' ':
411  strcpy(r + j, "%20");
412  j += 3;
413  break;
414  case '[':
415  strcpy(r + j, "%5B");
416  j += 3;
417  break;
418  case ']':
419  strcpy(r + j, "%5D");
420  j += 3;
421  break;
422  case ':':
423  strcpy(r + j, "%3A");
424  j += 3;
425  break;
426  // case '/':
427  // strcpy(r + j, "%2F");
428  // j += 3;
429  // break;
430  case '#':
431  strcpy(r + j, "%23");
432  j += 3;
433  break;
434  case '\n':
435  strcpy(r + j, "%0A");
436  j += 3;
437  break;
438  case '\r':
439  strcpy(r + j, "%0D");
440  j += 3;
441  break;
442  case '=':
443  strcpy(r + j, "%3D");
444  j += 3;
445  break;
446  default:
447  r[j++] = c;
448  }
449  }
450 
451  r[j] = '\0';
452 
453  return r;
454 }

Referenced by encode_raw().

+ Here is the caller graph for this function:

◆ Tobase64()

void Tobase64 ( const unsigned char *  input,
int  length,
char *  out 
)

Definition at line 122 of file XrdHttpUtils.cc.

122  {
123  BIO *bmem, *b64;
124  BUF_MEM *bptr;
125 
126  if (!out) return;
127 
128  out[0] = '\0';
129 
130  b64 = BIO_new(BIO_f_base64());
131  BIO_set_flags(b64, BIO_FLAGS_BASE64_NO_NL);
132  bmem = BIO_new(BIO_s_mem());
133  BIO_push(b64, bmem);
134  BIO_write(b64, input, length);
135 
136  if (BIO_flush(b64) <= 0) {
137  BIO_free_all(b64);
138  return;
139  }
140 
141  BIO_get_mem_ptr(b64, &bptr);
142 
143 
144  memcpy(out, bptr->data, bptr->length);
145  out[bptr->length] = '\0';
146 
147  BIO_free_all(b64);
148 
149  return;
150 }
void BIO_set_flags(BIO *bio, int flags)

References BIO_set_flags().

Referenced by calcHashes().

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

◆ unquote()

char* unquote ( char *  str)

Definition at line 371 of file XrdHttpUtils.cc.

371  {
372  int l = strlen(str);
373  char *r = (char *) malloc(l + 1);
374  r[0] = '\0';
375  int i, j = 0;
376 
377  for (i = 0; i < l; i++) {
378 
379  if (str[i] == '%') {
380  char savec = str[i + 3];
381  str[i + 3] = '\0';
382 
383  r[j] = strtol(str + i + 1, 0, 16);
384  str[i + 3] = savec;
385 
386  i += 2;
387  } else r[j] = str[i];
388 
389  j++;
390  }
391 
392  r[j] = '\0';
393 
394  return r;
395 
396 }

Referenced by decode_raw().

+ Here is the caller graph for this function: