Implement upload/download speed limit (fix #60)

issue-71
Vitaliy Filippov 2016-05-15 23:05:25 +03:00
parent 5327016d36
commit 44d3ddf928
7 changed files with 41 additions and 0 deletions

View File

@ -75,6 +75,7 @@ Enjoy!
- no-remote-new and upload-only modes - no-remote-new and upload-only modes
- ignore regexp does not persist anymore (note that Grive will still track it to not - ignore regexp does not persist anymore (note that Grive will still track it to not
accidentally delete remote files when changing ignore regexp) accidentally delete remote files when changing ignore regexp)
- added options to limit upload and download speed
### Grive2 v0.5 ### Grive2 v0.5

View File

@ -123,6 +123,8 @@ int Main( int argc, char **argv )
( "dry-run", "Only detect which files need to be uploaded/downloaded, " ( "dry-run", "Only detect which files need to be uploaded/downloaded, "
"without actually performing them." ) "without actually performing them." )
( "ignore", po::value<std::string>(), "Perl RegExp to ignore files (matched against relative paths, remembered for next runs)." ) ( "ignore", po::value<std::string>(), "Perl RegExp to ignore files (matched against relative paths, remembered for next runs)." )
( "upload-speed,U", po::value<unsigned>(), "Limit upload speed in kbytes per second" )
( "download-speed,D", po::value<unsigned>(), "Limit download speed in kbytes per second" )
; ;
po::variables_map vm; po::variables_map vm;
@ -195,6 +197,11 @@ int Main( int argc, char **argv )
AuthAgent agent( token, http.get() ) ; AuthAgent agent( token, http.get() ) ;
v2::Syncer2 syncer( &agent ); v2::Syncer2 syncer( &agent );
if ( vm.count( "upload-speed" ) > 0 )
agent.SetUploadSpeed( vm["upload-speed"].as<unsigned>() * 1000 );
if ( vm.count( "download-speed" ) > 0 )
agent.SetDownloadSpeed( vm["download-speed"].as<unsigned>() * 1000 );
Drive drive( &syncer, config.GetAll() ) ; Drive drive( &syncer, config.GetAll() ) ;
drive.DetectChanges() ; drive.DetectChanges() ;

View File

@ -64,4 +64,14 @@ long Agent::Post(
return Request( "POST", url, &s, dest, h ); return Request( "POST", url, &s, dest, h );
} }
void Agent::SetUploadSpeed( unsigned kbytes )
{
mMaxUpload = kbytes;
}
void Agent::SetDownloadSpeed( unsigned kbytes )
{
mMaxDownload = kbytes;
}
} } // end of namespace } } // end of namespace

View File

@ -34,6 +34,9 @@ class Header ;
class Agent class Agent
{ {
protected:
unsigned mMaxUpload, mMaxDownload ;
public : public :
virtual ~Agent() {} virtual ~Agent() {}
@ -70,6 +73,9 @@ public :
DataStream *dest, DataStream *dest,
const Header& hdr ) = 0 ; const Header& hdr ) = 0 ;
virtual void SetUploadSpeed( unsigned kbytes ) ;
virtual void SetDownloadSpeed( unsigned kbytes ) ;
virtual std::string LastError() const = 0 ; virtual std::string LastError() const = 0 ;
virtual std::string LastErrorHeaders() const = 0 ; virtual std::string LastErrorHeaders() const = 0 ;

View File

@ -86,6 +86,10 @@ void CurlAgent::Init()
::curl_easy_setopt( m_pimpl->curl, CURLOPT_HEADERFUNCTION, &CurlAgent::HeaderCallback ) ; ::curl_easy_setopt( m_pimpl->curl, CURLOPT_HEADERFUNCTION, &CurlAgent::HeaderCallback ) ;
::curl_easy_setopt( m_pimpl->curl, CURLOPT_HEADERDATA, this ) ; ::curl_easy_setopt( m_pimpl->curl, CURLOPT_HEADERDATA, this ) ;
::curl_easy_setopt( m_pimpl->curl, CURLOPT_HEADER, 0L ) ; ::curl_easy_setopt( m_pimpl->curl, CURLOPT_HEADER, 0L ) ;
if ( mMaxUpload > 0 )
::curl_easy_setopt( m_pimpl->curl, CURLOPT_MAX_SEND_SPEED_LARGE, mMaxUpload ) ;
if ( mMaxDownload > 0 )
::curl_easy_setopt( m_pimpl->curl, CURLOPT_MAX_RECV_SPEED_LARGE, mMaxDownload ) ;
m_pimpl->error = false; m_pimpl->error = false;
m_pimpl->error_headers = ""; m_pimpl->error_headers = "";
m_pimpl->error_data = ""; m_pimpl->error_data = "";

View File

@ -47,6 +47,16 @@ void AuthAgent::SetLog( http::ResponseLog *log )
return m_agent->SetLog( log ); return m_agent->SetLog( log );
} }
void AuthAgent::SetUploadSpeed( unsigned kbytes )
{
m_agent->SetUploadSpeed( kbytes );
}
void AuthAgent::SetDownloadSpeed( unsigned kbytes )
{
m_agent->SetDownloadSpeed( kbytes );
}
http::Header AuthAgent::AppendHeader( const http::Header& hdr ) const http::Header AuthAgent::AppendHeader( const http::Header& hdr ) const
{ {
http::Header h(hdr) ; http::Header h(hdr) ;

View File

@ -54,6 +54,9 @@ public :
std::string Escape( const std::string& str ) ; std::string Escape( const std::string& str ) ;
std::string Unescape( const std::string& str ) ; std::string Unescape( const std::string& str ) ;
void SetUploadSpeed( unsigned kbytes ) ;
void SetDownloadSpeed( unsigned kbytes ) ;
private : private :
http::Header AppendHeader( const http::Header& hdr ) const ; http::Header AppendHeader( const http::Header& hdr ) const ;
bool CheckRetry( long response ) ; bool CheckRetry( long response ) ;