Skip to content
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

fix(tonic): Preserve HTTP method in interceptor #912

Merged
merged 4 commits into from Feb 21, 2022

Conversation

jdahlq
Copy link
Contributor

@jdahlq jdahlq commented Feb 12, 2022

Motivation

See Issue #911

Solution

The function for converting a Tonic request into an HTTP request, Request::into_http, is public only to the crate and only used in a few places. Currently, HTTP2 and POST are hardcoded for HTTP method and version. Thus, we can simply add method and version params and update the callers, and then fix the interceptor to preserve them.

Comment on lines +251 to +256
let mut request = request.into_http(
uri,
http::Method::POST,
http::Version::HTTP_2,
SanitizeHeaders::Yes,
);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Im not following why these values are not just hard coded intointo_http since they should always be POST and HTTP2 and can be overridden outside (aka for grpc-web).

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks for taking the time to review! Firstly, see my response on issue #911 to make sure we are on the same page.

If Rust supported default parameters, then I would propose making POST and HTTP2 defaults for Request::into_http.

But one issue here is that Request::from_http will happily accept HTTP requests of any version and method, silently dropping that information and creating subtle bugs like this one. By adding method and version to Request::into_http, we are making it more explicit that method and version are not preserved.

In any case, Request::into_http only has two callers currently, and it is restricted to the crate, so the stakes aren't very high here. I could leave grpc.rs alone and instead write a new method Request::from_http_with_custom_method if you think that would be cleaner.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Yup, thanks for writing that up it all makes sense!

@LucioFranco
Copy link
Member

looks like a fmt failure is causing ci to not pass here

@jdahlq
Copy link
Contributor Author

jdahlq commented Feb 18, 2022

I fixed the format issue, and I rebased to fix the minor conflict with #842 .

@jdahlq
Copy link
Contributor Author

jdahlq commented Feb 19, 2022

Whoops, not sure what happened there; during rebasing, the fmt check was fixed in the initial commit, the next commit added a fat-fingered "g" breaking the compile, and I omitted a tokio::test annotation. Sorry about the noise, all fixed now, CI passing.

Copy link
Member

@LucioFranco LucioFranco left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM! Thanks!

@LucioFranco LucioFranco merged commit e623562 into hyperium:master Feb 21, 2022
thekeenant added a commit to affectapp/api that referenced this pull request Mar 4, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

None yet

2 participants