WebDAV error codes: map to SyncMLStatus

This patch enhances error handling so that a more specific
TransportStatusException with the right SyncMLStatus inside is
thrown. This is necessary to report back authentication errors.
This commit is contained in:
Patrick Ohly 2010-10-29 17:25:20 +02:00
parent 8de6b8b3dc
commit b16b37c395
2 changed files with 36 additions and 13 deletions

View file

@ -256,11 +256,22 @@ int Session::propIterator(void *userdata,
void Session::check(int error)
{
if (error) {
switch (error) {
case NE_AUTH:
SE_THROW_EXCEPTION_STATUS(TransportStatusException,
StringPrintf("Neon error code %d: %s",
error,
ne_get_error(m_session)),
STATUS_UNAUTHORIZED);
break;
case NE_OK:
break;
default:
SE_THROW_EXCEPTION(TransportException,
StringPrintf("Neon error code %d: %s",
error,
ne_get_error(m_session)));
break;
}
}
@ -426,7 +437,9 @@ void Request::check(int error)
{
m_session.check(error);
if (getStatus()->klass != 2) {
SE_THROW(std::string("bad status: ") + Status2String(getStatus()));
SE_THROW_EXCEPTION_STATUS(TransportStatusException,
std::string("bad status: ") + Status2String(getStatus()),
SyncMLStatus(getStatus()->code));
}
}

View file

@ -10,6 +10,8 @@
#include <boost/algorithm/string/replace.hpp>
#include <boost/algorithm/string/predicate.hpp>
#include <syncevo/TransportAgent.h>
SE_BEGIN_CXX
/**
@ -25,14 +27,16 @@ public:
virtual std::string getURL()
{
std::string url;
if (m_context) {
vector<string> urls = m_context->getSyncURL();
return urls.empty() ?
"" :
urls.front();
} else {
return "";
if (!urls.empty()) {
url = urls.front();
std::string username = m_context->getUsername();
boost::replace_all(url, "%u", username);
}
}
return url;
}
virtual bool verifySSLHost()
@ -286,8 +290,10 @@ TrackingSyncSource::InsertItemResult WebDAVSource::insertItem(const string &uid,
// created
break;
default:
SE_THROW(std::string("unexpected status for insert: ") +
Neon::Status2String(req.getStatus()));
SE_THROW_EXCEPTION_STATUS(TransportStatusException,
std::string("unexpected status for insert: ") +
Neon::Status2String(req.getStatus()),
SyncMLStatus(req.getStatus()->code));
break;
}
rev = getETag(req);
@ -331,8 +337,10 @@ TrackingSyncSource::InsertItemResult WebDAVSource::insertItem(const string &uid,
SE_THROW("unexpected creation instead of update");
break;
default:
SE_THROW(std::string("unexpected status for update: ") +
Neon::Status2String(req.getStatus()));
SE_THROW_EXCEPTION_STATUS(TransportStatusException,
std::string("unexpected status for update: ") +
Neon::Status2String(req.getStatus()),
SyncMLStatus(req.getStatus()->code));
break;
}
rev = getETag(req);
@ -401,8 +409,10 @@ void WebDAVSource::removeItem(const string &uid)
// the expected outcome
break;
default:
SE_THROW(std::string("unexpected status for removal: ") +
Neon::Status2String(req.getStatus()));
SE_THROW_EXCEPTION_STATUS(TransportStatusException,
std::string("unexpected status for removal: ") +
Neon::Status2String(req.getStatus()),
SyncMLStatus(req.getStatus()->code));
break;
}
}