Check for DAV status parse failures.

This commit is contained in:
James Turner
2013-10-09 10:03:26 +02:00
parent 7fdf42b699
commit 0bd82a43d3
3 changed files with 24 additions and 3 deletions
+17 -2
View File
@@ -183,7 +183,8 @@ class DAVMultiStatus::DAVMultiStatusPrivate
{ {
public: public:
DAVMultiStatusPrivate() : DAVMultiStatusPrivate() :
parserInited(false) parserInited(false),
valid(false)
{ {
rootResource = NULL; rootResource = NULL;
} }
@@ -287,6 +288,7 @@ public:
} }
bool parserInited; bool parserInited;
bool valid;
XML_Parser xmlParser; XML_Parser xmlParser;
DAVResource* rootResource; DAVResource* rootResource;
@@ -366,13 +368,21 @@ void DAVMultiStatus::parseXML(const char* data, int size)
XML_ParserFree(_d->xmlParser); XML_ParserFree(_d->xmlParser);
_d->parserInited = false; _d->parserInited = false;
_d->valid = false;
} }
} }
void DAVMultiStatus::finishParse() void DAVMultiStatus::finishParse()
{ {
if (_d->parserInited) { if (_d->parserInited) {
XML_Parse(_d->xmlParser, NULL, 0, true); if (!XML_Parse(_d->xmlParser, NULL, 0, true)) {
SG_LOG(SG_IO, SG_WARN, "DAV parse error:" << XML_ErrorString(XML_GetErrorCode(_d->xmlParser))
<< " at line:" << XML_GetCurrentLineNumber(_d->xmlParser)
<< " column " << XML_GetCurrentColumnNumber(_d->xmlParser));
_d->valid = false;
} else {
_d->valid = true;
}
XML_ParserFree(_d->xmlParser); XML_ParserFree(_d->xmlParser);
} }
@@ -384,4 +394,9 @@ DAVResource* DAVMultiStatus::resource()
return _d->rootResource; return _d->rootResource;
} }
bool DAVMultiStatus::isValid() const
{
return _d->valid;
}
+2
View File
@@ -129,6 +129,8 @@ public:
void finishParse(); void finishParse();
bool isValid() const;
DAVResource* resource(); DAVResource* resource();
class DAVMultiStatusPrivate; class DAVMultiStatusPrivate;
+5 -1
View File
@@ -173,7 +173,11 @@ namespace { // anonmouse
{ {
if (responseCode() == 207) { if (responseCode() == 207) {
_davStatus.finishParse(); _davStatus.finishParse();
_repo->propFindComplete(this, (DAVCollection*) _davStatus.resource()); if (_davStatus.isValid()) {
_repo->propFindComplete(this, (DAVCollection*) _davStatus.resource());
} else {
_repo->propFindFailed(this, SVNRepository::SVN_ERROR_SOCKET);
}
} }
} }