Skip to content

Commit 1e7c0b1

Browse files
committed
Add function into_inner to Easy and Easy2 (#586)
1 parent e6f7be6 commit 1e7c0b1

File tree

2 files changed

+73
-29
lines changed

2 files changed

+73
-29
lines changed

src/easy/handler.rs

Lines changed: 68 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -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+
382386
struct 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> {
35133546
impl<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-
35303555
extern "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+
37013740
impl Auth {
37023741
/// Creates a new set of authentications with no members.
37033742
///

src/multi.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -982,6 +982,11 @@ impl<H> Easy2Handle<H> {
982982
self.easy.get_mut()
983983
}
984984

985+
/// Consumes the Easy2 handle, returning the underlying handler.
986+
pub fn into_inner(self) -> H {
987+
self.easy.into_inner()
988+
}
989+
985990
/// Same as `EasyHandle::set_token`
986991
pub fn set_token(&mut self, token: usize) -> Result<(), Error> {
987992
unsafe {

0 commit comments

Comments
 (0)