@@ -229,14 +229,28 @@ pub fn crate_details_handler(req: &mut Request) -> IronResult<Response> {
229
229
230
230
let conn = extension ! ( req, Pool ) ;
231
231
232
- match_version ( & conn, & name, req_version)
232
+ let details = match_version ( & conn, & name, req_version)
233
233
. and_then ( |version| CrateDetails :: new ( & conn, & name, & version) )
234
- . ok_or ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) )
235
- . and_then ( |details| {
236
- Page :: new ( details)
237
- . set_true ( "show_package_navigation" )
238
- . set_true ( "javascript_highlightjs" )
239
- . set_true ( "package_navigation_crate_tab" )
240
- . to_resp ( "crate_details" )
241
- } )
234
+ . ok_or ( IronError :: new ( Nope :: CrateNotFound , status:: NotFound ) ) ?;
235
+
236
+ if req. url . path ( ) . join ( "/" ) . ends_with ( "info.json" ) {
237
+ use iron:: status;
238
+ use iron:: headers:: { Expires , HttpDate , CacheControl , CacheDirective , ContentType ,
239
+ AccessControlAllowOrigin } ;
240
+
241
+ let mut resp = Response :: with ( ( status:: Ok , details. to_json ( ) . to_string ( ) ) ) ;
242
+ resp. headers . set ( ContentType ( "application/json" . parse ( ) . unwrap ( ) ) ) ;
243
+ resp. headers . set ( Expires ( HttpDate ( time:: now ( ) ) ) ) ;
244
+ resp. headers . set ( CacheControl ( vec ! [ CacheDirective :: NoCache ,
245
+ CacheDirective :: NoStore ,
246
+ CacheDirective :: MustRevalidate ] ) ) ;
247
+ resp. headers . set ( AccessControlAllowOrigin :: Any ) ;
248
+ Ok ( resp)
249
+ } else {
250
+ Page :: new ( details)
251
+ . set_true ( "show_package_navigation" )
252
+ . set_true ( "javascript_highlightjs" )
253
+ . set_true ( "package_navigation_crate_tab" )
254
+ . to_resp ( "crate_details" )
255
+ }
242
256
}
0 commit comments