29 std::map<std::string,XrdHttpChecksumHandlerImpl::XrdHttpChecksumPtr> XrdHttpChecksumHandlerImpl::XROOTD_DIGEST_NAME_TO_CKSUMS;
31 void 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",
true));
45 XROOTD_DIGEST_NAME_TO_CKSUMS[checksum->getHttpNameLowerCase()] = std::make_unique<XrdHttpChecksum>(checksum->getHttpNameLowerCase(), checksum->getHttpName(), checksum->needsBase64Padding());
46 XROOTD_DIGEST_NAME_TO_CKSUMS[checksum->getXRootDConfigDigestName()] = std::move(checksum);
50 if(!mConfiguredChecksums.empty()) {
51 std::vector<std::string> userDigests = getUserDigests(userDigestIn);
53 for(
auto userDigest: userDigests) {
54 auto httpCksum = std::find_if(mConfiguredChecksums.begin(), mConfiguredChecksums.end(),[userDigest](
const XrdHttpChecksumRawPtr & cksum){
55 return userDigest == cksum->getHttpNameLowerCase();
57 if(httpCksum != mConfiguredChecksums.end()) {
61 return mConfiguredChecksums[0];
68 return mNonIANAConfiguredChecksums;
72 return mConfiguredChecksums;
77 initializeCksumsMaps();
78 if(csList !=
nullptr) {
79 initializeXRootDConfiguredCksums(csList);
83 void XrdHttpChecksumHandlerImpl::initializeXRootDConfiguredCksums(
const char *csList) {
84 std::vector<std::string> splittedCslist;
86 for(
auto csElt: splittedCslist) {
87 auto csName = getElement(csElt,
":",1);
88 auto checksumItor = XROOTD_DIGEST_NAME_TO_CKSUMS.find(csName);
89 if(checksumItor != XROOTD_DIGEST_NAME_TO_CKSUMS.end()) {
90 mConfiguredChecksums.push_back(checksumItor->second.get());
92 mNonIANAConfiguredChecksums.push_back(csName);
97 std::string XrdHttpChecksumHandlerImpl::getElement(
const std::string &input,
const std::string & delimiter,
98 const size_t position) {
99 std::vector<std::string> elementsAfterSplit;
101 return elementsAfterSplit[position];
104 std::vector<std::string> XrdHttpChecksumHandlerImpl::getUserDigests(
const std::string &userDigests) {
106 std::vector<std::string> userDigestsRet;
107 std::vector<std::string> userDigestsWithQValues;
109 for(
auto & userDigestWithQValue: userDigestsWithQValues){
110 std::transform(userDigestWithQValue.begin(),userDigestWithQValue.end(),userDigestWithQValue.begin(),::tolower);
111 auto userDigest = getElement(userDigestWithQValue,
";",0);
113 userDigestsRet.push_back(userDigest);
115 return userDigestsRet;
const std::vector< std::string > & getNonIANAConfiguredCksums() const
std::unique_ptr< XrdHttpChecksum > XrdHttpChecksumPtr
XrdHttpChecksumRawPtr getChecksumToRun(const std::string &userDigest) const
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)