XRootD
Loading...
Searching...
No Matches
XrdClHttp Namespace Reference

Classes

struct  ChecksumEntry
class  ChecksumInfo
class  ConnectionCallout
class  CurlChecksumOp
class  CurlCopyOp
class  CurlDeleteOp
class  CurlListdirOp
class  CurlMkcolOp
class  CurlOpenOp
class  CurlOperation
class  CurlOptionsOp
class  CurlPgReadOp
class  CurlPrefetchOpenOp
class  CurlPutOp
class  CurlQueryOp
class  CurlReadOp
class  CurlStatOp
class  CurlVectorReadOp
class  CurlWorker
class  DeleteResponseInfo
class  DirectoryListResponse
class  Factory
class  File
class  Filesystem
class  HandlerQueue
class  HeaderCallout
class  HeaderParser
class  MkdirResponseInfo
class  OpenResponseInfo
class  QueryResponse
class  ReadResponseInfo
class  ResponseInfo
class  StatResponse
class  VerbsCache

Typedefs

using CreateConnCalloutType = ConnectionCallout *(*)(const std::string &, const ResponseInfo &)

Enumerations

enum class  ChecksumType {
  kCRC32C ,
  kMD5 ,
  kSHA1 ,
  kSHA256 ,
  kAll ,
  kUnknown
}

Functions

size_t GetChecksumLength (ChecksumType ctype)
CURLGetHandle (bool verbose)
ChecksumType GetTypeFromString (const std::string &str)
const std::string GetTypeString (ChecksumType ctype)
std::pair< uint16_t, uint32_t > HTTPStatusConvert (unsigned status)
bool HTTPStatusIsError (unsigned status)
std::string_view ltrim_view (const std::string_view &input_view)
std::string MarshalDuration (const struct timespec &timeout)
bool ParseTimeout (const std::string &duration, struct timespec &, std::string &errmsg)
std::string_view trim_view (const std::string_view &input_view)

Variables

constexpr size_t g_max_checksum_length = 32
const uint64_t kLogXrdClHttp = 73173

Class Documentation

◆ XrdClHttp::ChecksumEntry

struct XrdClHttp::ChecksumEntry

Definition at line 91 of file XrdClHttpChecksum.hh.

Collaboration diagram for XrdClHttp::ChecksumEntry:
Class Members
ChecksumType type {ChecksumType::kUnknown}
array< unsigned char, g_max_checksum_length > value

Typedef Documentation

◆ CreateConnCalloutType

using XrdClHttp::CreateConnCalloutType = ConnectionCallout *(*)(const std::string &, const ResponseInfo &)

Definition at line 69 of file XrdClHttpConnectionCallout.hh.

Enumeration Type Documentation

◆ ChecksumType

enum class XrdClHttp::ChecksumType
strong
Enumerator
kCRC32C 
kMD5 
kSHA1 
kSHA256 
kAll 
kUnknown 

Definition at line 33 of file XrdClHttpChecksum.hh.

33 {
34 kCRC32C,
35 kMD5,
36 kSHA1,
37 kSHA256,
38 kAll, // Short-hand for setting all checksums at once.
39 kUnknown, // Indicates an unset value; `kUnknown - 1` is used in for-loops to iterate through all checksums.
40};

Function Documentation

◆ GetChecksumLength()

size_t XrdClHttp::GetChecksumLength ( ChecksumType ctype)
inline

Definition at line 59 of file XrdClHttpChecksum.hh.

59 {
60 switch (ctype) {
62 return 4;
64 return 16;
66 return 20;
68 return 32;
69 case ChecksumType::kAll: // fallthrough
71 return 0;
72 }
73 return 0;
74}

References kAll, kCRC32C, kMD5, kSHA1, kSHA256, and kUnknown.

Referenced by XrdClHttp::CurlChecksumOp::Success().

Here is the caller graph for this function:

◆ GetHandle()

CURL * XrdClHttp::GetHandle ( bool verbose)

Definition at line 631 of file XrdClHttpUtil.cc.

