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