28 const std::string &url,
const char *buffer,
size_t buffer_size,
struct timespec timeout,
30 :
CurlOperation(handler, url, timeout, logger, callout, header_callout),
31 m_data(buffer, buffer_size),
32 m_default_handler(default_handler)
37 const std::string &url,
XrdCl::Buffer &&buffer,
struct timespec timeout,
39 :
CurlOperation(handler, url, timeout, logger, callout, header_callout),
40 m_owned_buffer(std::move(buffer)),
41 m_data(buffer.GetBuffer(), buffer.GetSize()),
42 m_default_handler(default_handler)
51 if (
m_handler ==
nullptr && m_default_handler ==
nullptr) {
return;}
53 m_logger->Debug(
kLogXrdClHttp,
"PUT operation at offset %llu failed with message: %s",
static_cast<long long unsigned>(m_offset), msg.c_str());
55 m_logger->Debug(
kLogXrdClHttp,
"PUT operation at offset %llu failed with status code %d",
static_cast<long long unsigned>(m_offset), errNum);
61 if (handle) handle->HandleResponse(status,
nullptr);
62 else m_default_handler->HandleResponse(status,
nullptr);
71 curl_easy_setopt(
m_curl.get(), CURLOPT_UPLOAD, 1);
72 curl_easy_setopt(
m_curl.get(), CURLOPT_READDATA,
this);
73 curl_easy_setopt(
m_curl.get(), CURLOPT_READFUNCTION, CurlPutOp::ReadCallback);
74 if (m_object_size >= 0) {
75 curl_easy_setopt(
m_curl.get(), CURLOPT_INFILESIZE_LARGE, m_object_size);
83 curl_easy_setopt(
m_curl.get(), CURLOPT_READFUNCTION,
nullptr);
84 curl_easy_setopt(
m_curl.get(), CURLOPT_READDATA,
nullptr);
85 curl_easy_setopt(
m_curl.get(), CURLOPT_UPLOAD, 0);
91 curl_easy_setopt(
m_curl.get(), CURLOPT_INFILESIZE_LARGE,
static_cast<curl_off_t
>(-1));
99 if (
m_handler ==
nullptr && m_default_handler ==
nullptr) {
106 m_owned_buffer.Free();
110 if (handle) handle->HandleResponse(status,
nullptr);
111 else m_default_handler->HandleResponse(status,
nullptr);
125 handle->HandleResponse(status,
nullptr);
131 if (!m_curl_handle) {
136 if ((rc = curl_easy_pause(m_curl_handle, CURLPAUSE_CONT)) != CURLE_OK) {
141 return m_curl_handle;
147 if (op.get() !=
this) {
152 m_data = std::string_view(buffer, buffer_size);
159 m_continue_queue->Produce(op);
170 if (op.get() !=
this) {
175 m_data = std::string_view(buffer.GetBuffer(), buffer.GetSize());
176 if (!buffer.GetSize())
182 m_continue_queue->Produce(op);
190size_t CurlPutOp::ReadCallback(
char *buffer,
size_t size,
size_t n,
void *v) {
201 if (op->m_data.empty()) {
206 return CURL_READFUNC_PAUSE;
210 size_t request = size * n;
212 if (request > op->m_data.size()) {
213 request = op->m_data.size();
216 memcpy(buffer, op->m_data.data(), request);
217 op->m_data = op->m_data.substr(request);
void SetDone(bool has_failed)
std::unique_ptr< CURL, void(*)(CURL *)> m_curl
virtual void ReleaseHandle()
void UpdateBytes(uint64_t bytes)
XrdCl::ResponseHandler * m_handler
CurlOperation(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, CreateConnCalloutType, HeaderCallout *header_callout)
void SetPaused(bool paused)
virtual bool Setup(CURL *curl, CurlWorker &)
bool ContinueHandle() override
void Fail(uint16_t errCode, uint32_t errNum, const std::string &msg) override
bool Setup(CURL *curl, CurlWorker &) override
bool Continue(std::shared_ptr< CurlOperation > op, XrdCl::ResponseHandler *handler, const char *buffer, size_t buffer_size)
CurlPutOp(XrdCl::ResponseHandler *handler, std::shared_ptr< XrdCl::ResponseHandler > default_handler, const std::string &url, const char *buffer, size_t buffer_size, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
void ReleaseHandle() override
Binary blob representation.
Handle an async response.
ConnectionCallout *(*)(const std::string &, const ResponseInfo &) CreateConnCalloutType
const uint64_t kLogXrdClHttp
const uint16_t stError
An error occurred that could potentially be retried.
const uint16_t errInternal
Internal error.