631 {
632 auto result = curl_easy_init();
633 if (result == nullptr) {
634 return result;
635 }
636
637 curl_easy_setopt(result, CURLOPT_USERAGENT, "xrdcl-http/" XrdVERSION);
638 curl_easy_setopt(result, CURLOPT_DEBUGFUNCTION, DumpHeader);
639 curl_easy_setopt(result, CURLOPT_DEBUGDATA, XrdCl::DefaultEnv::GetLog());
640 if (verbose)
641 curl_easy_setopt(result, CURLOPT_VERBOSE, 1L);
642
643 auto env = XrdCl::DefaultEnv::GetEnv();
644 std::string ca_file;
645 if (!env->GetString("HttpCertFile", ca_file) || ca_file.empty()) {
646 char *x509_ca_file = getenv("X509_CERT_FILE");
647 if (x509_ca_file) {
648 ca_file = std::string(x509_ca_file);
649 }
650 }
651 if (!ca_file.empty()) {
652 curl_easy_setopt(result, CURLOPT_CAINFO, ca_file.c_str());
653 }
654 std::string ca_dir;
655 if (!env->GetString("HttpCertDir", ca_dir) || ca_dir.empty()) {
656 char *x509_ca_dir = getenv("X509_CERT_DIR");
657 if (x509_ca_dir) {
658 ca_dir = std::string(x509_ca_dir);
659 }
660 }
661 if (!ca_dir.empty()) {
662 curl_easy_setopt(result, CURLOPT_CAPATH, ca_dir.c_str());
663 }
664
665 curl_easy_setopt(result, CURLOPT_BUFFERSIZE, 32*1024);
666
667 return result;
668}
static Log * GetLog()
Get default log.
static Env * GetEnv()
Get default client environment.

References XrdCl::DefaultEnv::GetEnv(), and XrdCl::DefaultEnv::GetLog().

Here is the call graph for this function:

◆ GetTypeFromString()

ChecksumType XrdClHttp::GetTypeFromString ( const std::string & str)
inline

Definition at line 76 of file XrdClHttpChecksum.hh.

76 {
77 if (str == "crc32c") {
79 } else if (str == "md5") {
80 return ChecksumType::kMD5;
81 } else if (str == "sha1") {
83 } else if (str == "sha256") {
85 }
87}

References kCRC32C, kMD5, kSHA1, kSHA256, and kUnknown.

Referenced by XrdClHttp::Filesystem::Query().

Here is the caller graph for this function:

◆ GetTypeString()

const std::string XrdClHttp::GetTypeString ( ChecksumType ctype)
inline

Definition at line 42 of file XrdClHttpChecksum.hh.

42 {
43 switch (ctype) {
45 return "crc32c";
47 return "md5";
49 return "sha1";
51 return "sha256";
52 case ChecksumType::kAll: // fallthrough
54 return "unknown";
55 }
56 return "unknown";
57}

References kAll, kCRC32C, kMD5, kSHA1, kSHA256, and kUnknown.

Referenced by XrdClHttp::CurlChecksumOp::Success().

Here is the caller graph for this function:

◆ HTTPStatusConvert()

std::pair< uint16_t, uint32_t > XrdClHttp::HTTPStatusConvert ( unsigned status)

Definition at line 110 of file XrdClHttpUtil.cc.

