mirror of
https://github.com/pocoproject/poco.git
synced 2025-05-18 20:37:35 +02:00
added URISyntaxException; better error handling in URIStreamOpener
This commit is contained in:
parent
ed0284c7c6
commit
07f6f77d6e
@ -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)
|
||||||
|
@ -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")
|
||||||
|
@ -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();
|
||||||
}
|
}
|
||||||
|
@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user