@@ -167,9 +167,9 @@ pub(crate) async fn rustdoc_redirector_handler(
167167 trace ! ( ?matched_release, "matched version" ) ;
168168 let crate_name = matched_release. name . clone ( ) ;
169169
170- // we might get requests to crate-specific JS files here.
170+ // we might get requests to crate-specific JS/CSS files here.
171171 if let Some ( ref target) = params. target {
172- if target. ends_with ( ".js" ) {
172+ if target. ends_with ( ".js" ) || target . ends_with ( ".css" ) {
173173 // this URL is actually from a crate-internal path, serve it there instead
174174 return async {
175175 let krate = CrateDetails :: from_matched_release ( & mut conn, matched_release) . await ?;
@@ -207,7 +207,7 @@ pub(crate) async fn rustdoc_redirector_handler(
207207 }
208208 }
209209 }
210- . instrument ( info_span ! ( "serve JS for crate" ) )
210+ . instrument ( info_span ! ( "serve asset for crate" ) )
211211 . await ;
212212 }
213213 }
@@ -2540,6 +2540,26 @@ mod test {
25402540 } ) ;
25412541 }
25422542
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+
25432563 #[ test_case( "search-1234.js" ) ]
25442564 #[ test_case( "settings-1234.js" ) ]
25452565 fn fallback_to_root_storage_for_some_js_assets ( path : & str ) {
0 commit comments