110 {
111 switch (status) {
112 case 400: // Bad Request
113 return std::make_pair(XrdCl::errErrorResponse, kXR_InvalidRequest);
114 case 401: // Unauthorized (needs authentication)
115 return std::make_pair(XrdCl::errErrorResponse, kXR_NotAuthorized);
116 case 402: // Payment Required
117 case 403: // Forbidden (failed authorization)
118 return std::make_pair(XrdCl::errErrorResponse, kXR_NotAuthorized);
119 case 404:
120 return std::make_pair(XrdCl::errErrorResponse, kXR_NotFound);
121 case 405: // Method not allowed
122 case 406: // Not acceptable
123 return std::make_pair(XrdCl::errErrorResponse, kXR_InvalidRequest);
124 case 407: // Proxy Authentication Required
125 return std::make_pair(XrdCl::errErrorResponse, kXR_NotAuthorized);
126 case 408: // Request timeout
127 return std::make_pair(XrdCl::errErrorResponse, kXR_ReqTimedOut);
128 case 409: // Conflict
129 return std::make_pair(XrdCl::errErrorResponse, kXR_Conflict);
130 case 410: // Gone
131 return std::make_pair(XrdCl::errErrorResponse, kXR_NotFound);
132 case 411: // Length required
133 case 412: // Precondition failed
134 case 413: // Payload too large
135 case 414: // URI too long
136 case 415: // Unsupported Media Type
137 case 416: // Range Not Satisfiable
138 case 417: // Expectation Failed
139 case 418: // I'm a teapot
140 return std::make_pair(XrdCl::errErrorResponse, kXR_InvalidRequest);
141 case 421: // Misdirected Request
142 case 422: // Unprocessable Content
143 return std::make_pair(XrdCl::errErrorResponse, kXR_InvalidRequest);
144 case 423: // Locked
145 return std::make_pair(XrdCl::errErrorResponse, kXR_FileLocked);
146 case 424: // Failed Dependency
147 case 425: // Too Early
148 case 426: // Upgrade Required
149 case 428: // Precondition Required
150 return std::make_pair(XrdCl::errErrorResponse, kXR_InvalidRequest);
151 case 429: // Too Many Requests
152 return std::make_pair(XrdCl::errErrorResponse, kXR_Overloaded);
153 case 431: // Request Header Fields Too Large
154 return std::make_pair(XrdCl::errErrorResponse, kXR_InvalidRequest);
155 case 451: // Unavailable For Legal Reasons
156 return std::make_pair(XrdCl::errErrorResponse, kXR_Impossible);
157 case 500: // Internal Server Error
158 case 501: // Not Implemented
159 case 502: // Bad Gateway
160 case 503: // Service Unavailable
161 return std::make_pair(XrdCl::errErrorResponse, kXR_ServerError);
162 case 504: // Gateway Timeout
163 return std::make_pair(XrdCl::errErrorResponse, kXR_ReqTimedOut);
164 case 507: // Insufficient Storage
165 return std::make_pair(XrdCl::errErrorResponse, kXR_overQuota);
166 case 508: // Loop Detected
167 case 510: // Not Extended
168 case 511: // Network Authentication Required
169 return std::make_pair(XrdCl::errErrorResponse, kXR_ServerError);
170 }
171 return std::make_pair(XrdCl::errUnknown, status);
172}
@ kXR_InvalidRequest
@ kXR_Impossible
@ kXR_NotAuthorized
@ kXR_NotFound
@ kXR_FileLocked
@ kXR_overQuota
@ kXR_Conflict
@ kXR_ServerError
@ kXR_Overloaded
@ kXR_ReqTimedOut
const uint16_t errUnknown
Unknown error.
const uint16_t errErrorResponse

References XrdCl::errErrorResponse, XrdCl::errUnknown, kXR_Conflict, kXR_FileLocked, kXR_Impossible, kXR_InvalidRequest, kXR_NotAuthorized, kXR_NotFound, kXR_Overloaded, kXR_overQuota, kXR_ReqTimedOut, and kXR_ServerError.

Referenced by XrdClHttp::CurlWorker::Run().

Here is the caller graph for this function:

◆ HTTPStatusIsError()

bool XrdClHttp::HTTPStatusIsError ( unsigned status)

Definition at line 106 of file XrdClHttpUtil.cc.

106 {
107 return (status < 100) || (status >= 400);
108}

Referenced by XrdClHttp::CurlWorker::Run(), and XrdClHttp::CurlVectorReadOp::Write().

Here is the caller graph for this function:

◆ ltrim_view()

std::string_view XrdClHttp::ltrim_view ( const std::string_view & input_view)

