@@ -43,18 +43,26 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
43
43
let mut conn = extension ! ( req, Pool ) . get ( ) ?;
44
44
let limits = ctry ! ( req, Limits :: for_crate( & mut conn, name) ) ;
45
45
46
+ let is_json = req
47
+ . url
48
+ . path ( )
49
+ . last ( )
50
+ . map_or ( false , |segment| segment. ends_with ( ".json" ) ) ;
51
+
46
52
let version =
47
53
match match_version ( & mut conn, name, req_version) . and_then ( |m| m. assume_exact ( ) ) ? {
48
54
MatchSemver :: Exact ( ( version, _) ) => version,
49
55
50
56
MatchSemver :: Semver ( ( version, _) ) => {
57
+ let ext = if is_json { ".json" } else { "" } ;
51
58
let url = ctry ! (
52
59
req,
53
60
Url :: parse( & format!(
54
- "{}/crate/{}/{}/builds" ,
61
+ "{}/crate/{}/{}/builds{} " ,
55
62
redirect_base( req) ,
56
63
name,
57
- version
64
+ version,
65
+ ext,
58
66
) ) ,
59
67
) ;
60
68
@@ -95,7 +103,7 @@ pub fn build_list_handler(req: &mut Request) -> IronResult<Response> {
95
103
} )
96
104
. collect ( ) ;
97
105
98
- if req . url . path ( ) . join ( "/" ) . ends_with ( ".json" ) {
106
+ if is_json {
99
107
let mut resp = Response :: with ( ( status:: Ok , serde_json:: to_string ( & builds) . unwrap ( ) ) ) ;
100
108
resp. headers . set ( ContentType :: json ( ) ) ;
101
109
resp. headers . set ( Expires ( HttpDate ( time:: now ( ) ) ) ) ;
@@ -302,23 +310,39 @@ mod tests {
302
310
fn latest_redirect ( ) {
303
311
wrapper ( |env| {
304
312
env. fake_release ( )
305
- . name ( "foo " )
313
+ . name ( "aquarelle " )
306
314
. version ( "0.1.0" )
307
315
. builds ( vec ! [ FakeBuild :: default ( )
308
316
. rustc_version( "rustc 1.0.0" )
309
317
. docsrs_version( "docs.rs 1.0.0" ) ] )
310
318
. create ( ) ?;
311
319
312
320
env. fake_release ( )
313
- . name ( "foo " )
321
+ . name ( "aquarelle " )
314
322
. version ( "0.2.0" )
315
323
. builds ( vec ! [ FakeBuild :: default ( )
316
324
. rustc_version( "rustc 1.0.0" )
317
325
. docsrs_version( "docs.rs 1.0.0" ) ] )
318
326
. create ( ) ?;
319
327
320
- let resp = env. frontend ( ) . get ( "/crate/foo/latest/builds" ) . send ( ) ?;
321
- assert ! ( resp. url( ) . as_str( ) . ends_with( "/crate/foo/0.2.0/builds" ) ) ;
328
+ let resp = env
329
+ . frontend ( )
330
+ . get ( "/crate/aquarelle/latest/builds" )
331
+ . send ( ) ?;
332
+ assert ! ( resp
333
+ . url( )
334
+ . as_str( )
335
+ . ends_with( "/crate/aquarelle/0.2.0/builds" ) ) ;
336
+
337
+ let resp_json = env
338
+ . frontend ( )
339
+ . get ( "/crate/aquarelle/latest/builds.json" )
340
+ . send ( ) ?;
341
+ assert ! ( resp_json
342
+ . url( )
343
+ . as_str( )
344
+ . ends_with( "/crate/aquarelle/0.2.0/builds.json" ) ) ;
345
+
322
346
Ok ( ( ) )
323
347
} ) ;
324
348
}
0 commit comments