m_username = "";
m_password = "";
m_httpauth = "";
- m_cipherlist = "DEFAULT";
+ m_cipherlist = "";
m_proxytype = PROXY_HTTP;
m_state = new CReadState();
m_oldState = NULL;
g_curlInterface.easy_setopt(h, CURLOPT_IGNORE_CONTENT_LENGTH, 1);
// Setup allowed TLS/SSL ciphers. New versions of cURL may deprecate things that are still in use.
- g_curlInterface.easy_setopt(h, CURLOPT_SSL_CIPHER_LIST, m_cipherlist.c_str());
+ if (!m_cipherlist.empty())
+ g_curlInterface.easy_setopt(h, CURLOPT_SSL_CIPHER_LIST, m_cipherlist.c_str());
}
void CCurlFile::SetRequestHeaders(CReadState* state)
url2.GetProtocolOptions(options);
if (options.size() > 0)
{
- // clear protocol options
- url2.SetProtocolOptions("");
// set xbmc headers
for(std::map<CStdString, CStdString>::const_iterator it = options.begin(); it != options.end(); ++it)
{
}
}
}
+
+ // Unset the protocol options to have an url without protocol options
+ url2.SetProtocolOptions("");
if (m_username.length() > 0 && m_password.length() > 0)
m_url = url2.GetWithoutUserDetails();
int64_t CCurlFile::Seek(int64_t iFilePosition, int iWhence)
{
int64_t nextPos = m_state->m_filePos;
+
+ if(!m_seekable)
+ return -1;
+
switch(iWhence)
{
case SEEK_SET:
if(m_state->Seek(nextPos))
return nextPos;
- if (m_oldState && m_oldState->Seek(nextPos))
+ if (m_multisession)
{
- CReadState *tmp = m_state;
- m_state = m_oldState;
- m_oldState = tmp;
- return nextPos;
- }
-
- if(!m_seekable)
- return -1;
-
- CReadState* oldstate = NULL;
- if(m_multisession)
- {
- CURL url(m_url);
- oldstate = m_oldState;
- m_oldState = m_state;
- m_state = new CReadState();
-
- g_curlInterface.easy_aquire(url.GetProtocol(), url.GetHostName(), &m_state->m_easyHandle, &m_state->m_multiHandle );
-
- m_state->m_fileSize = m_oldState->m_fileSize;
+ if (!m_oldState)
+ {
+ CURL url(m_url);
+ m_oldState = m_state;
+ m_state = new CReadState();
+ m_state->m_fileSize = m_oldState->m_fileSize;
+ g_curlInterface.easy_aquire(url.GetProtocol(),
+ url.GetHostName(),
+ &m_state->m_easyHandle,
+ &m_state->m_multiHandle );
+ }
+ else
+ {
+ CReadState *tmp;
+ tmp = m_state;
+ m_state = m_oldState;
+ m_oldState = tmp;
+
+ if (m_state->Seek(nextPos))
+ return nextPos;
+
+ m_state->Disconnect();
+ }
}
else
m_state->Disconnect();
long response = m_state->Connect(m_bufferSize);
if(response < 0 && (m_state->m_fileSize == 0 || m_state->m_fileSize != m_state->m_filePos))
{
- m_seekable = false;
- if(m_multisession && m_oldState)
+ if(m_multisession)
{
- delete m_state;
- m_state = m_oldState;
- m_oldState = oldstate;
+ if (m_oldState)
+ {
+ delete m_state;
+ m_state = m_oldState;
+ m_oldState = NULL;
+ }
+ // Retry without mutlisession
+ m_multisession = false;
+ return Seek(iFilePosition, iWhence);
}
- return -1;
+ else
+ {
+ m_seekable = false;
+ return -1;
+ }
}
SetCorrectHeaders(m_state);
- delete oldstate;
return m_state->m_filePos;
}