Definition at line 621 of file XrdClHttpUtil.cc.

621 {
622 for (size_t idx = 0; idx < input_view.size(); idx++) {
623 if (!isspace(input_view[idx])) {
624 return input_view.substr(idx);
625 }
626 }
627 return "";
628}

Referenced by trim_view().

Here is the caller graph for this function:

◆ MarshalDuration()

std::string XrdClHttp::MarshalDuration ( const struct timespec & timeout)

Definition at line 111 of file XrdClHttpParseTimeout.cc.

112{
113 if (duration.tv_sec == 0 && duration.tv_nsec == 0) {return "0s";}
114
115 std::string result = duration.tv_sec != 0 ? std::to_string(duration.tv_sec) + "s" : "";
116 if (duration.tv_nsec) {
117 result += std::to_string(duration.tv_nsec / 1'000'000) + "ms";
118 }
119 return result;
120}

Referenced by XrdClHttp::File::Open().

Here is the caller graph for this function:

◆ ParseTimeout()

bool XrdClHttp::ParseTimeout ( const std::string & duration,
struct timespec & result,
std::string & errmsg )

Definition at line 26 of file XrdClHttpParseTimeout.cc.

26 {
27
28 if (duration.empty()) {
29 errmsg = "cannot parse empty string as a time duration";
30 return false;
31 }
32 if (duration == "0") {
33 result = {0, 0};
34 return true;
35 }
36 struct timespec ts = {0, 0};
37 auto strValue = duration;
38 while (!strValue.empty()) {
39 std::size_t pos;
40 double value;
41 try {
42 value = std::stod(strValue, &pos);
43 } catch (std::invalid_argument const &exc) {
44 errmsg = "Invalid number provided as timeout: " + strValue;
45 return false;
46 } catch (std::out_of_range const &exc) {
47 errmsg = "Provided timeout out of representable range: " + std::string(exc.what());
48 return false;
49 }
50 if (value < 0) {
51 errmsg = "Provided timeout was negative";
52 return false;
53 }
54 strValue = strValue.substr(pos);
55 char unit[3] = {'\0', '\0', '\0'};
56 if (!strValue.empty()) {
57 unit[0] = strValue[0];
58 if (unit[0] >= '0' && unit[0] <= '9') {unit[0] = '\0';}
59 }
60 if (strValue.size() > 1) {
61 unit[1] = strValue[1];
62 if (unit[1] >= '0' && unit[1] <= '9') {unit[1] = '\0';}
63 }
64 if (!strncmp(unit, "ns", 2)) {
65 ts.tv_nsec += value;
66 } else if (!strncmp(unit, "us", 2)) {
67 auto value_s = (static_cast<long long>(value)) / 1'000'000;
68 ts.tv_sec += value_s;
69 value -= value_s * 1'000'000;
70 ts.tv_nsec += value * 1'000'000;
71 } else if (!strncmp(unit, "ms", 2)) {
72 auto value_s = (static_cast<long long>(value)) / 1'000;
73 ts.tv_sec += value_s;
74 value -= value_s * 1'000;
75 ts.tv_nsec += value * 1'000'000;
76 } else if (!strncmp(unit, "s", 1)) {
77 auto value_s = (static_cast<long long>(value));
78 ts.tv_sec += value_s;
79 value -= value_s;
80 ts.tv_nsec += value * 1'000'000'000;
81 } else if (!strncmp(unit, "m", 1)) {
82 value *= 60;
83 auto value_s = (static_cast<long long>(value));
84 ts.tv_sec += value_s;
85 value -= value_s;
86 ts.tv_nsec += value * 1'000'000'000;
87 } else if (!strncmp(unit, "h", 1)) {
88 value *= 3600;
89 auto value_s = (static_cast<long long>(value));
90 ts.tv_sec += value_s;
91 value -= value_s;
92 ts.tv_nsec += value * 1'000'000'000;
93 } else if (strlen(unit) > 0) {
94 errmsg = "Unknown unit in duration: " + std::string(unit);
95 return false;
96 } else {
97 errmsg = "Unit missing from duration: " + duration;
98 return false;
99 }
100 if (ts.tv_nsec > 1'000'000'000) {
101 ts.tv_sec += ts.tv_nsec / 1'000'000'000;
102 ts.tv_nsec = ts.tv_nsec % 1'000'000'000;
103 }
104 strValue = strValue.substr(strlen(unit));
105 }
106 result.tv_nsec = ts.tv_nsec;
107 result.tv_sec = ts.tv_sec;
108 return true;
109}
static std::string ts()
timestamp output for logging messages
Definition XrdCephOss.cc:53

