XRootD
Loading...
Searching...
No Matches
XrdHttpUtils.hh File Reference

Utility functions for XrdHTTP. More...

#include "XProtocol/XPtypes.hh"
#include "XProtocol/XProtocol.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)
 
int mapXrdErrToHttp (XErrorCode xrdError)
 
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 252 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 52 of file XrdHttpUtils.hh.

52 : int {
53 HTTP_CONTINUE = 100,
55 HTTP_PROCESSING = 102,
56 HTTP_EARLY_HINTS = 103,
57
58 // 2xx Success
59 HTTP_OK = 200,
60 HTTP_CREATED = 201,
61 HTTP_ACCEPTED = 202,
63 HTTP_NO_CONTENT = 204,
68 HTTP_IM_USED = 226,
69
70 // 3xx Redirection
73 HTTP_FOUND = 302,
74 HTTP_SEE_OTHER = 303,
76 HTTP_USE_PROXY = 305,
79
80 // 4xx Client Errors
81 HTTP_BAD_REQUEST = 400,
84 HTTP_FORBIDDEN = 403,
85 HTTP_NOT_FOUND = 404,
90 HTTP_CONFLICT = 409,
91 HTTP_GONE = 410,
99 HTTP_IM_A_TEAPOT = 418, // RFC 2324
102 HTTP_LOCKED = 423,
104 HTTP_TOO_EARLY = 425,
110
111 // 5xx Server Errors
114 HTTP_BAD_GATEWAY = 502,
120 HTTP_LOOP_DETECTED = 508,
121 HTTP_NOT_EXTENDED = 510,
123};
@ 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 219 of file XrdHttpUtils.cc.

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

366 {
367
368 if (h1 == h2) return 0;
369
370 if (!h1 || !h2)
371 return 1;
372
373 return strcmp(h1, h2);
374
375}

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 172 of file XrdHttpUtils.hh.

172 {
173 size_t strLength = str.length();
174 // uniquely own the temporary copy
175 std::unique_ptr<char[]> buf(new char[strLength + 1]);
176 std::memcpy(buf.get(), str.c_str(), strLength + 1);
177 // unquote returns a fresh malloc()'d pointer
178 return unquote(buf.get());
179}
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 210 of file XrdHttpUtils.hh.

210 {
211 char * decodedRaw = decode_raw(str);
212 std::string decoded { decodedRaw };
213 free(decodedRaw);
214 return decoded;
215}
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 223 of file XrdHttpUtils.hh.

223 {
224 std::ostringstream output;
225 std::vector<std::string> allKeyValues;
226 XrdOucTUtils::splitString(allKeyValues,opaque,"&");
227 bool first = true;
228 for(auto & kv: allKeyValues) {
229 size_t equal = kv.find('=');
230 if(equal != std::string::npos) {
231 std::string key = kv.substr(0, equal);
232 std::string value = kv.substr(equal + 1);
233 if(!first) {
234 output << "&";
235 }
236 output << encode_str(key) << "=" << encode_str(value);
237 first = false;
238 }
239 }
240 return output.str();
241}
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 187 of file XrdHttpUtils.hh.

187 {
188 return quote(str.c_str());
189}
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 197 of file XrdHttpUtils.hh.

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

References encode_raw().

Referenced by XrdHttpReq::appendOpaque(), encode_opaque(), XrdHttpReq::ProcessHTTPReq(), 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 470 of file XrdHttpUtils.cc.

470 {
471 int l = strlen(str);
472 char *r = (char *) malloc(l*6 + 1);
473 r[0] = '\0';
474 int i, j = 0;
475
476 for (i = 0; i < l; i++) {
477 char c = str[i];
478
479 switch (c) {
480 case '"':
481 strcpy(r + j, "&quot;");
482 j += 6;
483 break;
484 case '&':
485 strcpy(r + j, "&amp;");
486 j += 5;
487 break;
488 case '<':
489 strcpy(r + j, "&lt;");
490 j += 4;
491 break;
492 case '>':
493 strcpy(r + j, "&gt;");
494 j += 4;
495 break;
496 case '\'':
497 strcpy(r + j, "&apos;");
498 j += 6;
499 break;
500
501 default:
502 r[j++] = c;
503 }
504 }
505
506 r[j] = '\0';
507
508 return r;
509}

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 169 of file XrdHttpUtils.cc.

