-
-
Notifications
You must be signed in to change notification settings - Fork 1.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
URI parse errors should preserve information from the HTTP crate #3043
Comments
I'm happy to put together a quick PR for this, but I figured it was worth opening an issue first. |
Why not let users downcast it? If http will also 1.0 I don't see the issue in that? Otherwise, I agree with what you said. |
When |
This branch changes the representation of the `Parse::Uri` error kind to preserve information provided by the `http` crate's `uri::InvalidUri` and `uri::InvalidUriParts` errors. A new `InvalidUri` enum is added that holds one of those two error types, or a custom message (since `hyper` currently returns `Parse::Uri` errors that didn't come from an inner `http` error in some cases). The new enum has a custom `Display` and `Debug` implementation to reduce repetition of the string "invalid URI" in its formatted output. This is _not_ stored as the error's `cause` currently in order to avoid exposing the `http` crate's error types in the public API. However, when `http` 1.0 is released, we can simplify this code significantly by storing the error as a cause and exposing it in the source chain. Closes #3043
This branch changes the representation of the `Parse::Uri` error kind to preserve information provided by the `http` crate's `uri::InvalidUri` and `uri::InvalidUriParts` errors. A new `InvalidUri` enum is added that holds one of those two error types, or a custom message (since `hyper` currently returns `Parse::Uri` errors that didn't come from an inner `http` error in some cases). The new enum has a custom `Display` and `Debug` implementation to reduce repetition of the string "invalid URI" in its formatted output. This is _not_ stored as the error's `cause` currently in order to avoid exposing the `http` crate's error types in the public API. However, when `http` 1.0 is released, we can simplify this code significantly by storing the error as a cause and exposing it in the source chain. Closes #3043
Is your feature request related to a problem? Please describe.
When an invalid URI is parsed by the
http
crate, it returns anInvalidUri
error. Whenhyper
encounters one of these errors, it converts it into ahyper::Error
type with an error kind that indicates that an invalid URI was encountered. Thehttp::uri::InvalidUri
type contains additional information describing what part of the URI was invalid, which is included in the error'sfmt::Display
output: https://github.com/hyperium/http/blob/c1f309e0c3695f8e14e1b54c738681783d4c7b9e/src/uri/mod.rs#L1063-L1079Unfrortunately, when
hyper
converts these errors into itshyper::Error
type, the additional information is discarded:hyper/src/error.rs
Lines 489 to 499 in 75aac9f
The error that's returned to the application will format as just "invalid URI", which is not particularly descriptive. Being able to surface more information about why a URI was invalid would be useful, particularly in applications where URIs are input by the user.
Describe the solution you'd like
It would be nice if
hyper
preserved the description of what part of the URI was invalid. I think we should probably change theParse::Uri
variant inhyper::error
to contain anhttp::uri::InvalidUri
, so that we can format the additional error information in thefmt::Display
impl forhyper::Error
.Since we don't want to expose types from other crates in
hyper
's public API, for stability reasons, we probably shouldn't allow the user to access thehttp::uri::InvalidUri
error in thehyper::Error
source chain, or allow downcasting the error to it.Describe alternatives you've considered
http::uri::InvalidUri
as asource
ofhyper::Error
. This might be conceptually the "right thing", but it would expose a type from an external crate inhyper
's public API, which is undesirable ashttp
is not yet 1.0.The text was updated successfully, but these errors were encountered: