@@ -379,8 +379,12 @@ pub struct Easy2<H> {
379379 inner : Box < Inner < H > > ,
380380}
381381
382+ /// A thin wrapper around a low-level Easy handle that performs
383+ /// cleanup when dropped.
384+ struct CURLPtr ( * mut curl_sys:: CURL ) ;
385+
382386struct Inner < H > {
383- handle : * mut curl_sys :: CURL ,
387+ handle : CURLPtr ,
384388 header_list : Option < List > ,
385389 resolve_list : Option < List > ,
386390 connect_to_list : Option < List > ,
@@ -590,7 +594,7 @@ impl<H: Handler> Easy2<H> {
590594 assert ! ( !handle. is_null( ) ) ;
591595 let mut ret = Easy2 {
592596 inner : Box :: new ( Inner {
593- handle,
597+ handle : CURLPtr ( handle ) ,
594598 header_list : None ,
595599 resolve_list : None ,
596600 connect_to_list : None ,
@@ -611,7 +615,7 @@ impl<H: Handler> Easy2<H> {
611615 /// cache, the dns cache, and cookies.
612616 pub fn reset ( & mut self ) {
613617 unsafe {
614- curl_sys:: curl_easy_reset ( self . inner . handle ) ;
618+ curl_sys:: curl_easy_reset ( self . inner . handle . as_ptr ( ) ) ;
615619 }
616620 self . default_configure ( ) ;
617621 }
@@ -838,6 +842,11 @@ impl<H> Easy2<H> {
838842 & mut self . inner . handler
839843 }
840844
845+ /// Consumes the Easy handle, returning the underlying handler.
846+ pub fn into_inner ( self ) -> H {
847+ self . inner . handler
848+ }
849+
841850 // =========================================================================
842851 // Error options
843852
@@ -3119,7 +3128,7 @@ impl<H> Easy2<H> {
31193128 unsafe {
31203129 let mut list = ptr:: null_mut ( ) ;
31213130 let rc = curl_sys:: curl_easy_getinfo (
3122- self . inner . handle ,
3131+ self . inner . handle . as_ptr ( ) ,
31233132 curl_sys:: CURLINFO_COOKIELIST ,
31243133 & mut list,
31253134 ) ;
@@ -3189,7 +3198,7 @@ impl<H> Easy2<H> {
31893198 /// call methods like `unpause_write` and `unpause_read` while a transfer is
31903199 /// in progress.
31913200 pub fn perform ( & self ) -> Result < ( ) , Error > {
3192- let ret = unsafe { self . cvt ( curl_sys:: curl_easy_perform ( self . inner . handle ) ) } ;
3201+ let ret = unsafe { self . cvt ( curl_sys:: curl_easy_perform ( self . inner . handle . as_ptr ( ) ) ) } ;
31933202 panic:: propagate ( ) ;
31943203 ret
31953204 }
@@ -3204,7 +3213,7 @@ impl<H> Easy2<H> {
32043213 /// called, an HTTP/2 PING frame is sent on the connection.
32053214 #[ cfg( feature = "upkeep_7_62_0" ) ]
32063215 pub fn upkeep ( & self ) -> Result < ( ) , Error > {
3207- let ret = unsafe { self . cvt ( curl_sys:: curl_easy_upkeep ( self . inner . handle ) ) } ;
3216+ let ret = unsafe { self . cvt ( curl_sys:: curl_easy_upkeep ( self . inner . handle . as_ptr ( ) ) ) } ;
32083217 panic:: propagate ( ) ;
32093218 return ret;
32103219 }
@@ -3225,7 +3234,10 @@ impl<H> Easy2<H> {
32253234 /// this function returns.
32263235 pub fn unpause_read ( & self ) -> Result < ( ) , Error > {
32273236 unsafe {
3228- let rc = curl_sys:: curl_easy_pause ( self . inner . handle , curl_sys:: CURLPAUSE_RECV_CONT ) ;
3237+ let rc = curl_sys:: curl_easy_pause (
3238+ self . inner . handle . as_ptr ( ) ,
3239+ curl_sys:: CURLPAUSE_RECV_CONT ,
3240+ ) ;
32293241 self . cvt ( rc)
32303242 }
32313243 }
@@ -3246,7 +3258,10 @@ impl<H> Easy2<H> {
32463258 /// paused.
32473259 pub fn unpause_write ( & self ) -> Result < ( ) , Error > {
32483260 unsafe {
3249- let rc = curl_sys:: curl_easy_pause ( self . inner . handle , curl_sys:: CURLPAUSE_SEND_CONT ) ;
3261+ let rc = curl_sys:: curl_easy_pause (
3262+ self . inner . handle . as_ptr ( ) ,
3263+ curl_sys:: CURLPAUSE_SEND_CONT ,
3264+ ) ;
32503265 self . cvt ( rc)
32513266 }
32523267 }
@@ -3258,7 +3273,7 @@ impl<H> Easy2<H> {
32583273 }
32593274 unsafe {
32603275 let p = curl_sys:: curl_easy_escape (
3261- self . inner . handle ,
3276+ self . inner . handle . as_ptr ( ) ,
32623277 s. as_ptr ( ) as * const _ ,
32633278 s. len ( ) as c_int ,
32643279 ) ;
@@ -3291,7 +3306,7 @@ impl<H> Easy2<H> {
32913306 unsafe {
32923307 let mut len = 0 ;
32933308 let p = curl_sys:: curl_easy_unescape (
3294- self . inner . handle ,
3309+ self . inner . handle . as_ptr ( ) ,
32953310 s. as_ptr ( ) as * const _ ,
32963311 orig_len as c_int ,
32973312 & mut len,
@@ -3340,7 +3355,7 @@ impl<H> Easy2<H> {
33403355 unsafe {
33413356 let mut n = 0 ;
33423357 let r = curl_sys:: curl_easy_recv (
3343- self . inner . handle ,
3358+ self . inner . handle . as_ptr ( ) ,
33443359 data. as_mut_ptr ( ) as * mut _ ,
33453360 data. len ( ) ,
33463361 & mut n,
@@ -3361,7 +3376,7 @@ impl<H> Easy2<H> {
33613376 unsafe {
33623377 let mut n = 0 ;
33633378 let rc = curl_sys:: curl_easy_send (
3364- self . inner . handle ,
3379+ self . inner . handle . as_ptr ( ) ,
33653380 data. as_ptr ( ) as * const _ ,
33663381 data. len ( ) ,
33673382 & mut n,
@@ -3373,7 +3388,7 @@ impl<H> Easy2<H> {
33733388
33743389 /// Get a pointer to the raw underlying CURL handle.
33753390 pub fn raw ( & self ) -> * mut curl_sys:: CURL {
3376- self . inner . handle
3391+ self . inner . handle . as_ptr ( )
33773392 }
33783393
33793394 #[ cfg( unix) ]
@@ -3392,15 +3407,27 @@ impl<H> Easy2<H> {
33923407 }
33933408
33943409 fn setopt_long ( & mut self , opt : curl_sys:: CURLoption , val : c_long ) -> Result < ( ) , Error > {
3395- unsafe { self . cvt ( curl_sys:: curl_easy_setopt ( self . inner . handle , opt, val) ) }
3410+ unsafe {
3411+ self . cvt ( curl_sys:: curl_easy_setopt (
3412+ self . inner . handle . as_ptr ( ) ,
3413+ opt,
3414+ val,
3415+ ) )
3416+ }
33963417 }
33973418
33983419 fn setopt_str ( & mut self , opt : curl_sys:: CURLoption , val : & CStr ) -> Result < ( ) , Error > {
33993420 self . setopt_ptr ( opt, val. as_ptr ( ) )
34003421 }
34013422
34023423 fn setopt_ptr ( & self , opt : curl_sys:: CURLoption , val : * const c_char ) -> Result < ( ) , Error > {
3403- unsafe { self . cvt ( curl_sys:: curl_easy_setopt ( self . inner . handle , opt, val) ) }
3424+ unsafe {
3425+ self . cvt ( curl_sys:: curl_easy_setopt (
3426+ self . inner . handle . as_ptr ( ) ,
3427+ opt,
3428+ val,
3429+ ) )
3430+ }
34043431 }
34053432
34063433 fn setopt_off_t (
@@ -3409,7 +3436,7 @@ impl<H> Easy2<H> {
34093436 val : curl_sys:: curl_off_t ,
34103437 ) -> Result < ( ) , Error > {
34113438 unsafe {
3412- let rc = curl_sys:: curl_easy_setopt ( self . inner . handle , opt, val) ;
3439+ let rc = curl_sys:: curl_easy_setopt ( self . inner . handle . as_ptr ( ) , opt, val) ;
34133440 self . cvt ( rc)
34143441 }
34153442 }
@@ -3421,7 +3448,13 @@ impl<H> Easy2<H> {
34213448 flags : curl_sys:: CURL_BLOB_COPY ,
34223449 } ;
34233450 let blob_ptr = & blob as * const curl_sys:: curl_blob ;
3424- unsafe { self . cvt ( curl_sys:: curl_easy_setopt ( self . inner . handle , opt, blob_ptr) ) }
3451+ unsafe {
3452+ self . cvt ( curl_sys:: curl_easy_setopt (
3453+ self . inner . handle . as_ptr ( ) ,
3454+ opt,
3455+ blob_ptr,
3456+ ) )
3457+ }
34253458 }
34263459
34273460 fn getopt_bytes ( & self , opt : curl_sys:: CURLINFO ) -> Result < Option < & [ u8 ] > , Error > {
@@ -3438,7 +3471,7 @@ impl<H> Easy2<H> {
34383471 fn getopt_ptr ( & self , opt : curl_sys:: CURLINFO ) -> Result < * const c_char , Error > {
34393472 unsafe {
34403473 let mut p = ptr:: null ( ) ;
3441- let rc = curl_sys:: curl_easy_getinfo ( self . inner . handle , opt, & mut p) ;
3474+ let rc = curl_sys:: curl_easy_getinfo ( self . inner . handle . as_ptr ( ) , opt, & mut p) ;
34423475 self . cvt ( rc) ?;
34433476 Ok ( p)
34443477 }
@@ -3458,7 +3491,7 @@ impl<H> Easy2<H> {
34583491 fn getopt_long ( & self , opt : curl_sys:: CURLINFO ) -> Result < c_long , Error > {
34593492 unsafe {
34603493 let mut p = 0 ;
3461- let rc = curl_sys:: curl_easy_getinfo ( self . inner . handle , opt, & mut p) ;
3494+ let rc = curl_sys:: curl_easy_getinfo ( self . inner . handle . as_ptr ( ) , opt, & mut p) ;
34623495 self . cvt ( rc) ?;
34633496 Ok ( p)
34643497 }
@@ -3467,7 +3500,7 @@ impl<H> Easy2<H> {
34673500 fn getopt_double ( & self , opt : curl_sys:: CURLINFO ) -> Result < c_double , Error > {
34683501 unsafe {
34693502 let mut p = 0 as c_double ;
3470- let rc = curl_sys:: curl_easy_getinfo ( self . inner . handle , opt, & mut p) ;
3503+ let rc = curl_sys:: curl_easy_getinfo ( self . inner . handle . as_ptr ( ) , opt, & mut p) ;
34713504 self . cvt ( rc) ?;
34723505 Ok ( p)
34733506 }
@@ -3513,20 +3546,12 @@ impl<H> Easy2<H> {
35133546impl < H : fmt:: Debug > fmt:: Debug for Easy2 < H > {
35143547 fn fmt ( & self , f : & mut fmt:: Formatter ) -> fmt:: Result {
35153548 f. debug_struct ( "Easy" )
3516- . field ( "handle" , & self . inner . handle )
3549+ . field ( "handle" , & self . inner . handle . as_ptr ( ) )
35173550 . field ( "handler" , & self . inner . handler )
35183551 . finish ( )
35193552 }
35203553}
35213554
3522- impl < H > Drop for Easy2 < H > {
3523- fn drop ( & mut self ) {
3524- unsafe {
3525- curl_sys:: curl_easy_cleanup ( self . inner . handle ) ;
3526- }
3527- }
3528- }
3529-
35303555extern "C" fn header_cb < H : Handler > (
35313556 buffer : * mut c_char ,
35323557 size : size_t ,
@@ -3698,6 +3723,20 @@ fn double_seconds_to_duration_sub_second2() {
36983723 assert_eq ! ( dur. subsec_nanos( ) , 500_000_000 ) ;
36993724}
37003725
3726+ impl CURLPtr {
3727+ fn as_ptr ( & self ) -> * mut curl_sys:: CURL {
3728+ self . 0
3729+ }
3730+ }
3731+
3732+ impl Drop for CURLPtr {
3733+ fn drop ( & mut self ) {
3734+ unsafe {
3735+ curl_sys:: curl_easy_cleanup ( self . 0 ) ;
3736+ }
3737+ }
3738+ }
3739+
37013740impl Auth {
37023741 /// Creates a new set of authentications with no members.
37033742 ///
0 commit comments