XRootD
XrdClHttp::CurlCopyOp Class Referencefinal

#include <XrdClHttpOps.hh>

+ Inheritance diagram for XrdClHttp::CurlCopyOp:
+ Collaboration diagram for XrdClHttp::CurlCopyOp:

Public Types

using Headers = std::vector< std::pair< std::string, std::string > >
 
- 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
}
 

Public Member Functions

 CurlCopyOp (XrdCl::ResponseHandler *handler, const std::string &source_url, const Headers &source_hdrs, const std::string &dest_url, const Headers &dest_hdrs, const Headers &connection_hdrs, TpcMode mode, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout)
 
virtual ~CurlCopyOp ()
 
std::string GetSendingFailureMessage ()
 
virtual HttpVerb GetVerb () const override
 
bool IsSentSuccessfully ()
 
void ReleaseHandle () override
 
void SetProgressHandler (XrdCl::ProgressHandler *handler) noexcept
 
bool Setup (CURL *curl, CurlWorker &) override
 
void Success () 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 OptionsDone ()
 
virtual RedirectAction Redirect (std::string &target)
 
virtual bool RequiresOptions () const
 
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

- 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::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 895 of file XrdClHttpOps.hh.

Member Typedef Documentation

◆ Headers

using XrdClHttp::CurlCopyOp::Headers = std::vector<std::pair<std::string, std::string> >

Definition at line 897 of file XrdClHttpOps.hh.

Constructor & Destructor Documentation

◆ CurlCopyOp()

CurlCopyOp::CurlCopyOp ( XrdCl::ResponseHandler *  handler,
const std::string &  source_url,
const Headers &  source_hdrs,
const std::string &  dest_url,
const Headers &  dest_hdrs,
const Headers &  connection_hdrs,
TpcMode  mode,
struct timespec  timeout,
XrdCl::Log *  logger,
CreateConnCalloutType  callout 
)

Definition at line 28 of file XrdClHttpOpCopy.cc.

30  :
31  CurlOperation(handler, mode == TpcMode::Pull ? dest_url : source_url, timeout, logger, callout, nullptr)
32  {
33  m_minimum_rate = 1;
34 
35  // The headers of the endpoint the client contacts go on the request
36  // itself. The headers of the remote endpoint are forwarded by that
37  // endpoint, thus they need the 'TransferHeader' prefix.
38  const Headers &regular_hdrs = mode == TpcMode::Pull ? dest_hdrs : source_hdrs;
39  const Headers &transfer_hdrs = mode == TpcMode::Pull ? source_hdrs : dest_hdrs;
40 
41  if (mode == TpcMode::Pull)
42  m_headers_list.emplace_back("Source"s, source_url);
43  else
44  m_headers_list.emplace_back("Destination"s, dest_url);
45 
46  std::copy(connection_hdrs.begin(), connection_hdrs.end(), std::back_inserter(m_headers_list));
47  std::copy(regular_hdrs.begin(), regular_hdrs.end(), std::back_inserter(m_headers_list));
48 
49  for (const auto &info : transfer_hdrs) {
50  m_headers_list.emplace_back("TransferHeader"s + info.first, info.second);
51  }
52  }
std::vector< std::pair< std::string, std::string > > Headers
CurlOperation(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, CreateConnCalloutType, HeaderCallout *header_callout)
std::vector< std::pair< std::string, std::string > > m_headers_list

References XrdClHttp::CurlOperation::m_headers_list, and XrdClHttp::CurlOperation::m_minimum_rate.

◆ ~CurlCopyOp()

virtual XrdClHttp::CurlCopyOp::~CurlCopyOp ( )
inlinevirtual

Definition at line 902 of file XrdClHttpOps.hh.

902 {}

Member Function Documentation

◆ GetSendingFailureMessage()

std::string XrdClHttp::CurlCopyOp::GetSendingFailureMessage ( )
inline

Definition at line 917 of file XrdClHttpOps.hh.

917 {return m_failure;}

◆ GetVerb()

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

Implements XrdClHttp::CurlOperation.

Definition at line 914 of file XrdClHttpOps.hh.

914 {return HttpVerb::COPY;}

◆ IsSentSuccessfully()

bool XrdClHttp::CurlCopyOp::IsSentSuccessfully ( )
inline

Definition at line 916 of file XrdClHttpOps.hh.

916 {return m_sent_success;}

◆ ReleaseHandle()

void CurlCopyOp::ReleaseHandle ( )
overridevirtual

Reimplemented from XrdClHttp::CurlOperation.

Definition at line 80 of file XrdClHttpOpCopy.cc.

81  {
82  if (m_curl == nullptr) return;
83  curl_easy_setopt(m_curl.get(), CURLOPT_WRITEFUNCTION, nullptr);
84  curl_easy_setopt(m_curl.get(), CURLOPT_WRITEDATA, nullptr);
85  curl_easy_setopt(m_curl.get(), CURLOPT_CUSTOMREQUEST, nullptr);
86  curl_easy_setopt(m_curl.get(), CURLOPT_HTTPHEADER, nullptr);
87  curl_easy_setopt(m_curl.get(), CURLOPT_XFERINFOFUNCTION, nullptr);
89  }
std::unique_ptr< CURL, void(*)(CURL *)> m_curl
virtual void ReleaseHandle()

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

+ Here is the call graph for this function:

◆ SetProgressHandler()

void CurlCopyOp::SetProgressHandler ( XrdCl::ProgressHandler *  handler)
noexcept

Definition at line 92 of file XrdClHttpOpCopy.cc.

93  {
94  m_progress_handler = handler;
95  }

◆ Setup()

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

Reimplemented from XrdClHttp::CurlOperation.

Definition at line 55 of file XrdClHttpOpCopy.cc.

56  {
57  auto rv = CurlOperation::Setup(curl, worker);
58  if (!rv) return false;
59 
60  curl_easy_setopt(m_curl.get(), CURLOPT_WRITEFUNCTION, CurlCopyOp::WriteCallback);
61  curl_easy_setopt(m_curl.get(), CURLOPT_WRITEDATA, this);
62  curl_easy_setopt(m_curl.get(), CURLOPT_CUSTOMREQUEST, "COPY");
63 
64  return true;
65  }
virtual bool Setup(CURL *curl, CurlWorker &)

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

+ Here is the call graph for this function:

◆ Success()

void CurlCopyOp::Success ( )
overridevirtual

Implements XrdClHttp::CurlOperation.

Definition at line 68 of file XrdClHttpOpCopy.cc.

69  {
70  SetDone(false);
71  if (m_handler == nullptr) {return;}
72  auto status = new XrdCl::XRootDStatus();
73  auto obj = new XrdCl::AnyObject();
74  auto handle = m_handler;
75  m_handler = nullptr;
76  handle->HandleResponse(status, obj);
77  }
void SetDone(bool has_failed)
XrdCl::ResponseHandler * m_handler
virtual void HandleResponse(XRootDStatus *status, AnyObject *response)

References XrdCl::ResponseHandler::HandleResponse(), XrdClHttp::CurlOperation::m_handler, and XrdClHttp::CurlOperation::SetDone().

+ Here is the call graph for this function:

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