References ts().

Referenced by XrdClHttp::File::ParseHeaderTimeout(), and XrdClHttp::File::SetProperty().

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

◆ trim_view()

std::string_view XrdClHttp::trim_view ( const std::string_view & input_view)

Definition at line 610 of file XrdClHttpUtil.cc.

610 {
611 auto view = XrdClHttp::ltrim_view(input_view);
612 for (size_t idx = 0; idx < input_view.size(); idx++) {
613 if (!isspace(view[view.size() - 1 - idx])) {
614 return view.substr(0, view.size() - idx);
615 }
616 }
617 return "";
618}
std::string_view ltrim_view(const std::string_view &input_view)

References ltrim_view().

Here is the call graph for this function:

Variable Documentation

◆ g_max_checksum_length

size_t XrdClHttp::g_max_checksum_length = 32
constexpr

Definition at line 30 of file XrdClHttpChecksum.hh.

◆ kLogXrdClHttp

const uint64_t XrdClHttp::kLogXrdClHttp = 73173

Definition at line 52 of file XrdClHttpUtil.hh.

Referenced by XrdClHttp::Filesystem::Filesystem(), XrdClHttp::File::Close(), XrdClHttp::CurlReadOp::Continue(), XrdClHttp::CurlPutOp::ContinueHandle(), XrdClHttp::CurlReadOp::ContinueHandle(), XrdClHttp::Filesystem::DirList(), XrdClHttp::CurlMkcolOp::Fail(), XrdClHttp::CurlOpenOp::Fail(), XrdClHttp::CurlOperation::Fail(), XrdClHttp::CurlPutOp::Fail(), XrdClHttp::CurlReadOp::Fail(), XrdClHttp::CurlVectorReadOp::Fail(), XrdClHttp::CurlOperation::FailCallback(), XrdClHttp::File::Fcntl(), XrdClHttp::CurlOperation::FinishSetup(), XrdClHttp::CurlStatOp::GetStatInfo(), XrdClHttp::Filesystem::MkDir(), XrdClHttp::File::Open(), XrdClHttp::File::ParseHeaderTimeout(), XrdClHttp::CurlPutOp::Pause(), XrdClHttp::CurlReadOp::Pause(), XrdClHttp::File::PgRead(), XrdClHttp::Filesystem::Query(), XrdClHttp::File::Read(), XrdClHttp::CurlOperation::Redirect(), XrdClHttp::Filesystem::Rm(), XrdClHttp::CurlWorker::Run(), XrdClHttp::CurlWorker::RunStatic(), XrdClHttp::File::SetProperty(), XrdClHttp::CurlOperation::Setup(), XrdClHttp::File::Stat(), XrdClHttp::Filesystem::Stat(), XrdClHttp::CurlChecksumOp::Success(), XrdClHttp::CurlDeleteOp::Success(), XrdClHttp::CurlListdirOp::Success(), XrdClHttp::CurlMkcolOp::Success(), XrdClHttp::CurlOpenOp::Success(), XrdClHttp::CurlPutOp::Success(), XrdClHttp::CurlQueryOp::Success(), XrdClHttp::CurlStatOp::SuccessImpl(), XrdClHttp::File::VectorRead(), XrdClHttp::CurlOperation::WaitSocketCallback(), XrdClHttp::File::Write(), and XrdClHttp::File::Write().