aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorGravatar Szymon Tomasz Stefanek2010-06-21 21:30:17 +0000
committerGravatar Szymon Tomasz Stefanek2010-06-21 21:30:17 +0000
commitbfcc3e74db7fe5a3c3f02ac91f862c194e4668f0 (patch)
tree5f234546a48bbdb881268c16bc606fd3e6445ef6 /src
parenttweaked makedist.sh a bit: We can use svn export and don't need to deal with (diff)
downloadKVIrc-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.cpp76
-rw-r--r--src/kvilib/net/kvi_http.h32
-rw-r--r--src/modules/http/libkvihttp.cpp14
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.