00001
00002 #include <memory>
00003 #include <string>
00004 #include <vector>
00005
00006 #include "XrdSys/XrdSysPthread.hh"
00007
00008 #include "XrdHttp/XrdHttpExtHandler.hh"
00009 #include "XrdHttp/XrdHttpUtils.hh"
00010
00011 class XrdOucErrInfo;
00012 class XrdOucStream;
00013 class XrdSfsFile;
00014 class XrdSfsFileSystem;
00015 typedef void CURL;
00016
00017 namespace TPC {
00018 class State;
00019
00020 class TPCHandler : public XrdHttpExtHandler {
00021 public:
00022 TPCHandler(XrdSysError *log, const char *config, XrdOucEnv *myEnv);
00023 virtual ~TPCHandler();
00024
00025 virtual bool MatchesPath(const char *verb, const char *path);
00026 virtual int ProcessReq(XrdHttpExtReq &req);
00027
00028 virtual int Init(const char *cfgfile) {return 0;}
00029
00030 private:
00031 int ProcessOptionsReq(XrdHttpExtReq &req);
00032
00033 static std::string GetAuthz(XrdHttpExtReq &req);
00034
00035 int RedirectTransfer(const std::string &redirect_resource, XrdHttpExtReq &req, XrdOucErrInfo &error);
00036
00037 int OpenWaitStall(XrdSfsFile &fh, const std::string &resource, int mode,
00038 int openMode, const XrdSecEntity &sec,
00039 const std::string &authz);
00040
00041 #ifdef XRD_CHUNK_RESP
00042 int DetermineXferSize(CURL *curl, XrdHttpExtReq &req, TPC::State &state,
00043 bool &success);
00044
00045 int SendPerfMarker(XrdHttpExtReq &req, off_t bytes_transferred);
00046
00047
00048 int RunCurlWithUpdates(CURL *curl, XrdHttpExtReq &req, TPC::State &state,
00049 const char *log_prefix);
00050
00051
00052 int RunCurlWithStreams(XrdHttpExtReq &req, TPC::State &state,
00053 const char *log_prefix, size_t streams);
00054 int RunCurlWithStreamsImpl(XrdHttpExtReq &req, TPC::State &state,
00055 const char *log_prefix, size_t streams,
00056 std::vector<TPC::State*> streams_handles);
00057 #else
00058 int RunCurlBasic(CURL *curl, XrdHttpExtReq &req, TPC::State &state,
00059 const char *log_prefix);
00060 #endif
00061
00062 int ProcessPushReq(const std::string & resource, XrdHttpExtReq &req);
00063 int ProcessPullReq(const std::string &resource, XrdHttpExtReq &req);
00064
00065 bool ConfigureFSLib(XrdOucStream &Config, std::string &path1, bool &path1_alt,
00066 std::string &path2, bool &path2_alt);
00067 bool Configure(const char *configfn, XrdOucEnv *myEnv);
00068
00069 static int m_marker_period;
00070 static size_t m_block_size;
00071 bool m_desthttps;
00072 std::string m_cadir;
00073 static XrdSysMutex m_monid_mutex;
00074 static uint64_t m_monid;
00075 XrdSysError &m_log;
00076 std::unique_ptr<XrdSfsFileSystem> m_sfs;
00077 void *m_handle_base;
00078 void *m_handle_chained;
00079
00080
00081
00082
00083 #ifdef USE_PIPELINING
00084 static const int m_pipelining_multiplier = 16;
00085 #else
00086 static const int m_pipelining_multiplier = 1;
00087 #endif
00088 };
00089 }