Merge pull request #25808 from CastagnaIT/fix_url_parse
[xbmc.git] / xbmc / filesystem / DAVFile.cpp
blob56a096a78caa1f6f4f3194f732ac1a19188f2c68
1 /*
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.
7 */
9 #include "DAVFile.h"
11 #include "DAVCommon.h"
12 #include "DllLibCurl.h"
13 #include "URL.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)
22 : CCurlFile()
26 CDAVFile::~CDAVFile(void) = default;
28 bool CDAVFile::Execute(const CURL& url)
30 CURL url2(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)
48 return false;
50 char* efurl;
51 if (CURLE_OK == g_curlInterface.easy_getinfo(m_state->m_easyHandle, CURLINFO_EFFECTIVE_URL,&efurl) && efurl)
52 m_url = 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());
66 Close();
67 return false;
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());
76 CRegExp rxCode;
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)
84 return false;
92 return true;
95 bool CDAVFile::Delete(const CURL& url)
97 if (m_opened)
98 return false;
100 CDAVFile dav;
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());
109 return false;
112 dav.Close();
114 return true;
117 bool CDAVFile::Rename(const CURL& url, const CURL& urlnew)
119 if (m_opened)
120 return false;
122 CDAVFile dav;
124 CURL url2(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(),
133 url2.GetRedacted());
134 if (!dav.Execute(url))
136 CLog::Log(LOGERROR, "CDAVFile::Rename - Unable to rename dav resource ({} -> {})",
137 url.GetRedacted(), url2.GetRedacted());
138 return false;
141 dav.Close();
143 return true;