bool CMythSession::CanSupport(const CURL& url) { if (m_hostname != url.GetHostName()) return false; if (m_port != (url.HasPort() ? url.GetPort() : MYTH_DEFAULT_PORT)) return false; if (m_username != (url.GetUserName() == "" ? MYTH_DEFAULT_USERNAME : url.GetUserName())) return false; if (m_password != (url.GetPassWord() == "" ? MYTH_DEFAULT_PASSWORD : url.GetPassWord())) return false; return true; }
CStdString CWINSMBDirectory::URLEncode(const CURL &url) { /* due to smb wanting encoded urls we have to build it manually */ CStdString flat = "smb://"; /* samba messes up of password is set but no username is set. don't know why yet */ /* probably the url parser that goes crazy */ if(url.GetUserName().length() > 0 /* || url.GetPassWord().length() > 0 */) { flat += url.GetUserName(); flat += ":"; flat += url.GetPassWord(); flat += "@"; } flat += url.GetHostName(); /* okey sadly since a slash is an invalid name we have to tokenize */ std::vector<CStdString> parts; std::vector<CStdString>::iterator it; CUtil::Tokenize(url.GetFileName(), parts, "/"); for( it = parts.begin(); it != parts.end(); it++ ) { flat += "/"; flat += (*it); } /* okey options should go here, thou current samba doesn't support any */ return flat; }
CSFTPSessionPtr CSFTPSessionManager::CreateSession(const CURL &url) { string username = url.GetUserName().c_str(); string password = url.GetPassWord().c_str(); string hostname = url.GetHostName().c_str(); unsigned int port = url.HasPort() ? url.GetPort() : 22; return CSFTPSessionManager::CreateSession(hostname, port, username, password); }
std::string CSMB::URLEncode(const CURL &url) { /* due to smb wanting encoded urls we have to build it manually */ std::string flat = "smb://"; /* samba messes up of password is set but no username is set. don't know why yet */ /* probably the url parser that goes crazy */ if(url.GetUserName().length() > 0 /* || url.GetPassWord().length() > 0 */) { if(!url.GetDomain().empty()) { flat += URLEncode(url.GetDomain()); flat += ";"; } flat += URLEncode(url.GetUserName()); if(url.GetPassWord().length() > 0) { flat += ":"; flat += URLEncode(url.GetPassWord()); } flat += "@"; } flat += URLEncode(url.GetHostName()); if (url.HasPort()) { flat += StringUtils::Format(":%i", url.GetPort()); } /* okey sadly since a slash is an invalid name we have to tokenize */ std::vector<std::string> parts; std::vector<std::string>::iterator it; StringUtils::Tokenize(url.GetFileName(), parts, "/"); for( it = parts.begin(); it != parts.end(); ++it ) { flat += "/"; flat += URLEncode((*it)); } /* okey options should go here, thou current samba doesn't support any */ return flat; }
CMythSession::CMythSession(const CURL& url) { m_control = NULL; m_event = NULL; m_database = NULL; m_hostname = url.GetHostName(); m_username = url.GetUserName() == "" ? MYTH_DEFAULT_USERNAME : url.GetUserName(); m_password = url.GetPassWord() == "" ? MYTH_DEFAULT_PASSWORD : url.GetPassWord(); m_port = url.HasPort() ? url.GetPort() : MYTH_DEFAULT_PORT; m_timestamp = CTimeUtils::GetTimeMS(); m_dll = new DllLibCMyth; m_dll->Load(); if (m_dll->IsLoaded()) { if (g_advancedSettings.m_logLevel >= LOG_LEVEL_DEBUG_SAMBA) m_dll->dbg_level(CMYTH_DBG_ALL); else if (g_advancedSettings.m_logLevel >= LOG_LEVEL_DEBUG) m_dll->dbg_level(CMYTH_DBG_DETAIL); else m_dll->dbg_level(CMYTH_DBG_ERROR); } m_all_recorded = NULL; }
CMythSession::CMythSession(const CURL& url) : CThread("MythSession") { m_control = NULL; m_event = NULL; m_database = NULL; m_hostname = url.GetHostName(); m_username = url.GetUserName() == "" ? MYTH_DEFAULT_USERNAME : url.GetUserName(); m_password = url.GetPassWord() == "" ? MYTH_DEFAULT_PASSWORD : url.GetPassWord(); m_port = url.HasPort() ? url.GetPort() : MYTH_DEFAULT_PORT; m_timestamp = XbmcThreads::SystemClockMillis(); m_dll = new DllLibCMyth; m_dll->Load(); if (m_dll->IsLoaded()) { m_dll->set_dbg_msgcallback(&CMythSession::LogCMyth); if (g_advancedSettings.m_extraLogLevels & LOGCMYTH) m_dll->dbg_level(CMYTH_DBG_ALL); else if (g_advancedSettings.m_logLevel >= LOG_LEVEL_DEBUG) m_dll->dbg_level(CMYTH_DBG_DETAIL); else m_dll->dbg_level(CMYTH_DBG_ERROR); } m_all_recorded = NULL; }
CStdString CWIN32Util::URLEncode(const CURL &url) { /* due to smb wanting encoded urls we have to build it manually */ CStdString flat = "smb://"; if(url.GetDomain().length() > 0) { flat += url.GetDomain(); flat += ";"; } /* samba messes up of password is set but no username is set. don't know why yet */ /* probably the url parser that goes crazy */ if(url.GetUserName().length() > 0 /* || url.GetPassWord().length() > 0 */) { flat += url.GetUserName(); flat += ":"; flat += url.GetPassWord(); flat += "@"; } else if( !url.GetHostName().IsEmpty() && !g_guiSettings.GetString("smb.username").IsEmpty() ) { /* okey this is abit uggly to do this here, as we don't really only url encode */ /* but it's the simplest place to do so */ flat += g_guiSettings.GetString("smb.username"); flat += ":"; flat += g_guiSettings.GetString("smb.password"); flat += "@"; } flat += url.GetHostName(); /* okey sadly since a slash is an invalid name we have to tokenize */ std::vector<CStdString> parts; std::vector<CStdString>::iterator it; CUtil::Tokenize(url.GetFileName(), parts, "/"); for( it = parts.begin(); it != parts.end(); it++ ) { flat += "/"; flat += (*it); } /* okey options should go here, thou current samba doesn't support any */ return flat; }
bool CFileSFTP::Open(const CURL& url) { string username = url.GetUserName().c_str(); string password = url.GetPassWord().c_str(); string filename = url.GetFileName().c_str(); string hostname = url.GetHostName().c_str(); m_session = CSFTPSessionManager::CreateSession(hostname, username, password); if (m_session) { m_file = filename.c_str(); m_sftp_handle = m_session->CreateFileHande(m_file); return (m_sftp_handle != NULL); } else { CLog::Log(LOGERROR, "SFTPFile: Failed to allocate session"); return false; } }
bool CHTSPDirectorySession::Open(const CURL& url) { if(!m_session.Connect(url.GetHostName(), url.GetPort())) return false; if(m_session.GetProtocol() < 2) { CLog::Log(LOGERROR, "CHTSPDirectory::GetDirectory - incompatible protocol version %d", m_session.GetProtocol()); return false; } if(!url.GetUserName().empty()) m_session.Auth(url.GetUserName(), url.GetPassWord()); if(!m_session.SendEnableAsync()) return false; Create(); m_started.WaitMSec(30000); return !m_bStop; }
CVFSURLWrapper(const CURL& url2) { m_strings.push_back(url2.Get()); m_strings.push_back(url2.GetDomain()); m_strings.push_back(url2.GetHostName()); m_strings.push_back(url2.GetFileName()); m_strings.push_back(url2.GetOptions()); m_strings.push_back(url2.GetUserName()); m_strings.push_back(url2.GetPassWord()); m_strings.push_back(url2.GetRedacted()); m_strings.push_back(url2.GetShareName()); url.url = m_strings[0].c_str(); url.domain = m_strings[1].c_str(); url.hostname = m_strings[2].c_str(); url.filename = m_strings[3].c_str(); url.port = url2.GetPort(); url.options = m_strings[4].c_str(); url.username = m_strings[5].c_str(); url.password = m_strings[6].c_str(); url.redacted = m_strings[7].c_str(); url.sharename = m_strings[8].c_str(); }
void CCurlFile::ParseAndCorrectUrl(CURL &url2) { CStdString strProtocol = url2.GetTranslatedProtocol(); url2.SetProtocol(strProtocol); if( strProtocol.Equals("ftp") || strProtocol.Equals("ftps") ) { /* this is uggly, depending on from where */ /* we get the link it may or may not be */ /* url encoded. if handed from ftpdirectory */ /* it won't be so let's handle that case */ CStdString partial, filename(url2.GetFileName()); CStdStringArray array; /* our current client doesn't support utf8 */ g_charsetConverter.utf8ToStringCharset(filename); /* TODO: create a tokenizer that doesn't skip empty's */ CUtil::Tokenize(filename, array, "/"); filename.Empty(); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { if(it != array.begin()) filename += "/"; partial = *it; CURL::Encode(partial); filename += partial; } /* make sure we keep slashes */ if(url2.GetFileName().Right(1) == "/") filename += "/"; url2.SetFileName(filename); CStdString options = url2.GetOptions().Mid(1); options.TrimRight('/'); // hack for trailing slashes being added from source m_ftpauth = ""; m_ftpport = ""; m_ftppasvip = false; /* parse options given */ CUtil::Tokenize(options, array, "&"); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { CStdString name, value; int pos = it->Find('='); if(pos >= 0) { name = it->Left(pos); value = it->Mid(pos+1, it->size()); } else { name = (*it); value = ""; } if(name.Equals("auth")) { m_ftpauth = value; if(m_ftpauth.IsEmpty()) m_ftpauth = "any"; } else if(name.Equals("active")) { m_ftpport = value; if(value.IsEmpty()) m_ftpport = "-"; } else if(name.Equals("pasvip")) { if(value == "0") m_ftppasvip = false; else m_ftppasvip = true; } } /* ftp has no options */ url2.SetOptions(""); } else if( strProtocol.Equals("http") || strProtocol.Equals("https")) { if (g_guiSettings.GetBool("network.usehttpproxy") && !g_guiSettings.GetString("network.httpproxyserver").empty() && !g_guiSettings.GetString("network.httpproxyport").empty() && m_proxy.IsEmpty()) { m_proxy = g_guiSettings.GetString("network.httpproxyserver"); m_proxy += ":" + g_guiSettings.GetString("network.httpproxyport"); if (g_guiSettings.GetString("network.httpproxyusername").length() > 0 && m_proxyuserpass.IsEmpty()) { m_proxyuserpass = g_guiSettings.GetString("network.httpproxyusername"); m_proxyuserpass += ":" + g_guiSettings.GetString("network.httpproxypassword"); } m_proxytype = (ProxyType)g_guiSettings.GetInt("network.httpproxytype"); CLog::Log(LOGDEBUG, "Using proxy %s, type %d", m_proxy.c_str(), proxyType2CUrlProxyType[m_proxytype]); } // get username and password m_username = url2.GetUserName(); m_password = url2.GetPassWord(); // handle any protocol options CStdString options = url2.GetProtocolOptions(); options.TrimRight('/'); // hack for trailing slashes being added from source if (options.length() > 0) { // clear protocol options url2.SetProtocolOptions(""); // set xbmc headers CStdStringArray array; CUtil::Tokenize(options, array, "&"); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { // parse name, value CStdString name, value; int pos = it->Find('='); if(pos >= 0) { name = it->Left(pos); value = it->Mid(pos+1, it->size()); } else { name = (*it); value = ""; } // url decode value CURL::Decode(value); if(name.Equals("auth")) { m_httpauth = value; if(m_httpauth.IsEmpty()) m_httpauth = "any"; } else if (name.Equals("Referer")) SetReferer(value); else if (name.Equals("User-Agent")) SetUserAgent(value); else if (name.Equals("Cookie")) SetCookie(value); else if (name.Equals("Encoding")) SetContentEncoding(value); else if (name.Equals("noshout") && value.Equals("true")) m_skipshout = true; else SetRequestHeader(name, value); } } } if (m_username.length() > 0 && m_password.length() > 0) m_url = url2.GetWithoutUserDetails(); else m_url = url2.Get(); }
int CFileSFTP::Stat(const CURL& url, struct __stat64* buffer) { CSFTPSessionPtr session = CSFTPSessionManager::CreateSession(url.GetHostName().c_str(), url.GetUserName().c_str(), url.GetPassWord().c_str()); if (session) return session->Stat(url.GetFileName().c_str(), buffer); else { CLog::Log(LOGERROR, "SFTPFile: Failed to create session to stat"); return -1; } }
bool CFileSFTP::Exists(const CURL& url) { CSFTPSessionPtr session = CSFTPSessionManager::CreateSession(url.GetHostName().c_str(), url.GetUserName().c_str(), url.GetPassWord().c_str()); if (session) return session->Exists(url.GetFileName().c_str()); else { CLog::Log(LOGERROR, "SFTPFile: Failed to create session to check exists"); return false; } }
bool CSlingboxFile::Open(const CURL& url) { // Setup the IP/hostname and port (setup default port if none specified) unsigned int uiPort; if (url.HasPort()) uiPort = (unsigned int)url.GetPort(); else uiPort = 5001; m_pSlingbox->SetAddress(url.GetHostName(), uiPort); // Prepare to connect to the Slingbox bool bAdmin; if (url.GetUserName().CompareNoCase("administrator") == 0) bAdmin = true; else if (url.GetUserName().CompareNoCase("viewer") == 0) bAdmin = false; else { CLog::Log(LOGERROR, "%s - Invalid or no username specified for Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); return false; } // Connect to the Slingbox if (m_pSlingbox->Connect(bAdmin, url.GetPassWord())) { CLog::Log(LOGDEBUG, "%s - Successfully connected to Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); } else { CLog::Log(LOGERROR, "%s - Error connecting to Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); return false; } // Initialize the stream if (m_pSlingbox->InitializeStream()) { CLog::Log(LOGDEBUG, "%s - Successfully initialized stream on Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); } else { CLog::Log(LOGERROR, "%s - Error initializing stream on Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); return false; } // Set correct input if (url.GetFileNameWithoutPath() != "") { if (m_pSlingbox->SetInput(atoi(url.GetFileNameWithoutPath()))) CLog::Log(LOGDEBUG, "%s - Successfully requested change to input %i on Slingbox: %s", __FUNCTION__, atoi(url.GetFileNameWithoutPath()), url.GetHostName().c_str()); else CLog::Log(LOGERROR, "%s - Error requesting change to input %i on Slingbox: %s", __FUNCTION__, atoi(url.GetFileNameWithoutPath()), url.GetHostName().c_str()); } // Load the video settings LoadSettings(url.GetHostName()); // Setup video options if (m_pSlingbox->StreamSettings((CSlingbox::Resolution)m_sSlingboxSettings.iVideoResolution, m_sSlingboxSettings.iVideoBitrate, m_sSlingboxSettings.iVideoFramerate, m_sSlingboxSettings.iVideoSmoothing, m_sSlingboxSettings.iAudioBitrate, m_sSlingboxSettings.iIFrameInterval)) { CLog::Log(LOGDEBUG, "%s - Successfully set stream options (resolution: %ix%i; " "video bitrate: %i kbit/s; fps: %i; smoothing: %i%%; audio bitrate %i kbit/s; " "I frame interval: %i) on Slingbox: %s", __FUNCTION__, m_sSlingboxSettings.iVideoWidth, m_sSlingboxSettings.iVideoHeight, m_sSlingboxSettings.iVideoBitrate, m_sSlingboxSettings.iVideoFramerate, m_sSlingboxSettings.iVideoSmoothing, m_sSlingboxSettings.iAudioBitrate, m_sSlingboxSettings.iIFrameInterval, url.GetHostName().c_str()); } else { CLog::Log(LOGERROR, "%s - Error setting stream options on Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); } // Start the stream if (m_pSlingbox->StartStream()) { CLog::Log(LOGDEBUG, "%s - Successfully started stream on Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); } else { CLog::Log(LOGERROR, "%s - Error starting stream on Slingbox: %s", __FUNCTION__, url.GetHostName().c_str()); return false; } // Check for correct input if (url.GetFileNameWithoutPath() != "") { if (m_pSlingbox->GetInput() == -1) CLog::Log(LOGDEBUG, "%s - Unable to confirm change to input %i on Slingbox: %s", __FUNCTION__, atoi(url.GetFileNameWithoutPath()), url.GetHostName().c_str()); else if (m_pSlingbox->GetInput() == atoi(url.GetFileNameWithoutPath())) CLog::Log(LOGDEBUG, "%s - Comfirmed change to input %i on Slingbox: %s", __FUNCTION__, atoi(url.GetFileNameWithoutPath()), url.GetHostName().c_str()); else CLog::Log(LOGERROR, "%s - Error changing to input %i on Slingbox: %s", __FUNCTION__, atoi(url.GetFileNameWithoutPath()), url.GetHostName().c_str()); } return true; }
bool CWin32SMBDirectory::ConnectAndAuthenticate(CURL& url, bool allowPromptForCredential /*= false*/) { assert(url.GetProtocol() == "smb"); if (url.GetHostName().empty()) return false; // can't connect to empty host name if (url.GetUserName().empty() && url.GetPassWord().empty()) CPasswordManager::GetInstance().AuthenticateURL(url); // set username and password if any /* convert everything to wide strings */ std::wstring serverNameW; if (!g_charsetConverter.utf8ToW(url.GetHostName(), serverNameW, false, false, true)) { CLog::Log(LOGERROR, "%s: Can't convert server name \"%s\" to wide string", __FUNCTION__, url.GetHostName().c_str()); return false; } serverNameW = L"\\\\" + serverNameW; std::string serverShareName; // for error descriptions std::wstring serverShareNameW; if (!url.GetShareName().empty()) { serverShareName = "\\\\" + url.GetHostName() + "\\" + url.GetShareName(); if (!g_charsetConverter.utf8ToW(serverShareName, serverShareNameW, false, false, true)) { CLog::Log(LOGERROR, "%s: Can't convert share name \"%s\" to wide string", __FUNCTION__, serverShareName.c_str()); return false; } } else { serverShareName = "\\\\" + url.GetHostName(); serverShareNameW = serverNameW; } std::wstring usernameW; if (!url.GetUserName().empty() && !g_charsetConverter.utf8ToW(url.GetUserName(), usernameW, false, false, true)) { CLog::Log(LOGERROR, "%s: Can't convert username \"%s\" to wide string", __FUNCTION__, url.GetUserName().c_str()); return false; std::wstring domainW; if (!url.GetDomain().empty() && !g_charsetConverter.utf8ToW(url.GetDomain(), domainW, false, false, true)) { CLog::Log(LOGERROR, "%s: Can't convert domain name \"%s\" to wide string", __FUNCTION__, url.GetDomain().c_str()); return false; } if (!domainW.empty()) usernameW += L'@' + domainW; } std::wstring passwordW; if (!url.GetPassWord().empty() && !g_charsetConverter.utf8ToW(url.GetPassWord(), passwordW, false, false, true)) { CLog::Log(LOGERROR, "%s: Can't convert password to wide string", __FUNCTION__); return false; } std::string loginDescr; if (url.GetUserName().empty()) loginDescr = "without username"; else loginDescr = "with username \"" + url.GetUserName() + (url.GetDomain().empty() ? "" : "@" + url.GetDomain()) + "\""; loginDescr += url.GetPassWord().empty() ? " and without password" : " and with password"; NETRESOURCEW connInfo = {}; connInfo.dwType = RESOURCETYPE_ANY; connInfo.lpRemoteName = (LPWSTR)serverShareNameW.c_str(); DWORD connRes; for (int i = 0; i < 3; i++) // make up to three attempts to connect { connRes = WNetAddConnection2W(&connInfo, passwordW.empty() ? NULL : (LPWSTR)passwordW.c_str(), usernameW.empty() ? NULL : (LPWSTR)usernameW.c_str(), CONNECT_TEMPORARY); if (connRes == NO_ERROR) { CLog::Log(LOGDEBUG, "%s: Connected to \"%s\" %s", __FUNCTION__, serverShareName.c_str(), loginDescr.c_str()); return true; } if (connRes == ERROR_ACCESS_DENIED || connRes == ERROR_BAD_USERNAME || connRes == ERROR_INVALID_PASSWORD || connRes == ERROR_LOGON_FAILURE || connRes == ERROR_LOGON_TYPE_NOT_GRANTED || connRes == ERROR_LOGON_NOT_GRANTED) { if (connRes == ERROR_ACCESS_DENIED) CLog::Log(LOGERROR, "%s: Doesn't have permissions to access \"%s\" %s", __FUNCTION__, serverShareName.c_str(), loginDescr.c_str()); else CLog::Log(LOGERROR, "%s: Username/password combination was not accepted by \"%s\" when trying to connect %s", __FUNCTION__, serverShareName.c_str(), loginDescr.c_str()); if (allowPromptForCredential) RequireAuthentication(url); return false; // don't try any more } else if (connRes == ERROR_BAD_NET_NAME || connRes == ERROR_NO_NET_OR_BAD_PATH || connRes == ERROR_NO_NETWORK) { CLog::Log(LOGERROR, "%s: Can't find \"%s\"", __FUNCTION__, serverShareName.c_str()); return false; // don't try any more } else if (connRes == ERROR_BUSY) CLog::Log(LOGNOTICE, "%s: Network is busy for \"%s\"", __FUNCTION__, serverShareName.c_str()); else if (connRes == ERROR_SESSION_CREDENTIAL_CONFLICT) { CLog::Log(LOGWARNING, "%s: Can't connect to \"%s\" %s because of conflict of credential. Will try to close current connections.", __FUNCTION__, serverShareName.c_str(), loginDescr.c_str()); WNetCancelConnection2W((LPWSTR)serverShareNameW.c_str(), 0, FALSE); WNetCancelConnection2W((LPWSTR)(serverNameW + L"\\IPC$").c_str(), 0, FALSE); WNetCancelConnection2W((LPWSTR)serverNameW.c_str(), 0, FALSE); } } CLog::Log(LOGWARNING, "%s: Can't connect to \"%s\" %s. Error code: %lu", __FUNCTION__, serverShareName.c_str(), loginDescr.c_str(), (unsigned long)connRes); return false; }
void CCurlFile::ParseAndCorrectUrl(CURL &url2) { CStdString strProtocol = url2.GetTranslatedProtocol(); url2.SetProtocol(strProtocol); if( strProtocol.Equals("ftp") || strProtocol.Equals("ftps") ) { // we was using url optons for urls, keep the old code work and warning if (!url2.GetOptions().IsEmpty()) { CLog::Log(LOGWARNING, "%s: ftp url option is deprecated, please switch to use protocol option (change '?' to '|'), url: [%s]", __FUNCTION__, url2.Get().c_str()); url2.SetProtocolOptions(url2.GetOptions().Mid(1)); /* ftp has no options */ url2.SetOptions(""); } /* this is uggly, depending on from where */ /* we get the link it may or may not be */ /* url encoded. if handed from ftpdirectory */ /* it won't be so let's handle that case */ CStdString partial, filename(url2.GetFileName()); CStdStringArray array; // if server sent us the filename in non-utf8, we need send back with same encoding. if (url2.GetProtocolOption("utf8") == "0") g_charsetConverter.utf8ToStringCharset(filename); /* TODO: create a tokenizer that doesn't skip empty's */ CUtil::Tokenize(filename, array, "/"); filename.Empty(); for(CStdStringArray::iterator it = array.begin(); it != array.end(); it++) { if(it != array.begin()) filename += "/"; partial = *it; CURL::Encode(partial); filename += partial; } /* make sure we keep slashes */ if(url2.GetFileName().Right(1) == "/") filename += "/"; url2.SetFileName(filename); m_ftpauth = ""; if (url2.HasProtocolOption("auth")) { m_ftpauth = url2.GetProtocolOption("auth"); if(m_ftpauth.IsEmpty()) m_ftpauth = "any"; } m_ftpport = ""; if (url2.HasProtocolOption("active")) { m_ftpport = url2.GetProtocolOption("active"); if(m_ftpport.IsEmpty()) m_ftpport = "-"; } m_ftppasvip = url2.HasProtocolOption("pasvip") && url2.GetProtocolOption("pasvip") != "0"; } else if( strProtocol.Equals("http") || strProtocol.Equals("https")) { if (CSettings::Get().GetBool("network.usehttpproxy") && !CSettings::Get().GetString("network.httpproxyserver").empty() && !CSettings::Get().GetString("network.httpproxyport").empty() && m_proxy.IsEmpty()) { m_proxy = CSettings::Get().GetString("network.httpproxyserver"); m_proxy += ":" + CSettings::Get().GetString("network.httpproxyport"); if (CSettings::Get().GetString("network.httpproxyusername").length() > 0 && m_proxyuserpass.IsEmpty()) { m_proxyuserpass = CSettings::Get().GetString("network.httpproxyusername"); m_proxyuserpass += ":" + CSettings::Get().GetString("network.httpproxypassword"); } m_proxytype = (ProxyType)CSettings::Get().GetInt("network.httpproxytype"); CLog::Log(LOGDEBUG, "Using proxy %s, type %d", m_proxy.c_str(), proxyType2CUrlProxyType[m_proxytype]); } // get username and password m_username = url2.GetUserName(); m_password = url2.GetPassWord(); // handle any protocol options std::map<CStdString, CStdString> options; 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) { const CStdString &name = it->first; CStdString value = it->second; // url decode value CURL::Decode(value); if(name.Equals("auth")) { m_httpauth = value; if(m_httpauth.IsEmpty()) m_httpauth = "any"; } else if (name.Equals("Referer")) SetReferer(value); else if (name.Equals("User-Agent")) SetUserAgent(value); else if (name.Equals("Cookie")) SetCookie(value); else if (name.Equals("Encoding")) SetContentEncoding(value); else if (name.Equals("noshout") && value.Equals("true")) m_skipshout = true; else if (name.Equals("seekable") && value.Equals("0")) m_seekable = false; else SetRequestHeader(name, value); } } } if (m_username.length() > 0 && m_password.length() > 0) m_url = url2.GetWithoutUserDetails(); else m_url = url2.Get(); }