@@ -5,7 +5,7 @@ use crate::util::errors::{internal, AppResult};
55
66use std:: env;
77use std:: fs:: { self , File } ;
8- use std:: io:: { Cursor , SeekFrom } ;
8+ use std:: io:: { Cursor , Seek , SeekFrom } ;
99
1010use crate :: models:: Crate ;
1111
@@ -19,7 +19,7 @@ pub enum Uploader {
1919 /// For test usage with `TestApp::with_proxy()`, the recording proxy is used.
2020 S3 {
2121 bucket : Box < s3:: Bucket > ,
22- index_bucket : Box < s3:: Bucket > ,
22+ index_bucket : Option < Box < s3:: Bucket > > ,
2323 cdn : Option < String > ,
2424 } ,
2525
@@ -88,7 +88,7 @@ impl Uploader {
8888
8989 /// Returns the internal path of an uploaded crate's index file.
9090 fn index_path ( name : & str ) -> String {
91- let path = cargo_registry_index:: Repository :: relative_index_file_as_string ( name) ;
91+ let path = cargo_registry_index:: Repository :: relative_index_file_for_url ( name) ;
9292 format ! ( "index/{}" , path)
9393 }
9494
@@ -100,11 +100,12 @@ impl Uploader {
100100 ///
101101 /// This function can panic on an `Self::Local` during development.
102102 /// Production and tests use `Self::S3` which should not panic.
103- pub fn upload < R : std:: io:: Read + std :: io :: Seek + Send + ' static > (
103+ pub fn upload < R : std:: io:: Read + Send + ' static > (
104104 & self ,
105105 client : & Client ,
106106 path : & str ,
107107 mut content : R ,
108+ content_length : u64 ,
108109 content_type : & str ,
109110 extra_headers : header:: HeaderMap ,
110111 upload_bucket : UploadBucket ,
@@ -116,20 +117,21 @@ impl Uploader {
116117 ..
117118 } => {
118119 let bucket = match upload_bucket {
119- UploadBucket :: Index => index_bucket ,
120- UploadBucket :: Default => bucket ,
120+ UploadBucket :: Default => Some ( bucket ) ,
121+ UploadBucket :: Index => index_bucket . as_ref ( ) ,
121122 } ;
122- let content_length = content. seek ( SeekFrom :: End ( 0 ) ) ?;
123- content. seek ( SeekFrom :: Start ( 0 ) ) ?;
124-
125- bucket. put (
126- client,
127- path,
128- content,
129- content_length,
130- content_type,
131- extra_headers,
132- ) ?;
123+
124+ if let Some ( bucket) = bucket {
125+ bucket. put (
126+ client,
127+ path,
128+ content,
129+ content_length,
130+ content_type,
131+ extra_headers,
132+ ) ?;
133+ }
134+
133135 Ok ( Some ( String :: from ( path) ) )
134136 }
135137 Uploader :: Local => {
@@ -152,11 +154,13 @@ impl Uploader {
152154 ..
153155 } => {
154156 let bucket = match upload_bucket {
155- UploadBucket :: Index => index_bucket ,
156- UploadBucket :: Default => bucket ,
157+ UploadBucket :: Default => Some ( bucket ) ,
158+ UploadBucket :: Index => index_bucket . as_ref ( ) ,
157159 } ;
158160
159- bucket. delete ( client, path) ?;
161+ if let Some ( bucket) = bucket {
162+ bucket. delete ( client, path) ?;
163+ }
160164 }
161165 Uploader :: Local => {
162166 let filename = env:: current_dir ( ) . unwrap ( ) . join ( "local_uploads" ) . join ( path) ;
@@ -175,6 +179,7 @@ impl Uploader {
175179 vers : & semver:: Version ,
176180 ) -> AppResult < ( ) > {
177181 let path = Uploader :: crate_path ( & krate. name , & vers. to_string ( ) ) ;
182+ let content_length = body. len ( ) as u64 ;
178183 let content = Cursor :: new ( body) ;
179184 let mut extra_headers = header:: HeaderMap :: new ( ) ;
180185 extra_headers. insert (
@@ -185,6 +190,7 @@ impl Uploader {
185190 http_client,
186191 & path,
187192 content,
193+ content_length,
188194 "application/x-tar" ,
189195 extra_headers,
190196 UploadBucket :: Default ,
@@ -201,6 +207,7 @@ impl Uploader {
201207 readme : String ,
202208 ) -> Result < ( ) > {
203209 let path = Uploader :: readme_path ( crate_name, vers) ;
210+ let content_length = readme. len ( ) as u64 ;
204211 let content = Cursor :: new ( readme) ;
205212 let mut extra_headers = header:: HeaderMap :: new ( ) ;
206213 extra_headers. insert (
@@ -211,6 +218,7 @@ impl Uploader {
211218 http_client,
212219 & path,
213220 content,
221+ content_length,
214222 "text/html" ,
215223 extra_headers,
216224 UploadBucket :: Default ,
@@ -225,7 +233,9 @@ impl Uploader {
225233 index : String ,
226234 ) -> Result < ( ) > {
227235 let path = Uploader :: index_path ( crate_name) ;
228- let content = Cursor :: new ( index) ;
236+ let mut content = Cursor :: new ( index) ;
237+ let content_length = content. seek ( SeekFrom :: End ( 0 ) ) ?;
238+ content. seek ( SeekFrom :: Start ( 0 ) ) ?;
229239 let mut extra_headers = header:: HeaderMap :: new ( ) ;
230240 extra_headers. insert (
231241 header:: CACHE_CONTROL ,
@@ -235,6 +245,7 @@ impl Uploader {
235245 http_client,
236246 & path,
237247 content,
248+ content_length,
238249 "text/plain" ,
239250 extra_headers,
240251 UploadBucket :: Index ,
0 commit comments