Loading...
Searching...
No Matches
XrdHttpHeaderUtils.cc
Go to the documentation of this file.
//------------------------------------------------------------------------------
// This file is part of XrdHTTP: A pragmatic implementation of the
// HTTP/WebDAV protocol for the Xrootd framework
//
// Copyright (c) 2025 by European Organization for Nuclear Research (CERN)
// Author: Cedric Caffy <ccaffy@cern.ch>
// File Date: Jun 2025
//------------------------------------------------------------------------------
// XRootD is free software: you can redistribute it and/or modify
// it under the terms of the GNU Lesser General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// XRootD is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with XRootD. If not, see <http://www.gnu.org/licenses/>.
//------------------------------------------------------------------------------
#include "XrdHttpHeaderUtils.hh"
#include "XrdOuc/XrdOucTUtils.hh"
#include "XrdOuc/XrdOucUtils.hh"
#include <vector>
#include <algorithm>
void XrdHttpHeaderUtils::parseReprDigest(const std::string &header, std::map<std::string, std::string> &output) {
// Expected format per entry: <cksumType>=:<digestValue>:
std::vector<std::string> digestNameValuePairs;
XrdOucTUtils::splitString(digestNameValuePairs, header, ",");
for (const auto &digestNameValue : digestNameValuePairs) {
std::string_view digestNameValueSV {digestNameValue};
auto equalPos = digestNameValueSV.find('=');
if (equalPos == std::string::npos || equalPos >= digestNameValueSV.size() - 1)
continue;
std::string_view cksumTypeSV = digestNameValueSV.substr(0, equalPos);
XrdOucUtils::trim(cksumTypeSV);
if (cksumTypeSV.empty())
continue;
std::string_view cksumValueInSV = digestNameValueSV.substr(equalPos + 1);
size_t beginCksumPos = cksumValueInSV.find(':');
size_t endCksumPos = cksumValueInSV.rfind(':');
// Check that the string starts with ':' and contains two distinct colons
if (beginCksumPos == 0 && endCksumPos > beginCksumPos + 1 && endCksumPos < cksumValueInSV.size()) {
std::string_view cksumValue = cksumValueInSV.substr(beginCksumPos + 1, endCksumPos - beginCksumPos - 1);
XrdOucUtils::trim(cksumValue);
if (!cksumValue.empty())
output[std::string(cksumTypeSV)] = cksumValue;
}
// Malformed entries are silently ignored
}
}
XrdHttpHeaderUtils.hh
XrdOucTUtils.hh
XrdOucUtils.hh
XrdHttpHeaderUtils::parseReprDigest
static void parseReprDigest(const std::string &header, std::map< std::string, std::string > &output)
Definition XrdHttpHeaderUtils.cc:30
XrdOucTUtils::splitString
static void splitString(Container &result, const std::string &input, const std::string &delimiter)
Split a string.
Definition XrdOucTUtils.hh:51
XrdOucUtils::trim
static void trim(std::string &str)
Definition XrdOucUtils.cc:1487