Skip to content

Commit 5efa5e0

Browse files
committed
fix fallback search when a resource is not found
1 parent a0e19bc commit 5efa5e0

File tree

1 file changed

+49
-34
lines changed

1 file changed

+49
-34
lines changed

src/web/rustdoc.rs

+49-34
Original file line numberDiff line numberDiff line change
@@ -472,30 +472,38 @@ pub(crate) async fn rustdoc_html_server_handler(
472472
{
473473
debug!("got error serving {}: {}", storage_path, err);
474474
}
475-
// If it fails, we try again with /index.html at the end
476-
storage_path.push_str("/index.html");
477-
req_path.push("index.html");
478475

479-
return if storage
480-
.rustdoc_file_exists(
481-
&params.name,
482-
&krate.version.to_string(),
483-
krate.latest_build_id,
484-
&storage_path,
485-
krate.archive_storage,
486-
)
487-
.await?
488476
{
489-
redirect(
490-
&params.name,
491-
&krate.version,
492-
&req_path,
493-
CachePolicy::ForeverInCdn,
494-
)
495-
} else if req_path.first().map_or(false, |p| p.contains('-')) {
477+
// If it fails, we try again with /index.html at the end
478+
let mut storage_path = storage_path.clone();
479+
storage_path.push_str("/index.html");
480+
481+
let mut req_path = req_path.clone();
482+
req_path.push("index.html");
483+
484+
if storage
485+
.rustdoc_file_exists(
486+
&params.name,
487+
&krate.version.to_string(),
488+
krate.latest_build_id,
489+
&storage_path,
490+
krate.archive_storage,
491+
)
492+
.await?
493+
{
494+
return redirect(
495+
&params.name,
496+
&krate.version,
497+
&req_path,
498+
CachePolicy::ForeverInCdn,
499+
);
500+
}
501+
}
502+
503+
if req_path.first().map_or(false, |p| p.contains('-')) {
496504
// This is a target, not a module; it may not have been built.
497505
// Redirect to the default target and show a search page instead of a hard 404.
498-
Ok(axum_cached_redirect(
506+
return Ok(axum_cached_redirect(
499507
encode_url_path(&format!(
500508
"/crate/{}/{}/target-redirect/{}",
501509
params.name,
@@ -504,21 +512,28 @@ pub(crate) async fn rustdoc_html_server_handler(
504512
)),
505513
CachePolicy::ForeverInCdn,
506514
)?
507-
.into_response())
508-
} else {
509-
if storage_path == format!("{}/index.html", krate.target_name.expect("we check rustdoc_status = true above, and with docs we have target_name")) {
510-
error!(
511-
krate = params.name,
512-
version = krate.version.to_string(),
513-
original_path = original_path.as_ref(),
514-
storage_path,
515-
"Couldn't find crate documentation root on storage.
516-
Something is wrong with the build."
515+
.into_response());
516+
}
517+
518+
if storage_path
519+
== format!(
520+
"{}/index.html",
521+
krate.target_name.expect(
522+
"we check rustdoc_status = true above, and with docs we have target_name"
517523
)
518-
}
524+
)
525+
{
526+
error!(
527+
krate = params.name,
528+
version = krate.version.to_string(),
529+
original_path = original_path.as_ref(),
530+
storage_path,
531+
"Couldn't find crate documentation root on storage.
532+
Something is wrong with the build."
533+
)
534+
}
519535

520-
Err(AxumNope::ResourceNotFound)
521-
};
536+
return Err(AxumNope::ResourceNotFound);
522537
}
523538
};
524539

@@ -2899,7 +2914,7 @@ mod test {
28992914

29002915
web.assert_redirect_cached_unchecked(
29012916
"/clap/2.24.0/i686-pc-windows-gnu/clap/which%20is%20a%20part%20of%20%5B%60Display%60%5D",
2902-
"/crate/clap/2.24.0/target-redirect/i686-pc-windows-gnu/clap/which%20is%20a%20part%20of%20[%60Display%60]/index.html",
2917+
"/crate/clap/2.24.0/target-redirect/i686-pc-windows-gnu/clap/which%20is%20a%20part%20of%20[%60Display%60]",
29032918
CachePolicy::ForeverInCdn,
29042919
&env.config(),
29052920
).await?;

0 commit comments

Comments
 (0)