29std::map<std::string,XrdHttpChecksumHandlerImpl::XrdHttpChecksumPtr> XrdHttpChecksumHandlerImpl::XROOTD_DIGEST_NAME_TO_CKSUMS;
31void XrdHttpChecksumHandlerImpl::initializeCksumsMaps() {
32 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"md5",
"md5",
true));
33 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"adler32",
"adler32",
false));
34 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"sha1",
"sha",
true));
35 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"sha256",
"sha-256",
true));
36 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"sha512",
"sha-512",
true));
37 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"cksum",
"UNIXcksum",
false));
38 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"crc32",
"crc32",
false));
39 addChecksumToMaps(std::make_unique<XrdHttpChecksum>(
"crc32c",
"crc32c",
false));
42 XROOTD_DIGEST_NAME_TO_CKSUMS[
"adler"] = std::make_unique<XrdHttpChecksum>(
"adler32",
"adler",
false);
48 XROOTD_DIGEST_NAME_TO_CKSUMS[checksum->getHttpNameLowerCase()] = std::make_unique<XrdHttpChecksum>(checksum->getHttpNameLowerCase(), checksum->getHttpName(), checksum->needsBase64Padding());
49 XROOTD_DIGEST_NAME_TO_CKSUMS[checksum->getXRootDConfigDigestName()] = std::move(checksum);
53 if(!mConfiguredChecksums.empty()) {
54 std::vector<std::string> userDigests = getUserDigests(wantDigest);
56 for(
auto userDigest: userDigests) {
57 auto httpCksum = std::find_if(mConfiguredChecksums.begin(), mConfiguredChecksums.end(),[userDigest](
const XrdHttpChecksumRawPtr & cksum){
58 return userDigest == cksum->getHttpNameLowerCase();
60 if(httpCksum != mConfiguredChecksums.end()) {
64 return mConfiguredChecksums[0];
71 if(!mConfiguredChecksums.empty()) {
74 for(
const auto & [digestName, preference]: wantReprDigest) {
75 if(preference > bestPref) {
76 const auto cksumItor = std::find_if(mConfiguredChecksums.begin(), mConfiguredChecksums.end(),[dn = digestName](
const XrdHttpChecksumRawPtr & cksum){
77 return dn == cksum->getHttpNameLowerCase();
79 if(cksumItor != mConfiguredChecksums.end()) {
80 bestPref = preference;
81 retCksum = *cksumItor;
91 return mNonIANAConfiguredChecksums;
95 return mConfiguredChecksums;
100 initializeCksumsMaps();
101 if(csList !=
nullptr) {
102 initializeXRootDConfiguredCksums(csList);
106void XrdHttpChecksumHandlerImpl::initializeXRootDConfiguredCksums(
const char *csList) {
107 std::vector<std::string> splittedCslist;
109 for(
auto csElt: splittedCslist) {
110 auto csName = getElement(csElt,
":",1);
111 auto checksumItor = XROOTD_DIGEST_NAME_TO_CKSUMS.find(csName);
112 if(checksumItor != XROOTD_DIGEST_NAME_TO_CKSUMS.end()) {
113 mConfiguredChecksums.push_back(checksumItor->second.get());
114 if(checksumItor->first ==
"adler32") {
119 mConfiguredChecksums.push_back(XROOTD_DIGEST_NAME_TO_CKSUMS[
"adler"].get());
122 mNonIANAConfiguredChecksums.push_back(csName);
127std::string XrdHttpChecksumHandlerImpl::getElement(
const std::string &input,
const std::string & delimiter,
128 const size_t position) {
129 std::vector<std::string> elementsAfterSplit;
131 return elementsAfterSplit[position];
134std::vector<std::string> XrdHttpChecksumHandlerImpl::getUserDigests(
const std::string &userDigests) {
136 std::vector<std::string> userDigestsRet;
137 std::vector<std::string> userDigestsWithQValues;
139 for(
auto & userDigestWithQValue: userDigestsWithQValues){
140 std::transform(userDigestWithQValue.begin(),userDigestWithQValue.end(),userDigestWithQValue.begin(),::tolower);
141 auto userDigest = getElement(userDigestWithQValue,
";",0);
143 userDigestsRet.push_back(userDigest);
145 return userDigestsRet;
const std::vector< std::string > & getNonIANAConfiguredCksums() const
XrdHttpChecksumRawPtr getChecksumToRunWantDigest(const std::string &wantDigest) const
std::unique_ptr< XrdHttpChecksum > XrdHttpChecksumPtr
XrdHttpChecksumRawPtr getChecksumToRunWantReprDigest(const std::map< std::string, uint8_t > &wantReprDigest) const
XrdHttpChecksum * XrdHttpChecksumRawPtr
void configure(const char *csList)
const std::vector< XrdHttpChecksumRawPtr > & getConfiguredChecksums() const
static void splitString(Container &result, const std::string &input, const std::string &delimiter)
Split a string.
static void trim(std::string &str)