added URISyntaxException; better error handling in URIStreamOpener

This commit is contained in:
Günter Obiltschnig 2016-09-29 17:41:37 +02:00
parent ed0284c7c6
commit 07f6f77d6e
4 changed files with 44 additions and 12 deletions

View File

@ -249,6 +249,8 @@ POCO_DECLARE_EXCEPTION(Foundation_API, OpenFileException, FileException)
POCO_DECLARE_EXCEPTION(Foundation_API, WriteFileException, FileException) POCO_DECLARE_EXCEPTION(Foundation_API, WriteFileException, FileException)
POCO_DECLARE_EXCEPTION(Foundation_API, ReadFileException, FileException) POCO_DECLARE_EXCEPTION(Foundation_API, ReadFileException, FileException)
POCO_DECLARE_EXCEPTION(Foundation_API, UnknownURISchemeException, RuntimeException) POCO_DECLARE_EXCEPTION(Foundation_API, UnknownURISchemeException, RuntimeException)
POCO_DECLARE_EXCEPTION(Foundation_API, TooManyURIRedirectsException, RuntimeException)
POCO_DECLARE_EXCEPTION(Foundation_API, URISyntaxException, SyntaxException)
POCO_DECLARE_EXCEPTION(Foundation_API, ApplicationException, Exception) POCO_DECLARE_EXCEPTION(Foundation_API, ApplicationException, Exception)
POCO_DECLARE_EXCEPTION(Foundation_API, BadCastException, RuntimeException) POCO_DECLARE_EXCEPTION(Foundation_API, BadCastException, RuntimeException)

View File

@ -172,7 +172,8 @@ POCO_IMPLEMENT_EXCEPTION(OpenFileException, FileException, "Cannot open file")
POCO_IMPLEMENT_EXCEPTION(WriteFileException, FileException, "Cannot write file") POCO_IMPLEMENT_EXCEPTION(WriteFileException, FileException, "Cannot write file")
POCO_IMPLEMENT_EXCEPTION(ReadFileException, FileException, "Cannot read file") POCO_IMPLEMENT_EXCEPTION(ReadFileException, FileException, "Cannot read file")
POCO_IMPLEMENT_EXCEPTION(UnknownURISchemeException, RuntimeException, "Unknown URI scheme") POCO_IMPLEMENT_EXCEPTION(UnknownURISchemeException, RuntimeException, "Unknown URI scheme")
POCO_IMPLEMENT_EXCEPTION(TooManyURIRedirectsException, RuntimeException, "Too many URI redirects")
POCO_IMPLEMENT_EXCEPTION(URISyntaxException, SyntaxException, "Bad URI syntax")
POCO_IMPLEMENT_EXCEPTION(ApplicationException, Exception, "Application exception") POCO_IMPLEMENT_EXCEPTION(ApplicationException, Exception, "Application exception")
POCO_IMPLEMENT_EXCEPTION(BadCastException, RuntimeException, "Bad cast exception") POCO_IMPLEMENT_EXCEPTION(BadCastException, RuntimeException, "Bad cast exception")

View File

