Skip to content

Commit e58ddc2

Browse files
committed
migrate source-handlers to axum
1 parent 0e1539b commit e58ddc2

File tree

4 files changed

+181
-158
lines changed

4 files changed

+181
-158
lines changed

src/web/file.rs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,22 @@
11
//! Database based file handler
22
33
use super::cache::CachePolicy;
4-
use crate::storage::{Blob, Storage};
5-
use crate::{error::Result, Config};
4+
use crate::{
5+
error::Result,
6+
storage::{Blob, Storage},
7+
utils::report_error,
8+
Config,
9+
};
10+
use anyhow::anyhow;
11+
use axum::{
12+
http::{
13+
header::{CONTENT_TYPE, LAST_MODIFIED},
14+
StatusCode,
15+
},
16+
response::{IntoResponse, Response as AxumResponse},
17+
};
618
use iron::{status, Response};
19+
use mime::Mime;
720

821
#[derive(Debug)]
922
pub(crate) struct File(pub(crate) Blob);
@@ -44,6 +57,28 @@ impl File {
4457
}
4558
}
4659

60+
impl IntoResponse for File {
61+
fn into_response(self) -> AxumResponse {
62+
let content_type: Mime = self.0.mime.parse::<Mime>().unwrap_or_else(|e| {
63+
report_error(&anyhow!(e).context("could not parse mime from storage object"));
64+
mime::APPLICATION_OCTET_STREAM
65+
});
66+
67+
(
68+
StatusCode::OK,
69+
[
70+
(CONTENT_TYPE, content_type.as_ref()),
71+
(
72+
LAST_MODIFIED,
73+
&self.0.date_updated.format("%a, %d %b %Y %T %Z").to_string(),
74+
),
75+
],
76+
self.0.content,
77+
)
78+
.into_response()
79+
}
80+
}
81+
4782
#[cfg(test)]
4883
mod tests {
4984
use super::*;

src/web/page/web_page.rs

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ macro_rules! impl_axum_webpage {
6767
$page:ty = $template:literal
6868
$(, status = $status:expr)?
6969
$(, content_type = $content_type:expr)?
70+
$(, canonical_url = $canonical_url:expr)?
7071
$(, cache_policy = $cache_policy:expr)?
7172
$(, cpu_intensive_rendering = $cpu_intensive_rendering:expr)?
7273
$(,)?
@@ -75,6 +76,7 @@ macro_rules! impl_axum_webpage {
7576
$page = |_| ::std::borrow::Cow::Borrowed($template)
7677
$(, status = $status)?
7778
$(, content_type = $content_type)?
79+
$(, canonical_url = $canonical_url)?
7880
$(, cache_policy = $cache_policy)?
7981
$(, cpu_intensive_rendering = $cpu_intensive_rendering )?
8082
);
@@ -84,6 +86,7 @@ macro_rules! impl_axum_webpage {
8486
$page:ty = $template:expr
8587
$(, status = $status:expr)?
8688
$(, content_type = $content_type:expr)?
89+
$(, canonical_url = $canonical_url:expr)?
8790
$(, cache_policy = $cache_policy:expr)?
8891
$(, cpu_intensive_rendering = $cpu_intensive_rendering:expr)?
8992
$(,)?
@@ -124,6 +127,19 @@ macro_rules! impl_axum_webpage {
124127
});
125128
)?
126129

130+
$(
131+
let canonical_url = {
132+
let canonical_url: fn(&Self) -> Option<String> = $canonical_url;
133+
(canonical_url)(&self)
134+
};
135+
if let Some(canonical_url) = canonical_url {
136+
response.headers_mut().insert(
137+
axum::http::header::LINK,
138+
format!(r#"<{}>; rel="canonical"#, canonical_url).parse().unwrap(),
139+
);
140+
}
141+
)?
142+
127143

128144
response.extensions_mut().insert($crate::web::page::web_page::DelayedTemplateRender {
129145
context: ::tera::Context::from_serialize(&self)

src/web/routes.rs

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -146,22 +146,30 @@ pub(super) fn build_axum_routes() -> AxumRouter {
146146
"/releases/queue",
147147
get_internal(super::releases::build_queue_handler),
148148
)
149-
.route(
149+
.route_with_tsr(
150150
"/crate/:name/:version/builds",
151151
get_internal(super::builds::build_list_handler),
152152
)
153153
.route(
154154
"/crate/:name/:version/builds.json",
155155
get_static(super::builds::build_list_json_handler),
156156
)
157-
.route(
157+
.route_with_tsr(
158158
"/crate/:name/:version/builds/:id",
159159
get_internal(super::build_details::build_details_handler),
160160
)
161-
.route(
161+
.route_with_tsr(
162162
"/crate/:name/:version/features",
163163
get_internal(super::features::build_features_handler),
164164
)
165+
.route_with_tsr(
166+
"/crate/:name/:version/source/",
167+
get_internal(super::source::source_browser_handler),
168+
)
169+
.route(
170+
"/crate/:name/:version/source/*path",
171+
get_internal(super::source::source_browser_handler),
172+
)
165173
}
166174

167175
// REFACTOR: Break this into smaller initialization functions
@@ -195,18 +203,6 @@ pub(super) fn build_routes() -> Routes {
195203
"/crate/:name/:version/download",
196204
super::rustdoc::download_handler,
197205
);
198-
routes.internal_page(
199-
"/crate/:name/:version/source",
200-
SimpleRedirect::new(|url| url.set_path(&format!("{}/", url.path()))),
201-
);
202-
routes.internal_page(
203-
"/crate/:name/:version/source/",
204-
super::source::source_browser_handler,
205-
);
206-
routes.internal_page(
207-
"/crate/:name/:version/source/*",
208-
super::source::source_browser_handler,
209-
);
210206
routes.internal_page(
211207
"/crate/:name/:version/target-redirect/*",
212208
super::rustdoc::target_redirect_handler,

0 commit comments

Comments
 (0)