Skip to content

Commit 383009b

Browse files
committed
code review
1 parent d333ab5 commit 383009b

File tree

2 files changed

+46
-39
lines changed

2 files changed

+46
-39
lines changed

src/web/releases.rs

Lines changed: 28 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -561,24 +561,22 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
561561
return redirect_to_random_crate(req, &mut conn);
562562
}
563563

564-
let (krate, mut query) = match query.split_once("::") {
565-
Some((krate, query)) => (krate.to_string(), format!("?search={query}")),
566-
None => (query.clone(), "".to_string()),
567-
};
564+
let mut queries = std::collections::BTreeMap::new();
568565

569-
for (k, v) in params
570-
.iter()
571-
.filter(|(k, _)| !matches!(k.as_ref(), "i-am-feeling-lucky" | "query"))
572-
{
573-
if query.is_empty() {
574-
query.push('?');
575-
} else {
576-
query.push('&')
566+
let krate = match query.split_once("::") {
567+
Some((krate, query)) => {
568+
queries.insert("search", query);
569+
krate.to_string()
577570
}
578-
query.push_str(k);
579-
query.push('=');
580-
query.push_str(v);
581-
}
571+
None => query.clone(),
572+
};
573+
574+
queries.extend(
575+
params
576+
.iter()
577+
.filter(|(k, _)| !matches!(k.as_ref(), "i-am-feeling-lucky" | "query"))
578+
.map(|(k, v)| (k.as_ref(), v.as_ref())),
579+
);
582580

583581
// since we never pass a version into `match_version` here, we'll never get
584582
// `MatchVersion::Exact`, so the distinction between `Exact` and `Semver` doesn't
@@ -590,10 +588,18 @@ pub fn search_handler(req: &mut Request) -> IronResult<Response> {
590588
let base = redirect_base(req);
591589
let url = if matchver.rustdoc_status {
592590
let target_name = matchver.target_name;
593-
ctry!(
594-
req,
595-
Url::parse(&format!("{base}/{krate}/{version}/{target_name}/{query}"))
596-
)
591+
let path = format!("{base}/{krate}/{version}/{target_name}/");
592+
if queries.is_empty() {
593+
ctry!(req, Url::parse(&path))
594+
} else {
595+
ctry!(
596+
req,
597+
Url::from_generic_url(ctry!(
598+
req,
599+
iron::url::Url::parse_with_params(&path, queries)
600+
))
601+
)
602+
}
597603
} else {
598604
ctry!(req, Url::parse(&format!("{base}/crate/{krate}/{version}")))
599605
};
@@ -891,7 +897,7 @@ mod tests {
891897
)?;
892898
assert_redirect(
893899
"/releases/search?query=some_random_crate::some::path",
894-
"/some_random_crate/1.0.0/some_random_crate/?search=some::path",
900+
"/some_random_crate/1.0.0/some_random_crate/?search=some%3A%3Apath",
895901
web,
896902
)?;
897903
Ok(())
@@ -906,7 +912,7 @@ mod tests {
906912

907913
assert_redirect(
908914
"/releases/search?query=some_random_crate::somepath&go_to_first=true",
909-
"/some_random_crate/1.0.0/some_random_crate/?search=somepath&go_to_first=true",
915+
"/some_random_crate/1.0.0/some_random_crate/?go_to_first=true&search=somepath",
910916
web,
911917
)?;
912918
Ok(())

src/web/rustdoc.rs

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -42,30 +42,31 @@ static DOC_RUST_LANG_ORG_REDIRECTS: Lazy<HashMap<&str, &str>> = Lazy::new(|| {
4242
pub fn rustdoc_redirector_handler(req: &mut Request) -> IronResult<Response> {
4343
fn redirect_to_doc(
4444
req: &Request,
45-
mut url_str: String,
45+
url_str: String,
4646
permanent: bool,
4747
path_in_crate: Option<&str>,
4848
) -> IronResult<Response> {
49-
let mut question_mark = false;
49+
let mut queries: std::collections::BTreeMap<
50+
std::borrow::Cow<'_, str>,
51+
std::borrow::Cow<'_, str>,
52+
> = std::collections::BTreeMap::new();
5053
if let Some(path) = path_in_crate {
51-
url_str.push_str("?search=");
52-
url_str.push_str(path);
53-
question_mark = true;
54+
queries.insert("search".into(), path.into());
5455
}
55-
if let Some(query) = req.url.query() {
56-
if !question_mark {
57-
url_str.push('?');
58-
} else {
59-
url_str.push('&');
60-
}
61-
url_str.push_str(query);
62-
}
63-
let url = ctry!(req, Url::parse(&url_str));
56+
let url: iron::url::Url = req.url.clone().into();
57+
let query_pairs = url.query_pairs();
58+
queries.extend(query_pairs);
59+
let url = if queries.is_empty() {
60+
ctry!(req, iron::url::Url::parse(&url_str))
61+
} else {
62+
ctry!(req, iron::url::Url::parse_with_params(&url_str, queries))
63+
};
6464
let (status_code, max_age) = if permanent {
6565
(status::MovedPermanently, 86400)
6666
} else {
6767
(status::Found, 0)
6868
};
69+
let url = ctry!(req, Url::from_generic_url(url));
6970
let mut resp = Response::with((status_code, Redirect(url)));
7071
resp.headers
7172
.set(CacheControl(vec![CacheDirective::MaxAge(max_age)]));
@@ -1780,18 +1781,18 @@ mod test {
17801781
)?;
17811782
assert_redirect(
17821783
"/some_random_crate::some::path",
1783-
"/some_random_crate/latest/some_random_crate/?search=some::path",
1784+
"/some_random_crate/latest/some_random_crate/?search=some%3A%3Apath",
17841785
web,
17851786
)?;
17861787
assert_redirect(
17871788
"/some_random_crate::some::path?go_to_first=true",
1788-
"/some_random_crate/latest/some_random_crate/?search=some::path&go_to_first=true",
1789+
"/some_random_crate/latest/some_random_crate/?go_to_first=true&search=some%3A%3Apath",
17891790
web,
17901791
)?;
17911792

17921793
assert_redirect(
17931794
"/std::some::path",
1794-
"https://doc.rust-lang.org/stable/std/?search=some::path",
1795+
"https://doc.rust-lang.org/stable/std/?search=some%3A%3Apath",
17951796
web,
17961797
)?;
17971798

0 commit comments

Comments
 (0)