using namespace std;
using namespace ADDON;
-CStdString URLEncodeInline(const CStdString& strData)
-{
- CStdString buffer = strData;
- CURL::Encode(buffer);
- return buffer;
-}
-
CURL::CURL(const CStdString& strURL1)
{
Parse(strURL1);
if (!(s.st_mode & S_IFDIR))
#endif
{
- Encode(archiveName);
+ archiveName = Encode(archiveName);
if (is_apk)
{
CURL c("apk://" + archiveName + "/" + strURL.substr(iPos + 1));
/* decode urlencoding on this stuff */
if(URIUtils::ProtocolHasEncodedHostname(m_strProtocol))
{
- Decode(m_strHostName);
+ m_strHostName = Decode(m_strHostName);
SetHostName(m_strHostName);
}
- Decode(m_strUserName);
- Decode(m_strPassword);
+ m_strUserName = Decode(m_strUserName);
+ m_strPassword = Decode(m_strPassword);
}
void CURL::SetFileName(const CStdString& strFileName)
strHostName = m_strHostName;
if (URIUtils::ProtocolHasEncodedHostname(m_strProtocol))
- strURL += URLEncodeInline(strHostName);
+ strURL += Encode(strHostName);
else
strURL += strHostName;
strURL += m_strDomain;
strURL += ";";
}
- else if (m_strUserName != "")
+
+ if (m_strUserName != "")
{
- strURL += URLEncodeInline(m_strUserName);
+ strURL += Encode(m_strUserName);
if (m_strPassword != "")
{
strURL += ":";
- strURL += URLEncodeInline(m_strPassword);
+ strURL += Encode(m_strPassword);
}
strURL += "@";
}
if (m_strHostName != "")
{
if( URIUtils::ProtocolHasEncodedHostname(m_strProtocol) )
- strURL += URLEncodeInline(m_strHostName);
+ strURL += Encode(m_strHostName);
else
strURL += m_strHostName;
if (HasPort())
return false;
}
-void CURL::Decode(CStdString& strURLData)
+std::string CURL::Decode(const std::string& strURLData)
//modified to be more accomodating - if a non hex value follows a % take the characters directly and don't raise an error.
// However % characters should really be escaped like any other non safe character (www.rfc-editor.org/rfc/rfc1738.txt)
{
- CStdString strResult;
+ std::string strResult;
/* result will always be less than source */
strResult.reserve( strURLData.length() );
{
if (i < strURLData.size() - 2)
{
- CStdString strTmp;
+ std::string strTmp;
strTmp.assign(strURLData.substr(i + 1, 2));
int dec_num=-1;
- sscanf(strTmp,"%x",(unsigned int *)&dec_num);
+ sscanf(strTmp.c_str(), "%x", (unsigned int *)&dec_num);
if (dec_num<0 || dec_num>255)
strResult += kar;
else
}
else strResult += kar;
}
- strURLData = strResult;
+
+ return strResult;
}
-void CURL::Encode(CStdString& strURLData)
+std::string CURL::Encode(const std::string& strURLData)
{
- CStdString strResult;
+ std::string strResult;
/* wonder what a good value is here is, depends on how often it occurs */
strResult.reserve( strURLData.length() * 2 );
- for (int i = 0; i < (int)strURLData.size(); ++i)
+ for (size_t i = 0; i < strURLData.size(); ++i)
{
- int kar = (unsigned char)strURLData[i];
- //if (kar == ' ') strResult += '+'; // obsolete
- if (isalnum(kar) || strchr("-_.!()" , kar) ) // Don't URL encode these according to RFC1738
- {
- strResult += kar;
- }
+ const char kar = strURLData[i];
+
+ // Don't URL encode "-_.!()" according to RFC1738
+ // TODO: Update it to "-_.~" after Gotham according to RFC3986
+ if (StringUtils::isasciialphanum(kar) || kar == '-' || kar == '.' || kar == '_' || kar == '!' || kar == '(' || kar == ')')
+ strResult.push_back(kar);
else
- {
- CStdString strTmp = StringUtils::Format("%%%02.2x", kar);
- strResult += strTmp;
- }
+ strResult += StringUtils::Format("%%%02.2x", (unsigned int)((unsigned char)kar)); // TODO: Change to "%%%02.2X" after Gotham
}
- strURLData = strResult;
-}
-std::string CURL::Decode(const std::string& strURLData)
-{
- CStdString url = strURLData;
- Decode(url);
- return url;
-}
-
-std::string CURL::Encode(const std::string& strURLData)
-{
- CStdString url = strURLData;
- Encode(url);
- return url;
+ return strResult;
}
CStdString CURL::TranslateProtocol(const CStdString& prot)