diff options
Diffstat (limited to 'server/src/main.rs')
-rw-r--r-- | server/src/main.rs | 13 |
1 files changed, 9 insertions, 4 deletions
diff --git a/server/src/main.rs b/server/src/main.rs index cd38a34..05b5305 100644 --- a/server/src/main.rs +++ b/server/src/main.rs @@ -445,18 +445,23 @@ async fn handle_author(req: HttpRequest) -> Result<HttpResponse, ServerError> { let login = req.match_info().query("author"); println!("author page for {:?}", login); let state: &AServerState = req.app_data().expect("appdata"); - if !is_alnum(login) { - return render_404_page(state, login); + let crates = state.crates.load(); + let aut = match crates.author_by_login(&login).await { + Ok(aut) => aut, + Err(_) => { + return render_404_page(state, login, "user"); + } + }; + if aut.github.login != login { + return Ok(HttpResponse::PermanentRedirect().header("Location", format!("/~{}", encode(&aut.github.login))).body("")); } let cache_file = state.page_cache_dir.join(format!("@{}.html", login)); Ok(serve_cached( with_file_cache(state, cache_file, 3600, { - let login = login.to_owned(); let state = state.clone(); run_timeout(60, async move { let crates = state.crates.load(); let mut page: Vec<u8> = Vec::with_capacity(32000); - let aut = crates.author_by_login(&login).await?; front_end::render_author_page(&mut page, &aut, &crates, &state.markup).await?; Ok::<_, failure::Error>((page, None)) }) |