@@ -10,6 +10,8 @@ use fs_err::File;
10
10
use multipart:: client:: lazy:: Multipart ;
11
11
use regex:: Regex ;
12
12
use std:: env;
13
+ #[ cfg( any( feature = "native-tls" , feature = "rustls" ) ) ]
14
+ use std:: ffi:: OsString ;
13
15
use std:: io;
14
16
use std:: path:: { Path , PathBuf } ;
15
17
use thiserror:: Error ;
@@ -84,7 +86,7 @@ pub enum UploadError {
84
86
/// TLS error
85
87
#[ cfg( feature = "native-tls" ) ]
86
88
#[ error( "TLS Error" ) ]
87
- TlsError ( #[ source] native_tls_crate :: Error ) ,
89
+ TlsError ( #[ source] native_tls :: Error ) ,
88
90
}
89
91
90
92
impl From < io:: Error > for UploadError {
@@ -100,8 +102,8 @@ impl From<ureq::Error> for UploadError {
100
102
}
101
103
102
104
#[ cfg( feature = "native-tls" ) ]
103
- impl From < native_tls_crate :: Error > for UploadError {
104
- fn from ( error : native_tls_crate :: Error ) -> Self {
105
+ impl From < native_tls :: Error > for UploadError {
106
+ fn from ( error : native_tls :: Error ) -> Self {
105
107
UploadError :: TlsError ( error)
106
108
}
107
109
}
@@ -262,6 +264,78 @@ fn canonicalize_name(name: &str) -> String {
262
264
. to_lowercase ( )
263
265
}
264
266
267
+ fn http_proxy ( ) -> Result < String , env:: VarError > {
268
+ env:: var ( "HTTPS_PROXY" )
269
+ . or_else ( |_| env:: var ( "https_proxy" ) )
270
+ . or_else ( |_| env:: var ( "HTTP_PROXY" ) )
271
+ . or_else ( |_| env:: var ( "http_proxy" ) )
272
+ }
273
+
274
+ #[ cfg( any( feature = "native-tls" , feature = "rustls" ) ) ]
275
+ fn tls_ca_bundle ( ) -> Option < OsString > {
276
+ env:: var_os ( "MATURIN_CA_BUNDLE" )
277
+ . or_else ( || env:: var_os ( "REQUESTS_CA_BUNDLE" ) )
278
+ . or_else ( || env:: var_os ( "CURL_CA_BUNDLE" ) )
279
+ }
280
+
281
+ // Prefer rustls if both native-tls and rustls features are enabled
282
+ #[ cfg( all( feature = "native-tls" , not( feature = "rustls" ) ) ) ]
283
+ #[ allow( clippy:: result_large_err) ]
284
+ fn http_agent ( ) -> Result < ureq:: Agent , UploadError > {
285
+ use std:: sync:: Arc ;
286
+
287
+ let mut builder = ureq:: builder ( ) ;
288
+ if let Ok ( proxy) = http_proxy ( ) {
289
+ let proxy = ureq:: Proxy :: new ( proxy) ?;
290
+ builder = builder. proxy ( proxy) ;
291
+ } ;
292
+ let mut tls_builder = native_tls:: TlsConnector :: builder ( ) ;
293
+ if let Some ( ca_bundle) = tls_ca_bundle ( ) {
294
+ let mut reader = io:: BufReader :: new ( File :: open ( ca_bundle) ?) ;
295
+ for cert in rustls_pemfile:: certs ( & mut reader) ? {
296
+ tls_builder. add_root_certificate ( native_tls:: Certificate :: from_pem ( & cert) ?) ;
297
+ }
298
+ }
299
+ builder = builder. tls_connector ( Arc :: new ( tls_builder. build ( ) ?) ) ;
300
+ Ok ( builder. build ( ) )
301
+ }
302
+
303
+ #[ cfg( feature = "rustls" ) ]
304
+ #[ allow( clippy:: result_large_err) ]
305
+ fn http_agent ( ) -> Result < ureq:: Agent , UploadError > {
306
+ use std:: sync:: Arc ;
307
+
308
+ let mut builder = ureq:: builder ( ) ;
309
+ if let Ok ( proxy) = http_proxy ( ) {
310
+ let proxy = ureq:: Proxy :: new ( proxy) ?;
311
+ builder = builder. proxy ( proxy) ;
312
+ } ;
313
+ if let Some ( ca_bundle) = tls_ca_bundle ( ) {
314
+ let mut reader = io:: BufReader :: new ( File :: open ( ca_bundle) ?) ;
315
+ let certs = rustls_pemfile:: certs ( & mut reader) ?;
316
+ let mut root_certs = rustls:: RootCertStore :: empty ( ) ;
317
+ root_certs. add_parsable_certificates ( & certs) ;
318
+ let client_config = rustls:: ClientConfig :: builder ( )
319
+ . with_safe_defaults ( )
320
+ . with_root_certificates ( root_certs)
321
+ . with_no_client_auth ( ) ;
322
+ Ok ( builder. tls_config ( Arc :: new ( client_config) ) . build ( ) )
323
+ } else {
324
+ Ok ( builder. build ( ) )
325
+ }
326
+ }
327
+
328
+ #[ cfg( not( any( feature = "native-tls" , feature = "rustls" ) ) ) ]
329
+ #[ allow( clippy:: result_large_err) ]
330
+ fn http_agent ( ) -> Result < ureq:: Agent , UploadError > {
331
+ let mut builder = ureq:: builder ( ) ;
332
+ if let Ok ( proxy) = http_proxy ( ) {
333
+ let proxy = ureq:: Proxy :: new ( proxy) ?;
334
+ builder = builder. proxy ( proxy) ;
335
+ } ;
336
+ Ok ( builder. build ( ) )
337
+ }
338
+
265
339
/// Uploads a single wheel to the registry
266
340
#[ allow( clippy:: result_large_err) ]
267
341
pub fn upload ( registry : & Registry , wheel_path : & Path ) -> Result < ( ) , UploadError > {
@@ -339,35 +413,9 @@ pub fn upload(registry: &Registry, wheel_path: &Path) -> Result<(), UploadError>
339
413
340
414
form. add_stream ( "content" , & wheel, Some ( wheel_name) , None ) ;
341
415
let multipart_data = form. prepare ( ) . map_err ( |e| e. error ) ?;
342
-
343
416
let encoded = base64:: encode ( format ! ( "{}:{}" , registry. username, registry. password) ) ;
344
417
345
- let http_proxy = env:: var ( "HTTPS_PROXY" )
346
- . or_else ( |_| env:: var ( "https_proxy" ) )
347
- . or_else ( |_| env:: var ( "HTTP_PROXY" ) )
348
- . or_else ( |_| env:: var ( "http_proxy" ) ) ;
349
-
350
- #[ cfg( not( feature = "native-tls" ) ) ]
351
- let agent = {
352
- let mut builder = ureq:: builder ( ) ;
353
- if let Ok ( proxy) = http_proxy {
354
- let proxy = ureq:: Proxy :: new ( proxy) ?;
355
- builder = builder. proxy ( proxy) ;
356
- } ;
357
- builder. build ( )
358
- } ;
359
-
360
- #[ cfg( feature = "native-tls" ) ]
361
- let agent = {
362
- use std:: sync:: Arc ;
363
- let mut builder =
364
- ureq:: builder ( ) . tls_connector ( Arc :: new ( native_tls_crate:: TlsConnector :: new ( ) ?) ) ;
365
- if let Ok ( proxy) = http_proxy {
366
- let proxy = ureq:: Proxy :: new ( proxy) ?;
367
- builder = builder. proxy ( proxy) ;
368
- } ;
369
- builder. build ( )
370
- } ;
418
+ let agent = http_agent ( ) ?;
371
419
372
420
let response = agent
373
421
. post ( registry. url . as_str ( ) )
0 commit comments