@@ -167,9 +167,9 @@ pub(crate) async fn rustdoc_redirector_handler(
167
167
trace ! ( ?matched_release, "matched version" ) ;
168
168
let crate_name = matched_release. name . clone ( ) ;
169
169
170
- // we might get requests to crate-specific JS files here.
170
+ // we might get requests to crate-specific JS/CSS files here.
171
171
if let Some ( ref target) = params. target {
172
- if target. ends_with ( ".js" ) {
172
+ if target. ends_with ( ".js" ) || target . ends_with ( ".css" ) {
173
173
// this URL is actually from a crate-internal path, serve it there instead
174
174
return async {
175
175
let krate = CrateDetails :: from_matched_release ( & mut conn, matched_release) . await ?;
@@ -207,7 +207,7 @@ pub(crate) async fn rustdoc_redirector_handler(
207
207
}
208
208
}
209
209
}
210
- . instrument ( info_span ! ( "serve JS for crate" ) )
210
+ . instrument ( info_span ! ( "serve asset for crate" ) )
211
211
. await ;
212
212
}
213
213
}
@@ -2540,6 +2540,26 @@ mod test {
2540
2540
} ) ;
2541
2541
}
2542
2542
2543
+ #[ test_case( "something.js" ) ]
2544
+ #[ test_case( "someting.css" ) ]
2545
+ fn serve_release_specific_static_assets ( name : & str ) {
2546
+ wrapper ( |env| {
2547
+ env. fake_release ( )
2548
+ . name ( "dummy" )
2549
+ . version ( "0.1.0" )
2550
+ . archive_storage ( true )
2551
+ . rustdoc_file_with ( name, b"content" )
2552
+ . create ( ) ?;
2553
+
2554
+ let web = env. frontend ( ) ;
2555
+ let response = web. get ( & format ! ( "/dummy/0.1.0/{name}" ) ) . send ( ) ?;
2556
+ assert ! ( response. status( ) . is_success( ) ) ;
2557
+ assert_eq ! ( response. text( ) ?, "content" ) ;
2558
+
2559
+ Ok ( ( ) )
2560
+ } )
2561
+ }
2562
+
2543
2563
#[ test_case( "search-1234.js" ) ]
2544
2564
#[ test_case( "settings-1234.js" ) ]
2545
2565
fn fallback_to_root_storage_for_some_js_assets ( path : & str ) {
0 commit comments