2 * Copyright (C) 2005-2018 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
11 #include "DAVCommon.h"
12 #include "DllLibCurl.h"
14 #include "utils/RegExp.h"
15 #include "utils/XBMCTinyXML2.h"
16 #include "utils/log.h"
18 using namespace XFILE
;
19 using namespace XCURL
;
21 CDAVFile::CDAVFile(void)
26 CDAVFile::~CDAVFile(void) = default;
28 bool CDAVFile::Execute(const CURL
& url
)
31 ParseAndCorrectUrl(url2
);
33 CLog::Log(LOGDEBUG
, "CDAVFile::Execute({}) {}", fmt::ptr(this), m_url
);
35 assert(!(!m_state
->m_easyHandle
^ !m_state
->m_multiHandle
));
36 if( m_state
->m_easyHandle
== NULL
)
37 g_curlInterface
.easy_acquire(url2
.GetProtocol().c_str(),
38 url2
.GetHostName().c_str(),
39 &m_state
->m_easyHandle
,
40 &m_state
->m_multiHandle
);
42 // setup common curl options
43 SetCommonOptions(m_state
);
44 SetRequestHeaders(m_state
);
46 m_lastResponseCode
= m_state
->Connect(m_bufferSize
);
47 if (m_lastResponseCode
< 0 || m_lastResponseCode
>= 400)
51 if (CURLE_OK
== g_curlInterface
.easy_getinfo(m_state
->m_easyHandle
, CURLINFO_EFFECTIVE_URL
,&efurl
) && efurl
)
54 if (m_lastResponseCode
== 207)
56 std::string strResponse
;
57 ReadData(strResponse
);
59 CXBMCTinyXML2 davResponse
;
60 davResponse
.Parse(strResponse
);
62 if (!davResponse
.Parse(strResponse
))
64 CLog::Log(LOGERROR
, "CDAVFile::Execute - Unable to process dav response ({})",
65 CURL(m_url
).GetRedacted());
70 // Iterate over all responses
71 for (auto* child
= davResponse
.RootElement()->FirstChild(); child
; child
= child
->NextSibling())
73 if (CDAVCommon::ValueWithoutNamespace(child
, "response"))
75 std::string sRetCode
= CDAVCommon::GetStatusTag(child
->ToElement());
77 rxCode
.RegComp("HTTP/.+\\s(\\d+)\\s.*");
78 if (rxCode
.RegFind(sRetCode
) >= 0)
80 if (rxCode
.GetSubCount())
82 m_lastResponseCode
= atoi(rxCode
.GetMatch(1).c_str());
83 if (m_lastResponseCode
< 0 || m_lastResponseCode
>= 400)
95 bool CDAVFile::Delete(const CURL
& url
)
101 std::string strRequest
= "DELETE";
103 dav
.SetCustomRequest(strRequest
);
105 CLog::Log(LOGDEBUG
, "CDAVFile::Delete - Execute DELETE ({})", url
.GetRedacted());
106 if (!dav
.Execute(url
))
108 CLog::Log(LOGERROR
, "CDAVFile::Delete - Unable to delete dav resource ({})", url
.GetRedacted());
117 bool CDAVFile::Rename(const CURL
& url
, const CURL
& urlnew
)
125 std::string strProtocol
= url2
.GetTranslatedProtocol();
126 url2
.SetProtocol(strProtocol
);
128 std::string strRequest
= "MOVE";
129 dav
.SetCustomRequest(strRequest
);
130 dav
.SetRequestHeader("Destination", url2
.GetWithoutUserDetails());
132 CLog::Log(LOGDEBUG
, "CDAVFile::Rename - Execute MOVE ({} -> {})", url
.GetRedacted(),
134 if (!dav
.Execute(url
))
136 CLog::Log(LOGERROR
, "CDAVFile::Rename - Unable to rename dav resource ({} -> {})",
137 url
.GetRedacted(), url2
.GetRedacted());