XRootD
XrdClHttp::CurlChecksumOp Class Referencefinal

#include <XrdClHttpOps.hh>

+ Inheritance diagram for XrdClHttp::CurlChecksumOp:
+ Collaboration diagram for XrdClHttp::CurlChecksumOp:

Public Member Functions

 CurlChecksumOp (XrdCl::ResponseHandler *handler, const std::string &url, XrdClHttp::ChecksumType preferred, struct timespec timeout, XrdCl::Log *logger, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)
 
virtual ~CurlChecksumOp ()
 
virtual HttpVerb GetVerb () const override
 
virtual void OptionsDone () override
 
RedirectAction Redirect (std::string &target) override
 
void ReleaseHandle () override
 
bool Setup (CURL *curl, CurlWorker &) override
 
void Success () override
 
- Public Member Functions inherited from XrdClHttp::CurlStatOp
 CurlStatOp (XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)
 
virtual ~CurlStatOp ()
 
std::pair< int64_t, bool > GetStatInfo ()
 
virtual bool RequiresOptions () const override
 
- Public Member Functions inherited from XrdClHttp::CurlOperation
 CurlOperation (const CurlOperation &)=delete
 
 CurlOperation (XrdCl::ResponseHandler *handler, const std::string &url, std::chrono::steady_clock::time_point expiry, XrdCl::Log *log, CreateConnCalloutType, HeaderCallout *header_callout)
 
 CurlOperation (XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, CreateConnCalloutType, HeaderCallout *header_callout)
 
virtual ~CurlOperation ()
 
virtual bool ContinueHandle ()
 
void ExtendDeadline (struct timespec timeout)
 
virtual void Fail (uint16_t errCode, uint32_t errNum, const std::string &)
 
bool FinishSetup (CURL *curl)
 
std::pair< XErrorCode, std::string > GetCallbackError () const
 
CreateConnCalloutType GetConnCalloutFunc () const
 
std::string GetCurlErrorMessage () const
 
CURL * GetCurlHandle () const
 
OpError GetError () const
 
std::chrono::steady_clock::time_point GetHeaderExpiry () const
 
std::chrono::steady_clock::time_point GetOperationExpiry ()
 
std::unique_ptr< ResponseInfo > GetResponseInfo ()
 
int GetStatusCode () const
 
std::string GetStatusMessage () const
 
bool GetTriedBoker () const
 
const std::string & GetUrl () const
 
bool HasFailed () const
 
bool HeaderTimeoutExpired (const std::chrono::steady_clock::time_point &now)
 
bool IsDone () const
 
bool IsPaused () const
 
bool IsRedirect () const
 
std::unique_ptr< ResponseInfo > MoveResponseInfo ()
 
bool OperationTimeoutExpired (const std::chrono::steady_clock::time_point &now)
 
virtual void SetContinueQueue (std::shared_ptr< XrdClHttp::HandlerQueue > queue)
 
void SetTriedBoker ()
 
bool StartConnectionCallout (std::string &err)
 
std::tuple< uint64_t, std::chrono::steady_clock::duration, std::chrono::steady_clock::duration, std::chrono::steady_clock::duration > StatisticsReset ()
 
bool TransferStalled (uint64_t xfer_bytes, const std::chrono::steady_clock::time_point &now)
 
bool UseConnectionCallout ()
 
virtual int WaitSocket ()
 
virtual int WaitSocketCallback (std::string &err)
 

Additional Inherited Members

- Public Types inherited from XrdClHttp::CurlOperation
using HeaderList = std::vector< std::pair< std::string, std::string > >
 
using HttpVerb = XrdClHttp::HttpVerb
 
enum  OpError {
  ErrNone ,
  ErrHeaderTimeout ,
  ErrCallback ,
  ErrOperationTimeout ,
  ErrTransferClientStall ,
  ErrTransferStall ,
  ErrTransferSlow
}
 
enum class  RedirectAction {
  Fail ,
  Reinvoke ,
  ReinvokeAfterAllow
}
 
- Static Public Member Functions inherited from XrdClHttp::CurlOperation
static void CleanupDnsCache ()
 
static int GetDefaultSlowRateBytesSec ()
 
static int GetDefaultStallTimeout ()
 
static const std::string GetVerbString (HttpVerb)
 
static void SetSlowRateBytesSec (int rate)
 
static void SetStallTimeout (const std::chrono::steady_clock::duration &stall_interval)
 
static void SetStallTimeout (int stall_interval)
 
- Protected Member Functions inherited from XrdClHttp::CurlStatOp
void SuccessImpl (bool returnObj)
 
- Protected Member Functions inherited from XrdClHttp::CurlOperation
int FailCallback (XErrorCode ecode, const std::string &emsg)
 
