26 const std::string &dest_url,
const Headers &dest_hdrs,
struct timespec timeout,
XrdCl::Log *logger,
28 CurlOperation(handler, dest_url, timeout, logger, callout, nullptr),
29 m_source_url(source_url)
33 for (
const auto &info : source_hdrs) {
34 m_headers_list.emplace_back(std::string(
"TransferHeader") + info.first, info.second);
36 for (
const auto &info : dest_hdrs) {
45 if (!rv)
return false;
47 curl_easy_setopt(
m_curl.get(), CURLOPT_WRITEFUNCTION, CurlCopyOp::WriteCallback);
48 curl_easy_setopt(
m_curl.get(), CURLOPT_WRITEDATA,
this);
49 curl_easy_setopt(
m_curl.get(), CURLOPT_CUSTOMREQUEST,
"COPY");
64 handle->HandleResponse(status, obj);
70 if (
m_curl ==
nullptr)
return;
71 curl_easy_setopt(
m_curl.get(), CURLOPT_WRITEFUNCTION,
nullptr);
72 curl_easy_setopt(
m_curl.get(), CURLOPT_WRITEDATA,
nullptr);
73 curl_easy_setopt(
m_curl.get(), CURLOPT_CUSTOMREQUEST,
nullptr);
74 curl_easy_setopt(
m_curl.get(), CURLOPT_HTTPHEADER,
nullptr);
75 curl_easy_setopt(
m_curl.get(), CURLOPT_XFERINFOFUNCTION,
nullptr);
80 CurlCopyOp::WriteCallback(
char *buffer,
size_t size,
size_t nitems,
void *this_ptr)
82 auto me =
reinterpret_cast<CurlCopyOp*
>(this_ptr);
84 std::string_view str_data(buffer, size * nitems);
86 while ((end_line = str_data.find(
'\n')) != std::string_view::npos) {
87 auto cur_line = str_data.substr(0, end_line);
88 if (me->m_line_buffer.empty()) {
89 me->HandleLine(cur_line);
91 me->m_line_buffer += cur_line;
92 me->HandleLine(me->m_line_buffer);
93 me->m_line_buffer.clear();
95 str_data = str_data.substr(end_line + 1);
97 me->m_line_buffer = str_data;
103 CurlCopyOp::HandleLine(std::string_view line)
105 if (line ==
"Perf Marker") {
107 }
else if (line ==
"End") {
108 if (m_bytemark > -1 && m_callback) {
109 m_callback->Progress(m_bytemark);
112 auto key_end_pos = line.find(
':');
113 if (key_end_pos == line.npos) {
116 auto key = line.substr(0, key_end_pos);
117 auto value =
ltrim_view(line.substr(key_end_pos + 1));
118 if (key ==
"Stripe Bytes Transferred") {
120 m_bytemark = std::stoll(std::string(value));
124 }
else if (key ==
"success") {
125 m_sent_success =
true;
126 }
else if (key ==
"failure") {
std::vector< std::pair< std::string, std::string > > Headers
void ReleaseHandle() override
CurlCopyOp(XrdCl::ResponseHandler *handler, const std::string &source_url, const Headers &source_hdrs, const std::string &dest_url, const Headers &dest_hdrs, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout)
bool Setup(CURL *curl, CurlWorker &) override
void SetDone(bool has_failed)
std::unique_ptr< CURL, void(*)(CURL *)> m_curl
virtual void ReleaseHandle()
void UpdateBytes(uint64_t bytes)
std::vector< std::pair< std::string, std::string > > m_headers_list
XrdCl::ResponseHandler * m_handler
CurlOperation(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, CreateConnCalloutType, HeaderCallout *header_callout)
virtual bool Setup(CURL *curl, CurlWorker &)
Handle an async response.
ConnectionCallout *(*)(const std::string &, const ResponseInfo &) CreateConnCalloutType
std::string_view ltrim_view(const std::string_view &input_view)