@ -660,9 +660,9 @@ void URI::decode(const std::string& str, std::string& decodedStr, bool plusAsSpa
if (inQuery && plusAsSpace && c == '+') c = ' '; if (inQuery && plusAsSpace && c == '+') c = ' ';
else if (c == '%') else if (c == '%')
{ {
if (it == end) throw SyntaxException("URI encoding: no hex digit following percent sign", str); if (it == end) throw URISyntaxException("URI encoding: no hex digit following percent sign", str);
char hi = *it++; char hi = *it++;
if (it == end) throw SyntaxException("URI encoding: two hex digits must follow percent sign", str); if (it == end) throw URISyntaxException("URI encoding: two hex digits must follow percent sign", str);
char lo = *it++; char lo = *it++;
if (hi >= '0' && hi <= '9') if (hi >= '0' && hi <= '9')
c = hi - '0'; c = hi - '0';
@ -670,7 +670,7 @@ void URI::decode(const std::string& str, std::string& decodedStr, bool plusAsSpa
c = hi - 'A' + 10; c = hi - 'A' + 10;
else if (hi >= 'a' && hi <= 'f') else if (hi >= 'a' && hi <= 'f')
c = hi - 'a' + 10; c = hi - 'a' + 10;
else throw SyntaxException("URI encoding: not a hex digit"); else throw URISyntaxException("URI encoding: not a hex digit");
c *= 16; c *= 16;
if (lo >= '0' && lo <= '9') if (lo >= '0' && lo <= '9')
c += lo - '0'; c += lo - '0';
@ -678,7 +678,7 @@ void URI::decode(const std::string& str, std::string& decodedStr, bool plusAsSpa
c += lo - 'A' + 10; c += lo - 'A' + 10;
else if (lo >= 'a' && lo <= 'f') else if (lo >= 'a' && lo <= 'f')
c += lo - 'a' + 10; c += lo - 'a' + 10;
else throw SyntaxException("URI encoding: not a hex digit"); else throw URISyntaxException("URI encoding: not a hex digit");
} }
decodedStr += c; decodedStr += c;
} }
@ -732,7 +732,7 @@ void URI::parse(const std::string& uri)
if (it != end && *it == ':') if (it != end && *it == ':')
{ {
++it; ++it;
if (it == end) throw SyntaxException("URI scheme must be followed by authority or path", uri); if (it == end) throw URISyntaxException("URI scheme must be followed by authority or path", uri);
setScheme(scheme); setScheme(scheme);
if (*it == '/') if (*it == '/')
{ {
@ -786,7 +786,7 @@ void URI::parseHostAndPort(std::string::const_iterator& it, const std::string::c
// IPv6 address // IPv6 address
++it; ++it;
while (it != end && *it != ']') host += *it++; while (it != end && *it != ']') host += *it++;
if (it == end) throw SyntaxException("unterminated IPv6 address"); if (it == end) throw URISyntaxException("unterminated IPv6 address");
++it; ++it;
} }
else else
@ -804,7 +804,7 @@ void URI::parseHostAndPort(std::string::const_iterator& it, const std::string::c
if (NumberParser::tryParse(port, nport) && nport > 0 && nport < 65536) if (NumberParser::tryParse(port, nport) && nport > 0 && nport < 65536)
_port = (unsigned short) nport; _port = (unsigned short) nport;
else else
throw SyntaxException("bad or invalid port number", port); throw URISyntaxException("bad or invalid port number", port);
} }
else _port = getWellKnownPort(); else _port = getWellKnownPort();
} }

View File

@ -62,13 +62,34 @@ std::istream* URIStreamOpener::open(const std::string& pathOrURI) const
std::string scheme(uri.getScheme()); std::string scheme(uri.getScheme());
FactoryMap::const_iterator it = _map.find(scheme); FactoryMap::const_iterator it = _map.find(scheme);
if (it != _map.end()) if (it != _map.end())
{
return openURI(scheme, uri); return openURI(scheme, uri);
}
else
{
Path path;
if (path.tryParse(pathOrURI, Path::PATH_GUESS))
return openFile(path);
else
throw UnknownURISchemeException(pathOrURI);
}
} }
catch (Exception&) catch (UnknownURISchemeException&)
{ {
throw;
}
catch (TooManyURIRedirectsException&)
{
throw;
}
catch (URISyntaxException&)
{
Path path;
if (path.tryParse(pathOrURI, Path::PATH_GUESS))
return openFile(path);
else
throw;
} }
Path path(pathOrURI, Path::PATH_GUESS);
return openFile(path);
} }
@ -87,6 +108,14 @@ std::istream* URIStreamOpener::open(const std::string& basePathOrURI, const std:
return openURI(scheme, uri); return openURI(scheme, uri);
} }
} }
catch (UnknownURISchemeException&)
{
throw;
}
catch (TooManyURIRedirectsException&)
{
throw;
}
catch (Exception&) catch (Exception&)
{ {
} }
@ -176,7 +205,7 @@ std::istream* URIStreamOpener::openURI(const std::string& scheme, const URI& uri
++redirects; ++redirects;
} }
} }
throw IOException("Too many redirects while opening URI", uri.toString()); throw TooManyURIRedirectsException(uri.toString());
} }