void SetDone (bool has_failed)
 
void SetPaused (bool paused)
 
bool SetupNextRequest (const std::string &url, CurlWorker &worker)
 
void UpdateBytes (uint64_t bytes)
 
- Protected Attributes inherited from XrdClHttp::CurlOperation
std::unique_ptr< CURL, void(*)(CURL *)> m_curl
 
XrdCl::ResponseHandler * m_handler {nullptr}
 
HeaderCallout * m_header_callout
 
std::atomic< std::chrono::steady_clock::time_point > m_header_expiry
 
HeaderParser m_headers
 
std::vector< std::pair< std::string, std::string > > m_headers_list
 
XrdCl::Log * m_logger
 
int m_minimum_rate {m_minimum_transfer_rate}
 
std::chrono::steady_clock::time_point m_operation_expiry
 
std::string m_request_url
 
const std::string m_url
 
- Static Protected Attributes inherited from XrdClHttp::CurlOperation
static constexpr int m_default_minimum_rate {1024 * 256}
 
static int m_minimum_transfer_rate {CurlOperation::m_default_minimum_rate}
 

Detailed Description

Definition at line 548 of file XrdClHttpOps.hh.

Constructor & Destructor Documentation

◆ CurlChecksumOp()

CurlChecksumOp::CurlChecksumOp ( XrdCl::ResponseHandler *  handler,
const std::string &  url,
XrdClHttp::ChecksumType  preferred,
struct timespec  timeout,
XrdCl::Log *  logger,
bool  response_info,
CreateConnCalloutType  callout,
HeaderCallout *  header_callout 
)

Definition at line 34 of file XrdClHttpOpChecksum.cc.

37 :
38  CurlStatOp(handler, url, timeout, logger, response_info, callout, header_callout),
39  m_preferred_cksum(preferred)
40 {}
CurlStatOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)

◆ ~CurlChecksumOp()

virtual XrdClHttp::CurlChecksumOp::~CurlChecksumOp ( )
inlinevirtual

Definition at line 554 of file XrdClHttpOps.hh.

554 {}

Member Function Documentation

◆ GetVerb()

virtual HttpVerb XrdClHttp::CurlChecksumOp::GetVerb ( ) const
inlineoverridevirtual

Reimplemented from XrdClHttp::CurlStatOp.

Definition at line 556 of file XrdClHttpOps.hh.

556 {return HttpVerb::HEAD;}

◆ OptionsDone()

void CurlChecksumOp::OptionsDone ( )
overridevirtual

Reimplemented from XrdClHttp::CurlStatOp.

Definition at line 44 of file XrdClHttpOpChecksum.cc.

45 {}

◆ Redirect()

CurlOperation::RedirectAction CurlChecksumOp::Redirect ( std::string &  target)
overridevirtual

Reimplemented from XrdClHttp::CurlStatOp.

Definition at line 62 of file XrdClHttpOpChecksum.cc.

63 {
64  auto result = CurlOperation::Redirect(target);
65  curl_easy_setopt(m_curl.get(), CURLOPT_NOBODY, 1L);
66  curl_easy_setopt(m_curl.get(), CURLOPT_CUSTOMREQUEST, nullptr);
67  return result;
68 }
std::unique_ptr< CURL, void(*)(CURL *)> m_curl
virtual RedirectAction Redirect(std::string &target)

References XrdClHttp::CurlOperation::m_curl, and XrdClHttp::CurlOperation::Redirect().

+ Here is the call graph for this function:

◆ ReleaseHandle()

void CurlChecksumOp::ReleaseHandle ( )
overridevirtual

Reimplemented from XrdClHttp::CurlStatOp.

Definition at line 71 of file XrdClHttpOpChecksum.cc.

72 {
73  if (m_curl == nullptr) return;
74  curl_easy_setopt(m_curl.get(), CURLOPT_HTTPHEADER, nullptr);
75 
77 }
void ReleaseHandle() override

References XrdClHttp::CurlOperation::m_curl, and XrdClHttp::CurlStatOp::ReleaseHandle().

+ Here is the call graph for this function:

◆ Setup()

bool CurlChecksumOp::Setup ( CURL *  curl,
CurlWorker &  worker 
)
overridevirtual

Reimplemented from XrdClHttp::CurlStatOp.

Definition at line 48 of file XrdClHttpOpChecksum.cc.

49 {
50  auto rv = CurlStatOp::Setup(curl, worker);
51  if (!rv) return false;
52 
53  curl_easy_setopt(m_curl.get(), CURLOPT_NOBODY, 1L);
54  curl_easy_setopt(m_curl.get(), CURLOPT_CUSTOMREQUEST, nullptr);
55 
56  m_headers_list.emplace_back("Want-Digest", XrdClHttp::HeaderParser::ChecksumTypeToDigestName(m_preferred_cksum));
57 
58  return true;
59 }
std::vector< std::pair< std::string, std::string > > m_headers_list
bool Setup(CURL *curl, CurlWorker &) override
static std::string ChecksumTypeToDigestName(XrdClHttp::ChecksumType type)

