@@ -827,6 +827,31 @@ fn read_fill<R: Read + ?Sized>(r: &mut R, mut slice: &mut [u8])
827
827
pub fn download ( req : & mut Request ) -> CargoResult < Response > {
828
828
let crate_name = & req. params ( ) [ "crate_id" ] ;
829
829
let version = & req. params ( ) [ "version" ] ;
830
+
831
+ // If we are a mirror, ignore failure to update download counts.
832
+ // API-only mirrors won't have any crates in their database, and
833
+ // incrementing the download count will look up the crate in the
834
+ // database. Mirrors just want to pass along a redirect URL.
835
+ if req. app ( ) . config . mirror {
836
+ let _ = increment_download_counts ( req, crate_name, version) ;
837
+ } else {
838
+ try!( increment_download_counts ( req, crate_name, version) ) ;
839
+ }
840
+
841
+ let redirect_url = format ! ( "https://{}/crates/{}/{}-{}.crate" ,
842
+ req. app( ) . bucket. host( ) ,
843
+ crate_name, crate_name, version) ;
844
+
845
+ if req. wants_json ( ) {
846
+ #[ derive( RustcEncodable ) ]
847
+ struct R { url : String }
848
+ Ok ( req. json ( & R { url : redirect_url } ) )
849
+ } else {
850
+ Ok ( req. redirect ( redirect_url) )
851
+ }
852
+ }
853
+
854
+ fn increment_download_counts ( req : & Request , crate_name : & str , version : & str ) -> CargoResult < ( ) > {
830
855
let tx = try!( req. tx ( ) ) ;
831
856
let stmt = try!( tx. prepare ( "SELECT versions.id as version_id
832
857
FROM crates
@@ -836,7 +861,7 @@ pub fn download(req: &mut Request) -> CargoResult<Response> {
836
861
canon_crate_name($1)
837
862
AND versions.num = $2
838
863
LIMIT 1" ) ) ;
839
- let rows = try!( stmt. query ( & [ crate_name, version] ) ) ;
864
+ let rows = try!( stmt. query ( & [ & crate_name, & version] ) ) ;
840
865
let row = try!( rows. iter ( ) . next ( ) . chain_error ( || {
841
866
human ( "crate or version not found" )
842
867
} ) ) ;
@@ -862,19 +887,7 @@ pub fn download(req: &mut Request) -> CargoResult<Response> {
862
887
try!( tx. execute ( "INSERT INTO version_downloads
863
888
(version_id) VALUES ($1)" , & [ & version_id] ) ) ;
864
889
}
865
-
866
- // Now that we've done our business, redirect to the actual data.
867
- let redirect_url = format ! ( "https://{}/crates/{}/{}-{}.crate" ,
868
- req. app( ) . bucket. host( ) ,
869
- crate_name, crate_name, version) ;
870
-
871
- if req. wants_json ( ) {
872
- #[ derive( RustcEncodable ) ]
873
- struct R { url : String }
874
- Ok ( req. json ( & R { url : redirect_url } ) )
875
- } else {
876
- Ok ( req. redirect ( redirect_url) )
877
- }
890
+ Ok ( ( ) )
878
891
}
879
892
880
893
/// Handles the `GET /crates/:crate_id/downloads` route.
0 commit comments