// socket-level errors
virtual void handleError(int error)
{
- if (error == ENOENT) {
- // name lookup failure
- // we won't have an active request yet, so the logic below won't
- // fire to actually call setFailure. Let's fail all of the requests
+ const char* errStr = strerror(error);
+ if (!activeRequest)
+ {
+ // connection level failure, eg name lookup or routing
+ // we won't have an active request yet, so let's fail all of the
+ // requests since we presume it's a systematic failure for
+ // the host in question
BOOST_FOREACH(Request_ptr req, sentRequests) {
- req->setFailure(error, "hostname lookup failure");
+ req->setFailure(error, errStr);
}
BOOST_FOREACH(Request_ptr req, queuedRequests) {
- req->setFailure(error, "hostname lookup failure");
+ req->setFailure(error, errStr);
}
- // name lookup failure, abandon all requests on this connection
sentRequests.clear();
queuedRequests.clear();
}
NetChat::handleError(error);
if (activeRequest) {
- SG_LOG(SG_IO, SG_INFO, "HTTP socket error");
- activeRequest->setFailure(error, "socket error");
+ activeRequest->setFailure(error, errStr);
activeRequest = NULL;
_contentDecoder.reset();
}
assert(state == STATE_WAITING_FOR_RESPONSE);
activeRequest = sentRequests.front();
+ try {
+ activeRequest->responseStart(buffer);
+ } catch (sg_exception& e) {
+ handleError(EIO);
+ }
- activeRequest->responseStart(buffer);
state = STATE_GETTING_HEADERS;
buffer.clear();
if (activeRequest->responseCode() == 204) {
if (state == STATE_CLOSED) {
if (!connectToHost()) {
+
return;
}
void Client::update(int waitTimeout)
{
- d->poller.poll(waitTimeout);
- bool waitingRequests = !d->pendingRequests.empty();
+ if (!d->poller.hasChannels() && (waitTimeout > 0)) {
+ SGTimeStamp::sleepForMSec(waitTimeout);
+ } else {
+ d->poller.poll(waitTimeout);
+ }
+ bool waitingRequests = !d->pendingRequests.empty();
ConnectionDict::iterator it = d->connections.begin();
for (; it != d->connections.end(); ) {
Connection* con = it->second;
}
//------------------------------------------------------------------------------
-FileRequestRef Client::urlretrieve( const std::string& url,
- const std::string& filename )
+FileRequestRef Client::save( const std::string& url,
+ const std::string& filename )
{
FileRequestRef req = new FileRequest(url, filename);
makeRequest(req);
}
//------------------------------------------------------------------------------
-MemoryRequestRef Client::urlload(const std::string& url)
+MemoryRequestRef Client::load(const std::string& url)
{
MemoryRequestRef req = new MemoryRequest(url);
makeRequest(req);