References XrdClHttp::HeaderParser::ChecksumTypeToDigestName(), XrdClHttp::CurlOperation::m_curl, XrdClHttp::CurlOperation::m_headers_list, and XrdClHttp::CurlStatOp::Setup().

+ Here is the call graph for this function:

◆ Success()

void CurlChecksumOp::Success ( )
overridevirtual

Reimplemented from XrdClHttp::CurlStatOp.

Definition at line 80 of file XrdClHttpOpChecksum.cc.

81 {
82  SetDone(false);
83  auto checksums = m_headers.GetChecksums();
84 
85  const auto fail = [&](uint16_t code, uint32_t errNo,
86  const std::string &message) {
87  m_logger->Error(kLogXrdClHttp, "%s for %s", message.c_str(),
88  m_url.c_str());
89  auto handle = m_handler;
90  m_handler = nullptr;
92  XrdCl::stError, code, errNo, message), nullptr);
93  };
94 
95  std::array<unsigned char, XrdClHttp::g_max_checksum_length> value;
96  auto type = XrdClHttp::ChecksumType::kUnknown;
97  if (m_preferred_cksum != XrdClHttp::ChecksumType::kAll) {
98  if (!checksums.IsSet(m_preferred_cksum)) {
99  fail(XrdCl::errNotSupported, ENOTSUP,
100  "server did not return the requested checksum type '" +
101  XrdClHttp::GetTypeString(m_preferred_cksum) + "'");
102  return;
103  }
104  value = checksums.Get(m_preferred_cksum);
105  type = m_preferred_cksum;
106  } else {
107  bool isset;
108  std::tie(type, value, isset) = checksums.GetFirst();
109  if (!isset) {
110  fail(XrdCl::errCheckSumError, ENOMSG,
111  "server did not return a supported checksum");
112  return;
113  }
114  }
115  std::stringstream ss;
116  for (size_t idx = 0; idx < XrdClHttp::GetChecksumLength(type); ++idx) {
117  ss << std::hex << std::setw(2) << std::setfill('0') << static_cast<int>(value[idx]);
118  }
119 
120  std::string response = XrdClHttp::GetTypeString(type) + " " + ss.str();
121  auto buf = new XrdClHttp::QueryResponse();
122  buf->FromString(response);
123  buf->SetResponseInfo(MoveResponseInfo());
124 
125  auto obj = new XrdCl::AnyObject();
126  obj->Set(static_cast<XrdCl::Buffer*>(buf));
127 
128  auto handle = m_handler;
129  m_handler = nullptr;
130  handle->HandleResponse(new XrdCl::XRootDStatus(), obj);
131  // Does not call CurlStatOp::Success() as we don't need to invoke a stat info callback
132 }
void SetDone(bool has_failed)
const std::string m_url
XrdCl::ResponseHandler * m_handler
std::unique_ptr< ResponseInfo > MoveResponseInfo()
const XrdClHttp::ChecksumInfo & GetChecksums() const
Binary blob representation.
Definition: XrdClBuffer.hh:34
void Error(uint64_t topic, const char *format,...)
Report an error.
Definition: XrdClLog.cc:231
virtual void HandleResponse(XRootDStatus *status, AnyObject *response)
size_t GetChecksumLength(ChecksumType ctype)
const std::string GetTypeString(ChecksumType ctype)
const uint16_t stError
An error occurred that could potentially be retried.
Definition: XrdClStatus.hh:32
const uint16_t errNotSupported
Definition: XrdClStatus.hh:62
const uint16_t errCheckSumError
Definition: XrdClStatus.hh:101
const uint64_t kLogXrdClHttp

References XrdCl::errCheckSumError, XrdCl::errNotSupported, XrdCl::Log::Error(), XrdClHttp::GetChecksumLength(), XrdClHttp::HeaderParser::GetChecksums(), XrdClHttp::GetTypeString(), XrdCl::ResponseHandler::HandleResponse(), XrdClHttp::kLogXrdClHttp, XrdClHttp::CurlOperation::m_handler, XrdClHttp::CurlOperation::m_headers, XrdClHttp::CurlOperation::m_logger, XrdClHttp::CurlOperation::m_url, XrdClHttp::CurlOperation::MoveResponseInfo(), XrdClHttp::CurlOperation::SetDone(), and XrdCl::stError.

+ Here is the call graph for this function:

The documentation for this class was generated from the following files: