Skip to content

Commit eccb789

Browse files
joshtriplettjyn514
authored andcommitted
Handle cratename::path in top-level search as well
1 parent 6a7d284 commit eccb789

File tree

1 file changed

+39
-4
lines changed

1 file changed

+39
-4
lines changed

src/web/rustdoc.rs

Lines changed: 39 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
5353
vers: &str,
5454
target: Option<&str>,
5555
target_name: &str,
56+
path_in_crate: Option<&str>,
5657
) -> IronResult<Response> {
5758
let mut url_str = if let Some(target) = target {
5859
format!(
@@ -69,6 +70,9 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
6970
if let Some(query) = req.url.query() {
7071
url_str.push('?');
7172
url_str.push_str(query);
73+
} else if let Some(path) = path_in_crate {
74+
url_str.push_str("?query=");
75+
url_str.push_str(path);
7276
}
7377
let url = ctry!(req, Url::parse(&url_str));
7478
let (status_code, max_age) = if vers == "latest" {
@@ -145,10 +149,13 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
145149

146150
// this handler should never called without crate pattern
147151
let crate_name = cexpect!(req, router.find("crate"));
148-
let mut crate_name = percent_decode(crate_name.as_bytes())
152+
let crate_name = percent_decode(crate_name.as_bytes())
149153
.decode_utf8()
150-
.unwrap_or_else(|_| crate_name.into())
151-
.into_owned();
154+
.unwrap_or_else(|_| crate_name.into());
155+
let (mut crate_name, path_in_crate) = match crate_name.split_once("::") {
156+
Some((krate, path)) => (krate.to_string(), Some(path.to_string())),
157+
None => (crate_name.to_string(), None),
158+
};
152159
let req_version = router.find("version");
153160
let mut target = router.find("target");
154161

@@ -190,7 +197,14 @@ pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
190197

191198
if has_docs {
192199
rendering_time.step("redirect to doc");
193-
redirect_to_doc(req, &crate_name, &version, target, &target_name)
200+
redirect_to_doc(
201+
req,
202+
&crate_name,
203+
&version,
204+
target,
205+
&target_name,
206+
path_in_crate.as_deref(),
207+
)
194208
} else {
195209
rendering_time.step("redirect to crate");
196210
redirect_to_crate(req, &crate_name, &version)
@@ -1701,6 +1715,27 @@ mod test {
17011715
})
17021716
}
17031717

1718+
#[test]
1719+
fn test_redirect_crate_coloncolon_path() {
1720+
wrapper(|env| {
1721+
let web = env.frontend();
1722+
env.fake_release().name("some_random_crate").create()?;
1723+
env.fake_release().name("some_other_crate").create()?;
1724+
1725+
assert_redirect(
1726+
"/some_random_crate::somepath",
1727+
"/some_random_crate/latest/some_random_crate/?query=somepath",
1728+
web,
1729+
)?;
1730+
assert_redirect(
1731+
"/some_random_crate::some::path",
1732+
"/some_random_crate/latest/some_random_crate/?query=some::path",
1733+
web,
1734+
)?;
1735+
Ok(())
1736+
})
1737+
}
1738+
17041739
#[test]
17051740
// regression test for https://github.com/rust-lang/docs.rs/pull/885#issuecomment-655147643
17061741
fn test_no_panic_on_missing_kind() {

0 commit comments

Comments
 (0)