21#ifndef XRDCLHTTP_CURLOPS_HH
22#define XRDCLHTTP_CURLOPS_HH
62 using HeaderList = std::vector<std::pair<std::string, std::string>>;
85 virtual void Fail(uint16_t errCode, uint32_t errNum,
const std::string &);
117 if (m_last_xfer != std::chrono::steady_clock::time_point()) {
118 return m_last_xfer + m_stall_interval;
124 if (m_received_header) {
125 return m_header_lastop + m_stall_interval;
214 bool TransferStalled(uint64_t xfer_bytes,
const std::chrono::steady_clock::time_point &now);
236 std::pair<XErrorCode, std::string>
GetCallbackError()
const {
return std::make_pair(m_callback_error_code, m_callback_error_str);}
251 bool HasFailed()
const {
return m_has_failed.load(std::memory_order_acquire);}
259 std::tuple<uint64_t, std::chrono::steady_clock::duration, std::chrono::steady_clock::duration, std::chrono::steady_clock::duration>
StatisticsReset();
263 if (m_curl_error_buffer[0] !=
'\0')
264 return m_curl_error_buffer;
271 std::chrono::seconds seconds{stall_interval};
272 m_stall_interval = std::chrono::duration_cast<std::chrono::steady_clock::duration>(seconds);
276 static void SetStallTimeout(
const std::chrono::steady_clock::duration &stall_interval)
278 m_stall_interval = stall_interval;
284 return std::chrono::duration_cast<std::chrono::seconds>(m_default_stall_interval).count();
342 bool Header(
const std::string &header);
343 static size_t HeaderCallback(
char *buffer,
size_t size,
size_t nitems,
void *data);
346 std::unique_ptr<ResponseInfo> m_response_info;
353 static constexpr std::chrono::steady_clock::duration m_default_stall_interval{std::chrono::seconds(60)};
354 static std::chrono::steady_clock::duration m_stall_interval;
358 std::string m_callback_error_str;
359 bool m_tried_broker{
false};
360 bool m_received_header{
false};
362 std::atomic<bool> m_has_failed{
false};
363 bool m_is_paused{
false};
364 int m_conn_callout_result{-1};
365 int m_conn_callout_listener{-1};
367 std::chrono::steady_clock::time_point m_last_reset{};
368 std::chrono::steady_clock::time_point m_last_header_reset{};
369 std::chrono::steady_clock::time_point m_start_op{};
370 std::chrono::steady_clock::time_point m_header_start{};
371 std::chrono::steady_clock::time_point m_pause_start{};
372 std::chrono::steady_clock::duration m_pause_duration{};
375 std::unique_ptr<
struct curl_slist, void(*)(
struct curl_slist *)> m_header_slist{
nullptr, &curl_slist_free_all};
381 std::chrono::steady_clock::time_point m_header_lastop;
384 std::chrono::steady_clock::time_point m_last_xfer;
387 uint64_t m_last_xfer_count{0};
390 double m_ema_rate{-1.0};
393 char m_curl_error_buffer[CURL_ERROR_SIZE]{};
396 std::unique_ptr<ConnectionCallout> m_callout;
397 std::unique_ptr<XrdCl::URL> m_parsed_url{
nullptr};
400 std::unique_ptr<
struct curl_slist, void(*)(
struct curl_slist *)> m_resolve_slist{
nullptr, &curl_slist_free_all};
402 static curl_socket_t OpenSocketCallback(
void *clientp, curlsocktype purpose,
struct curl_sockaddr *address);
403 static int SockOptCallback(
void *clientp, curl_socket_t curlfd, curlsocktype purpose);
404 static curl_socket_t CloseSocketCallback(
void *clientp, curl_socket_t item);
407 static int XferInfoCallback(
void *clientp, curl_off_t dltotal, curl_off_t dlnow, curl_off_t ultotal, curl_off_t ulnow);
410 void SetDone(
bool has_failed) {m_done =
true; m_has_failed.store(has_failed, std::memory_order_release);}
444 void Fail(uint16_t errCode, uint32_t errNum,
const std::string &)
override;
458 std::shared_ptr<CurlOperation> m_parent;
459 CURL *m_parent_curl{
nullptr};
470 CurlOperation(handler, url, timeout, log, callout, header_callout),
471 m_response_info(response_info)
501 std::pair<int64_t, bool> ParseProp(TiXmlElement *prop);
503 static size_t WriteCallback(
char *buffer,
size_t size,
size_t nitems,
void *this_ptr);
506 bool m_response_info{
false};
508 bool m_is_propfind{
false};
510 bool m_is_dir{
false};
511 std::string m_response;
512 int64_t m_length{-1};
530 void Fail(uint16_t errCode, uint32_t errNum,
const std::string &)
override;
539 void SetOpenProperties(
bool setSize);
586 bool m_response_info{
false};
602 void Fail(uint16_t errCode, uint32_t errNum,
const std::string &msg)
override;
610 bool m_response_info{
false};
619 CurlStatOp(handler, url, timeout, log, response_info, callout, header_callout),
637 void Fail(uint16_t errCode, uint32_t errNum,
638 const std::string &message)
override;
646 std::unique_ptr<TapeOperation> tape,
struct timespec timeout,
651 bool ConfigureRequest();
652 void Complete(
const std::string &response);
653 std::string RequestDescription()
const;
654 static size_t WriteCallback(
char *buffer,
size_t size,
size_t nitems,
656 size_t Write(
char *buffer,
size_t size);
658 std::unique_ptr<TapeOperation> m_tape;
661 std::string m_response;
667 const std::vector<std::string> &file_list,
684 const std::string &url,
struct timespec timeout,
const std::pair<uint64_t, uint64_t> &op,
697 virtual void Pause();
700 void Fail(uint16_t errCode, uint32_t errNum,
const std::string &msg)
override;
713 void DeliverResponse();
715 static size_t WriteCallback(
char *buffer,
size_t size,
size_t nitems,
void *this_ptr);
716 size_t Write(
char *buffer,
size_t size);
724 std::string m_prefetch_buffer;
727 size_t m_prefetch_buffer_offset{0};
730 off_t m_prefetch_object_offset{0};
734 std::shared_ptr<XrdCl::ResponseHandler> m_default_handler;
737 std::pair<uint64_t, uint64_t>
m_op;
754 const std::string &url,
struct timespec timeout,
const std::pair<uint64_t, uint64_t> &op,
756 :
CurlReadOp(handler, default_handler, url, timeout, op, buffer, sz, logger, callout, header_callout), m_file(file)
761 virtual void Pause()
override;
764 bool m_first_pause{
true};
777 void Fail(uint16_t errCode, uint32_t errNum,
const std::string &msg)
override;
793 size_t Write(
char *buffer,
size_t size);
798 static size_t WriteCallback(
char *buffer,
size_t size,
size_t nitems,
void *this_ptr);
802 void CalculateNextBuffer();
804 bool m_multipart_boundary {
true};
814 std::unique_ptr<XrdCl::VectorReadInfo>
m_vr;
821 const std::string &url,
struct timespec timeout,
const std::pair<uint64_t, uint64_t> &op,
825 CurlReadOp(handler, default_handler, url, timeout, op, buffer, buffer_size, logger, callout, header_callout)
853 bool m_isexec{
false};
855 time_t m_lastmodified{-1};
861 bool ParseProp(DavEntry &entry, TiXmlElement *prop);
864 const bool m_response_info{
false};
867 std::pair<DavEntry, bool> ParseResponse(TiXmlElement *response);
870 static size_t WriteCallback(
char *buffer,
size_t size,
size_t nitems,
void *this_ptr);
873 bool m_is_origin{
false};
876 std::string m_response;
879 std::string m_host_addr;
897 using Headers = std::vector<std::pair<std::string, std::string>>;
921 static size_t WriteCallback(
char *buffer,
size_t size,
size_t nitems,
void *this_ptr);
924 void HandleLine(std::string_view line);
927 bool ControlChannelTimeoutExpired()
const;
930 std::string m_line_buffer;
936 off_t m_bytemark{-1};
939 bool m_sent_success{
false};
942 std::string m_failure;
952 const std::string &url,
const char *buffer,
size_t buffer_size,
962 void Fail(uint16_t errCode, uint32_t errNum,
const std::string &msg)
override;
969 m_continue_queue = queue;
990 static size_t ReadCallback(
char *buffer,
size_t size,
size_t n,
void *v);
993 CURL *m_curl_handle{
nullptr};
996 std::shared_ptr<XrdClHttp::HandlerQueue> m_continue_queue;
1003 std::string_view m_data;
1008 std::shared_ptr<XrdCl::ResponseHandler> m_default_handler;
1014 off_t m_object_size{-1};
1016 bool m_final{
false};
int emsg(int rc, char *msg)
virtual void OptionsDone() override
RedirectAction Redirect(std::string &target) override
void ReleaseHandle() override
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 HttpVerb GetVerb() const override
bool Setup(CURL *curl, CurlWorker &) override
virtual ~CurlChecksumOp()
virtual HttpVerb GetVerb() const override
std::vector< std::pair< std::string, std::string > > Headers
void ReleaseHandle() override
std::string GetSendingFailureMessage()
void SetProgressHandler(XrdCl::ProgressHandler *handler) noexcept
bool Setup(CURL *curl, CurlWorker &) override
bool IsSentSuccessfully()
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)
bool Setup(CURL *curl, CurlWorker &) override
CurlDeleteOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *logger, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)
void ReleaseHandle() override
virtual HttpVerb GetVerb() const override
bool Setup(CURL *curl, CurlWorker &) override
CurlListdirOp(XrdCl::ResponseHandler *handler, const std::string &url, const std::string &host_addr, bool response_info, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
virtual HttpVerb GetVerb() const override
void ReleaseHandle() override
void Fail(uint16_t errCode, uint32_t errNum, const std::string &msg) override
bool Setup(CURL *curl, CurlWorker &) override
virtual HttpVerb GetVerb() const override
void ReleaseHandle() override
CurlMkcolOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *logger, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)
void ReleaseHandle() override
void Fail(uint16_t errCode, uint32_t errNum, const std::string &) override
CurlOpenOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *logger, XrdClHttp::File *file, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)
virtual void OptionsDone()
void SetDone(bool has_failed)
static void SetStallTimeout(const std::chrono::steady_clock::duration &stall_interval)
int FailCallback(XErrorCode ecode, const std::string &emsg)
int GetStatusCode() const
static int m_minimum_transfer_rate
std::chrono::steady_clock::time_point GetHeaderExpiry() const
bool FinishSetup(CURL *curl)
std::atomic< std::chrono::steady_clock::time_point > m_header_expiry
std::unique_ptr< ResponseInfo > MoveResponseInfo()
const std::string & GetUrl() const
CURL * GetCurlHandle() const
std::unique_ptr< CURL, void(*)(CURL *)> m_curl
bool TransferStalled(uint64_t xfer_bytes, const std::chrono::steady_clock::time_point &now)
static const std::string GetVerbString(HttpVerb)
bool UseConnectionCallout()
virtual HttpVerb GetVerb() const =0
std::string GetCurlErrorMessage() const
virtual void ReleaseHandle()
void UpdateBytes(uint64_t bytes)
virtual bool RequiresOptions() const
static void CleanupDnsCache()
bool GetTriedBoker() const
std::chrono::steady_clock::time_point GetOperationExpiry()
std::tuple< uint64_t, std::chrono::steady_clock::duration, std::chrono::steady_clock::duration, std::chrono::steady_clock::duration > StatisticsReset()
virtual bool ContinueHandle()
std::string GetStatusMessage() const
bool SetupNextRequest(const std::string &url, CurlWorker &worker)
static constexpr int m_default_minimum_rate
static void SetSlowRateBytesSec(int rate)
static void SetStallTimeout(int stall_interval)
CreateConnCalloutType GetConnCalloutFunc() const
std::vector< std::pair< std::string, std::string > > HeaderList
std::vector< std::pair< std::string, std::string > > m_headers_list
HeaderCallout * m_header_callout
static int GetDefaultSlowRateBytesSec()
bool HeaderTimeoutExpired(const std::chrono::steady_clock::time_point &now)
virtual int WaitSocketCallback(std::string &err)
void ExtendDeadline(struct timespec timeout)
std::unique_ptr< ResponseInfo > GetResponseInfo()
XrdClHttp::HttpVerb HttpVerb
std::chrono::steady_clock::time_point m_operation_expiry
virtual void Fail(uint16_t errCode, uint32_t errNum, const std::string &)
virtual RedirectAction Redirect(std::string &target)
XrdCl::ResponseHandler * m_handler
CurlOperation(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, CreateConnCalloutType, HeaderCallout *header_callout)
static int GetDefaultStallTimeout()
void SetPaused(bool paused)
virtual void SetContinueQueue(std::shared_ptr< XrdClHttp::HandlerQueue > queue)
bool StartConnectionCallout(std::string &err)
bool OperationTimeoutExpired(const std::chrono::steady_clock::time_point &now)
CurlOperation(const CurlOperation &)=delete
virtual bool Setup(CURL *curl, CurlWorker &)
std::pair< XErrorCode, std::string > GetCallbackError() const
std::string m_request_url
CurlOptionsOp(CURL *curl, std::shared_ptr< CurlOperation > op, const std::string &url, XrdCl::Log *log, CreateConnCalloutType callout)
virtual HttpVerb GetVerb() const override
std::shared_ptr< CurlOperation > GetOperation() const
CURL * GetParentCurlHandle() const
void ReleaseHandle() override
bool Setup(CURL *curl, CurlWorker &) override
void Fail(uint16_t errCode, uint32_t errNum, const std::string &) override
virtual HttpVerb GetVerb() const override
CurlPgReadOp(XrdCl::ResponseHandler *handler, std::shared_ptr< XrdCl::ResponseHandler > default_handler, const std::string &url, struct timespec timeout, const std::pair< uint64_t, uint64_t > &op, char *buffer, size_t buffer_size, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
CurlPrefetchOpenOp(XrdClHttp::File &file, XrdCl::ResponseHandler *handler, std::shared_ptr< XrdCl::ResponseHandler > default_handler, const std::string &url, struct timespec timeout, const std::pair< uint64_t, uint64_t > &op, char *buffer, size_t sz, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
virtual void Pause() override
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)
virtual HttpVerb GetVerb() const override
virtual void SetContinueQueue(std::shared_ptr< XrdClHttp::HandlerQueue > queue) override
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
CurlQueryOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, bool response_info, CreateConnCalloutType callout, int queryCode, HeaderCallout *header_callout)
void Fail(uint16_t errCode, uint32_t errNum, const std::string &msg) override
std::pair< uint64_t, uint64_t > m_op
bool Setup(CURL *curl, CurlWorker &) override
std::shared_ptr< XrdClHttp::HandlerQueue > m_continue_queue
bool ContinueHandle() override
CurlReadOp(XrdCl::ResponseHandler *handler, std::shared_ptr< XrdCl::ResponseHandler > default_handler, const std::string &url, struct timespec timeout, const std::pair< uint64_t, uint64_t > &op, char *buffer, size_t sz, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
virtual void SetContinueQueue(std::shared_ptr< XrdClHttp::HandlerQueue > queue) override
virtual HttpVerb GetVerb() const override
bool Continue(std::shared_ptr< CurlOperation > op, XrdCl::ResponseHandler *handler, char *buffer, size_t buffer_size)
void ReleaseHandle() override
void ReleaseHandle() override
void SuccessImpl(bool returnObj)
virtual bool RequiresOptions() const override
bool Setup(CURL *curl, CurlWorker &) override
RedirectAction Redirect(std::string &target) override
std::pair< int64_t, bool > GetStatInfo()
CurlStatOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, XrdCl::Log *log, bool response_info, CreateConnCalloutType callout, HeaderCallout *header_callout)
virtual HttpVerb GetVerb() const override
virtual void OptionsDone() override
HttpVerb GetVerb() const override
bool Setup(CURL *curl, CurlWorker &worker) override
CurlTapeOp(XrdCl::ResponseHandler *handler, const std::string &url, std::unique_ptr< TapeOperation > tape, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
void Fail(uint16_t errCode, uint32_t errNum, const std::string &message) override
void ReleaseHandle() override
CurlTapePrepareOp(XrdCl::ResponseHandler *handler, const std::string &url, const std::vector< std::string > &file_list, XrdCl::PrepareFlags::Flags flags, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
CurlTapeQueryOp(XrdCl::ResponseHandler *handler, const std::string &url, XrdCl::QueryCode::Code query_code, const XrdCl::Buffer &arg, struct timespec timeout, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
std::string m_response_headers
std::string m_header_line
size_t Write(char *buffer, size_t size)
CurlVectorReadOp(XrdCl::ResponseHandler *handler, const std::string &url, struct timespec timeout, const XrdCl::ChunkList &op_list, XrdCl::Log *logger, CreateConnCalloutType callout, HeaderCallout *header_callout)
void SetStatusCode(int sc)
void SetSeparator(const std::string &sep)
void ReleaseHandle() override
XrdCl::ChunkList m_chunk_list
virtual HttpVerb GetVerb() const override
std::pair< off_t, off_t > m_current_op
std::unique_ptr< XrdCl::VectorReadInfo > m_vr
bool Setup(CURL *curl, CurlWorker &) override
virtual ~CurlVectorReadOp()
void Fail(uint16_t errCode, uint32_t errNum, const std::string &msg) override
Binary blob representation.
Handle the progress of an asynchronous operation.
Handle an async response.
ConnectionCallout *(*)(const std::string &, const ResponseInfo &) CreateConnCalloutType
std::vector< ChunkInfo > ChunkList
List of chunks.
Code
XRootD query request codes.