XRootD
Loading...
Searching...
No Matches
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,
67 HTTP_IM_USED = 226,
68
69 // 3xx Redirection
72 HTTP_FOUND = 302,
73 HTTP_SEE_OTHER = 303,
75 HTTP_USE_PROXY = 305,
78
79 // 4xx Client Errors
80 HTTP_BAD_REQUEST = 400,
83 HTTP_FORBIDDEN = 403,
84 HTTP_NOT_FOUND = 404,
89 HTTP_CONFLICT = 409,
90 HTTP_GONE = 410,
98 HTTP_IM_A_TEAPOT = 418, // RFC 2324
101 HTTP_LOCKED = 423,
103 HTTP_TOO_EARLY = 425,
109
110 // 5xx Server Errors
113 HTTP_BAD_GATEWAY = 502,
119 HTTP_LOOP_DETECTED = 508,
120 HTTP_NOT_EXTENDED = 510,
122};
@ HTTP_HTTP_VERSION_NOT_SUPPORTED
@ HTTP_INSUFFICIENT_STORAGE
@ HTTP_PRECONDITION_FAILED
@ HTTP_BAD_REQUEST
@ HTTP_NOT_EXTENDED
@ HTTP_FAILED_DEPENDENCY
@ HTTP_VARIANT_ALSO_NEGOTIATES
@ HTTP_CREATED
@ HTTP_IM_A_TEAPOT
@ HTTP_MULTIPLE_CHOICES
@ HTTP_LOCKED
@ HTTP_OK
@ HTTP_NOT_MODIFIED
@ HTTP_NON_AUTHORITATIVE_INFORMATION
@ HTTP_LOOP_DETECTED
@ HTTP_EXPECTATION_FAILED
@ HTTP_SERVICE_UNAVAILABLE
@ HTTP_PROXY_AUTHENTICATION_REQUIRED
@ HTTP_LENGTH_REQUIRED
@ HTTP_URI_TOO_LONG
@ HTTP_UNAVAILABLE_FOR_LEGAL_REASONS
@ HTTP_UNAUTHORIZED
@ HTTP_UNSUPPORTED_MEDIA_TYPE
@ HTTP_NOT_FOUND
@ HTTP_FORBIDDEN
@ HTTP_CONTINUE
@ HTTP_MULTI_STATUS
@ HTTP_PERMANENT_REDIRECT
@ HTTP_FOUND
@ HTTP_RESET_CONTENT
@ HTTP_TEMPORARY_REDIRECT
@ HTTP_NO_CONTENT
@ HTTP_MISDIRECTED_REQUEST
@ HTTP_PARTIAL_CONTENT
@ HTTP_BAD_GATEWAY
@ HTTP_GATEWAY_TIMEOUT
@ HTTP_NETWORK_AUTHENTICATION_REQUIRED
@ HTTP_TOO_EARLY
@ HTTP_METHOD_NOT_ALLOWED
@ HTTP_NOT_ACCEPTABLE
@ HTTP_ALREADY_REPORTED
@ HTTP_EARLY_HINTS
@ HTTP_GONE
@ HTTP_INTERNAL_SERVER_ERROR
@ HTTP_UPGRADE_REQUIRED
@ HTTP_IM_USED
@ HTTP_TOO_MANY_REQUESTS
@ HTTP_PAYLOAD_TOO_LARGE
@ HTTP_NOT_IMPLEMENTED
@ HTTP_SEE_OTHER
@ HTTP_PAYMENT_REQUIRED
@ HTTP_REQUEST_TIMEOUT
@ HTTP_UNPROCESSABLE_ENTITY
@ HTTP_REQUEST_HEADER_FIELDS_TOO_LARGE
@ HTTP_SWITCHING_PROTOCOLS
@ HTTP_MOVED_PERMANENTLY
@ HTTP_USE_PROXY
@ HTTP_PRECONDITION_REQUIRED
@ HTTP_RANGE_NOT_SATISFIABLE
@ HTTP_ACCEPTED
@ HTTP_CONFLICT
@ HTTP_PROCESSING

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 HMAC_CTX * HMAC_CTX_new()
static void HMAC_CTX_free(HMAC_CTX *ctx)
char * vorg
Entity's virtual organization(s)
char * name
Entity's name.
char * moninfo
Information for monitoring.
char * host
Entity's host name dnr dependent.

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.

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:
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
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:
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: