-
-
Notifications
You must be signed in to change notification settings - Fork 316
Normalize HTTP request path. #228
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
Changes from all commits
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -630,6 +630,72 @@ fn recv_too_big_headers() { | |
|
||
} | ||
|
||
#[test] | ||
fn request_without_path() { | ||
let _ = ::env_logger::try_init(); | ||
let (io, srv) = mock::new(); | ||
|
||
let srv = srv.assert_client_handshake() | ||
.unwrap() | ||
.recv_settings() | ||
.recv_frame(frames::headers(1).request("GET", "http://example.com/").eos()) | ||
.send_frame(frames::headers(1).response(200).eos()) | ||
.close(); | ||
|
||
let client = client::handshake(io) | ||
.expect("handshake") | ||
.and_then(move |(mut client, conn)| { | ||
// Note the lack of trailing slash. | ||
let request = Request::get("http://example.com") | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It would be good to see tests for There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. I tried to write a test for OPTIONS, but there seems to be some problems unrelated to this change. So, I will open a new issue to track this. There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Ok, I figured out how to write a test, but #229 still applies as it is kind of janky. |
||
.body(()) | ||
.unwrap(); | ||
|
||
let (response, _) = client.send_request(request, true).unwrap(); | ||
|
||
conn.drive(response) | ||
}); | ||
|
||
client.join(srv).wait().unwrap(); | ||
} | ||
|
||
#[test] | ||
fn request_options_with_star() { | ||
let _ = ::env_logger::try_init(); | ||
let (io, srv) = mock::new(); | ||
|
||
// Note the lack of trailing slash. | ||
let uri = uri::Uri::from_parts({ | ||
let mut parts = uri::Parts::default(); | ||
parts.scheme = Some(uri::Scheme::HTTP); | ||
parts.authority = Some(uri::Authority::from_shared("example.com".into()).unwrap()); | ||
parts.path_and_query = Some(uri::PathAndQuery::from_static("*")); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Should we add a There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. It might be useful! |
||
parts | ||
}).unwrap(); | ||
|
||
let srv = srv.assert_client_handshake() | ||
.unwrap() | ||
.recv_settings() | ||
.recv_frame(frames::headers(1).request("OPTIONS", uri.clone()).eos()) | ||
.send_frame(frames::headers(1).response(200).eos()) | ||
.close(); | ||
|
||
let client = client::handshake(io) | ||
.expect("handshake") | ||
.and_then(move |(mut client, conn)| { | ||
let request = Request::builder() | ||
.method(Method::OPTIONS) | ||
.uri(uri) | ||
.body(()) | ||
.unwrap(); | ||
|
||
let (response, _) = client.send_request(request, true).unwrap(); | ||
|
||
conn.drive(response) | ||
}); | ||
|
||
client.join(srv).wait().unwrap(); | ||
} | ||
|
||
const SETTINGS: &'static [u8] = &[0, 0, 0, 4, 0, 0, 0, 0, 0]; | ||
const SETTINGS_ACK: &'static [u8] = &[0, 0, 0, 4, 1, 0, 0, 0, 0]; | ||
|
||
|
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -68,7 +68,7 @@ fn single_stream_send_large_body() { | |
|
||
#[test] | ||
fn multiple_streams_with_payload_greater_than_default_window() { | ||
let _ = ::env_logger::init(); | ||
let _ = ::env_logger::try_init(); | ||
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. This is unrelated to the PR but it can cause tests to fail and it didn't seem worth splitting it out. |
||
|
||
let payload = vec![0; 16384*5-1]; | ||
|
||
|
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
When the URI is
*
it isn't clear to me whatpath
is supposed to be here. is it*
likeUri::path()
says or is it ``?When URI is
*
and the method isn't OPTIONS then it seems like we should return an error somewhere here, but that doesn't seem to be done. Or maybe I'm misunderstanding some details of how*
is handled in the parsing code?There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The relevant spec section:
Does this make sense?
I also saw you opened hyperium/http#176, so we can discuss the details of the
http
path API there.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
So, the path can also be not set of the scheme is not
http
orhttps
, but those cases are not really supported yet.There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I think this is fine, but it should also check for `Method::CONNECT.
RFC7450#CONNECT: