diff options
| author | 2010-06-21 21:30:17 +0000 | |
|---|---|---|
| committer | 2010-06-21 21:30:17 +0000 | |
| commit | bfcc3e74db7fe5a3c3f02ac91f862c194e4668f0 (patch) | |
| tree | 5f234546a48bbdb881268c16bc606fd3e6445ef6 /src | |
| parent | tweaked makedist.sh a bit: We can use svn export and don't need to deal with (diff) | |
| download | KVIrc-bfcc3e74db7fe5a3c3f02ac91f862c194e4668f0.tar.gz KVIrc-bfcc3e74db7fe5a3c3f02ac91f862c194e4668f0.tar.bz2 KVIrc-bfcc3e74db7fe5a3c3f02ac91f862c194e4668f0.zip | |
Some details in the http transfer module.
git-svn-id: https://svn.kvirc.de/svn/trunk/kvirc@4500 17fca916-40b9-46aa-a4ea-0a15b648b75c
Diffstat (limited to 'src')
| -rw-r--r-- | src/kvilib/net/kvi_http.cpp | 76 | ||||
| -rw-r--r-- | src/kvilib/net/kvi_http.h | 32 | ||||
| -rw-r--r-- | src/modules/http/libkvihttp.cpp | 14 |
3 files changed, 82 insertions, 40 deletions
diff --git a/src/kvilib/net/kvi_http.cpp b/src/kvilib/net/kvi_http.cpp index bacb9bbf0..891d27f9c 100644 --- a/src/kvilib/net/kvi_http.cpp +++ b/src/kvilib/net/kvi_http.cpp @@ -54,6 +54,7 @@ KviHttpRequest::KviHttpRequest() m_pPrivateData = 0; m_bHeaderProcessed = false; m_pBuffer = new KviDataBuffer(); + m_uConnectionTimeout = 60; resetStatus(); resetData(); @@ -230,15 +231,18 @@ void KviHttpRequest::haveServerIp() if(m_pThread)delete m_pThread; m_pThread = new KviHttpRequestThread( - this, - m_url.host(), - m_szIp, - uPort, - m_url.path(), - m_uContentOffset, - (m_eProcessingType == HeadersOnly) ? KviHttpRequestThread::Head : (m_szPostData.isEmpty() ? KviHttpRequestThread::Get : KviHttpRequestThread::Post), - m_szPostData, - m_url.protocol()=="https"); + this, + m_url.host(), + m_szIp, + uPort, + m_url.path(), + m_uContentOffset, + (m_eProcessingType == HeadersOnly) ? KviHttpRequestThread::Head : (m_szPostData.isEmpty() ? KviHttpRequestThread::Get : KviHttpRequestThread::Post), + m_szPostData, + m_url.protocol()=="https" + ); + + m_pThread->setConnectionTimeout(m_uConnectionTimeout); if(!m_pThread->start()) { @@ -851,16 +855,16 @@ check_stream_length: } KviHttpRequestThread::KviHttpRequestThread( - KviHttpRequest * r, - const QString &szHost, - const QString &szIp, - unsigned short uPort, - const QString & szPath, - unsigned int uContentOffset, - RequestMethod m, - const QString &szPostData, - bool bUseSSL -) : KviSensitiveThread() + KviHttpRequest * r, + const QString &szHost, + const QString &szIp, + unsigned short uPort, + const QString & szPath, + unsigned int uContentOffset, + RequestMethod m, + const QString &szPostData, + bool bUseSSL + ) : KviSensitiveThread() { m_pRequest = r; m_szHost = szHost; @@ -872,6 +876,7 @@ KviHttpRequestThread::KviHttpRequestThread( m_szPostData = szPostData; m_sock = KVI_INVALID_SOCKET; m_bUseSSL = bUseSSL; + m_uConnectionTimeout = 60; #ifdef COMPILE_SSL_SUPPORT m_pSSL = 0; #endif @@ -963,7 +968,8 @@ bool KviHttpRequestThread::selectForWrite(int iTimeoutInSecs) } - if((time(0) - startTime) > iTimeoutInSecs)return failure(__tr_no_lookup("Operation timed out")); + if((time(0) - startTime) > iTimeoutInSecs) + return failure(__tr_no_lookup("Operation timed out")); usleep(100000); // 1/10 sec } @@ -1013,8 +1019,8 @@ bool KviHttpRequestThread::connectToRemoteHost() // now loop selecting for write - //#warning "This should be a tuneable timeout" - if(!selectForWrite(60))return false; + if(!selectForWrite(m_uConnectionTimeout)) + return false; int sockError; int iSize=sizeof(sockError); @@ -1045,10 +1051,12 @@ bool KviHttpRequestThread::connectToRemoteHost() return true; break; case KviSSL::WantRead: - if(!selectForRead(60))return false; + if(!selectForRead(m_uConnectionTimeout)) + return false; break; case KviSSL::WantWrite: - if(!selectForWrite(60))return false; + if(!selectForWrite(m_uConnectionTimeout)) + return false; break; case KviSSL::RemoteEndClosedConnection: return failure(__tr_no_lookup("Remote end has closed the connection")); @@ -1091,7 +1099,8 @@ bool KviHttpRequestThread::sendBuffer(const char * buffer,int bufLen,int iTimeou for(;;) { - if(!processInternalEvents())return failure(); + if(!processInternalEvents()) + return failure(); int wrtn; #ifdef COMPILE_SSL_SUPPORT @@ -1109,7 +1118,8 @@ bool KviHttpRequestThread::sendBuffer(const char * buffer,int bufLen,int iTimeou { curLen -= wrtn; - if(curLen <= 0)break; + if(curLen <= 0) + break; ptr += wrtn; } else { @@ -1122,10 +1132,12 @@ bool KviHttpRequestThread::sendBuffer(const char * buffer,int bufLen,int iTimeou switch(m_pSSL->getProtocolError(wrtn)) { case KviSSL::WantWrite: - if(!selectForWrite(60))return false; + if(!selectForWrite(m_uConnectionTimeout)) + return false; break; case KviSSL::WantRead: - if(!selectForRead(60))return false; + if(!selectForRead(m_uConnectionTimeout)) + return false; break; case KviSSL::SyscallError: if(wrtn == 0) @@ -1273,10 +1285,10 @@ bool KviHttpRequestThread::readDataStep() readed = 0; break; case KviSSL::WantRead: - return selectForRead(120); + return selectForRead(m_uConnectionTimeout); break; case KviSSL::WantWrite: - return selectForWrite(120); + return selectForWrite(m_uConnectionTimeout); break; case KviSSL::SyscallError: { @@ -1316,7 +1328,7 @@ bool KviHttpRequestThread::readDataStep() // yes...read error return failure(KviError::getUntranslatedDescription(KviError::translateSystemError(err))); } - return selectForRead(120); // EINTR or EAGAIN...transient problem + return selectForRead(m_uConnectionTimeout); // EINTR or EAGAIN...transient problem } else { // readed == 0 // Connection closed by remote host @@ -1324,7 +1336,7 @@ bool KviHttpRequestThread::readDataStep() return false; } } - return selectForRead(120); + return selectForRead(m_uConnectionTimeout); } void KviHttpRequestThread::run() diff --git a/src/kvilib/net/kvi_http.h b/src/kvilib/net/kvi_http.h index f99e2b410..08bf40e88 100644 --- a/src/kvilib/net/kvi_http.h +++ b/src/kvilib/net/kvi_http.h @@ -95,6 +95,7 @@ protected: unsigned int m_uRemainingChunkSize; bool m_bIgnoreRemainingData; // used in chunked transfer after the last chunk has been seen KviFile * m_pFile; + unsigned int m_uConnectionTimeout; // in seconds, 60 secs by default protected: bool startDnsLookup(); virtual bool event(QEvent *e); @@ -110,6 +111,13 @@ protected slots: void dnsLookupDone(KviDns *d); void haveServerIp(); public: + void setConnectionTimeout(unsigned int uConnectionTimeout) + { + m_uConnectionTimeout = uConnectionTimeout; + if(m_uConnectionTimeout < 5) + m_uConnectionTimeout = 5; // keep it sane + } + const KviUrl & url(){ return m_url; }; ProcessingType processingType(){ return m_eProcessingType; }; ExistingFileAction existingFileAction(){ return m_eExistingFileAction; }; @@ -164,14 +172,15 @@ public: enum RequestMethod { Post, Get , Head }; protected: KviHttpRequestThread(KviHttpRequest * r, - const QString &szHost, - const QString &szIp, - unsigned short uPort, - const QString &szPath, - unsigned int uContentOffset, - RequestMethod m, - const QString &szPostData = QString(), - bool bUseSSL = false); + const QString &szHost, + const QString &szIp, + unsigned short uPort, + const QString &szPath, + unsigned int uContentOffset, + RequestMethod m, + const QString &szPostData = QString(), + bool bUseSSL = false + ); public: ~KviHttpRequestThread(); @@ -188,10 +197,17 @@ protected: unsigned short m_uPort; kvi_socket_t m_sock; bool m_bUseSSL; + unsigned int m_uConnectionTimeout; #ifdef COMPILE_SSL_SUPPORT KviSSL * m_pSSL; #endif protected: + void setConnectionTimeout(unsigned int uTimeout) + { + m_uConnectionTimeout = uTimeout; + if(m_uConnectionTimeout < 5) + m_uConnectionTimeout = 5; // keep it sane + } int selectForReadStep(); bool selectForRead(int iTimeoutInSecs); bool readDataStep(); diff --git a/src/modules/http/libkvihttp.cpp b/src/modules/http/libkvihttp.cpp index c69267ba9..b29423271 100644 --- a/src/modules/http/libkvihttp.cpp +++ b/src/modules/http/libkvihttp.cpp @@ -109,6 +109,15 @@ static bool http_kvs_complete_get(KviKvsModuleCommandCall * c,QString &szUrl,QSt if(bOk)hft->request()->setContentOffset(uContentOffset); } + // FIXME: this should be numeric + if(c->switches()->getAsStringIfExisting('t',"timeout",tmp)) + { + bool bOk; + unsigned int uConnectionTimeout = tmp.toUInt(&bOk); + if(bOk) + hft->request()->setConnectionTimeout(uConnectionTimeout); + } + if(c->switches()->getAsStringIfExisting('w',"winctrl",tmp)) { if(!tmp.contains('h'))hft->invokeTransferWindow(c->window(),tmp.contains('m'),tmp.contains('n')); @@ -199,6 +208,11 @@ static bool http_kvs_complete_get(KviKvsModuleCommandCall * c,QString &szUrl,QSt and the received stream will be appended to the existing file.(avoid it unless you know what you're doing: it's easy to download broken files).[br] + !sw: -t=<timeout_in_seconds> | --timeout=<timeout_in_seconds> + Changes the default connection timeout to the <timeout_in_seconds>. + A connection stuck for more than <timeout_in_seconds> seconds will be simply aborted. + The default timeout is 60 seconds and is appropriate for most operations. Use with care.[br] + !sw: -h | --head Causes the connection to use the HTTP HEAD method that effectively does not transfer real data. The server sends only the response headers. |