169 {
170 for (int idx=0; idx < length; idx += 2) {
171 int upper = char_to_int(input[idx]);
172 int lower = char_to_int(input[idx+1]);
173 if ((upper < 0) || (lower < 0)) {
174 return false;
175 }
176 out[idx/2] = (upper << 4) + lower;
177 }
178 return true;
179}
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 591 of file XrdHttpUtils.cc.

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

◆ itos()

std::string itos ( long i)

Definition at line 183 of file XrdHttpUtils.cc.

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

◆ mapErrNoToHttp()

int mapErrNoToHttp ( int err)

Definition at line 518 of file XrdHttpUtils.cc.

518 {
519
520 switch (errNo) {
521
522 case EACCES:
523 case EROFS:
524 case EPERM:
525 return HTTP_FORBIDDEN;
526
527 case EAUTH:
528 return HTTP_UNAUTHORIZED;
529
530 case ENOENT:
531 return HTTP_NOT_FOUND;
532
533 case EEXIST:
534 case EISDIR:
535 case ENOTDIR:
536 case ENOTEMPTY:
537 return HTTP_CONFLICT;
538
539 case EXDEV:
541
542 case ENAMETOOLONG:
543 return HTTP_URI_TOO_LONG;
544
545 case ELOOP:
546 return HTTP_LOOP_DETECTED;
547
548 case ENOSPC:
549 case EDQUOT:
551
552 case EFBIG:
554
555 case EINVAL:
556 case EBADF:
557 case EFAULT:
558 case ENXIO:
559 case ESPIPE:
560 case EOVERFLOW:
561 return HTTP_BAD_REQUEST;
562
563 case ENOTSUP: // EOPNOTSUPP
565
566 case EBUSY:
567 case EAGAIN:
568 case EINTR:
569 case ENOMEM:
570 case EMFILE:
571 case ENFILE:
572 case ETXTBSY:
574
575 case ETIMEDOUT:
577
578 case ECONNREFUSED:
579 case ECONNRESET:
580 case ENETDOWN:
581 case ENETUNREACH:
582 case EHOSTUNREACH:
583 case EPIPE:
584 return HTTP_BAD_GATEWAY;
585
586 default:
588 }
589}
#define EAUTH

References EAUTH, 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.

Referenced by mapXrdErrToHttp().

+ Here is the caller graph for this function:

◆ mapXrdErrToHttp()

int mapXrdErrToHttp ( XErrorCode xrdError)

Definition at line 511 of file XrdHttpUtils.cc.

511 {
512
513 int errNo = XProtocol::toErrno(xrdError);
514 return mapErrNoToHttp(errNo);
515
516}
int mapErrNoToHttp(int errNo)
static int toErrno(int xerr)

References mapErrNoToHttp(), and XProtocol::toErrno().

+ Here is the call graph for this function:

◆ mystrchrnul()

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

Definition at line 193 of file XrdHttpUtils.cc.

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

◆ parseURL()

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

Definition at line 77 of file XrdHttpUtils.cc.

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

◆ quote()

char * quote ( const char * str)

Definition at line 411 of file XrdHttpUtils.cc.

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

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 121 of file XrdHttpUtils.cc.

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

379 {
380 int l = strlen(str);
381 char *r = (char *) malloc(l + 1);
382 r[0] = '\0';
383 int i, j = 0;
384
385 for (i = 0; i < l; i++) {
386 if (str[i] == '%') {
387 if (i + 3 > l) {
388 r[j] = '\0';
389 return r;
390 }
391 char savec = str[i + 3];
392 str[i + 3] = '\0';
393
394 r[j] = strtol(str + i + 1, 0, 16);
395 str[i + 3] = savec;
396
397 i += 2;
398 } else r[j] = str[i];
399
400 j++;
401 }
402
403 r[j] = '\0';
404
405 return r;
406
407}

Referenced by decode_raw().

+ Here is the caller graph for this function: