reqrio 0.3.0-alpha1

A lightweight, high-performance, fingerprint-based HTTP request library.
Documentation
use crate::export::{check_run, handle_err1, CONVERT_ERROR};
use crate::{json, HlsError, Response};
use std::ffi::{CStr, CString};
use std::os::raw::c_char;
use std::ptr::{null, null_mut};

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Response_status_code(resp: *const Response, err: *mut *mut c_char) -> u16 {
    check_run(move || {
        let resp = unsafe { resp.as_ref() }.ok_or(HlsError::NullPointer)?;
        Ok(resp.header().status().code())
    }, |e| handle_err1(e, err, 0))
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Response_bytes(resp: *mut Response, len: &mut usize, err: *mut *mut c_char) -> *const u8 {
    check_run(move || {
        let resp = unsafe { resp.as_mut() }.ok_or(HlsError::NullPointer)?;
        let res = resp.decode_body()?.as_bytes()?;
        *len = res.len();
        Ok(res.as_ptr())
    }, |e| handle_err1(e, err, null()))
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Response_get_header(resp: *const Response, name: *const c_char, err: *mut *mut c_char) -> *mut c_char {
    check_run(move || {
        let resp = unsafe { resp.as_ref() }.ok_or(HlsError::NullPointer)?;
        let name = unsafe { CStr::from_ptr(name) }.to_str()?;
        let value = resp.header().get(name).ok_or(format!("not found header by key `{}`", name))?;
        let res = CString::new(value.to_string()).unwrap_or_else(|_| CONVERT_ERROR.clone());
        Ok(res.into_raw())
    }, |e| handle_err1(e, err, null_mut()))
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Response_cookies(resp: *const Response, err: *mut *mut c_char) -> *mut c_char {
    check_run(move || {
        let resp = unsafe { resp.as_ref() }.ok_or(HlsError::NullPointer)?;
        let mut res = json::array![];
        if let Some(cookies) = resp.header().cookies() {
            for cookie in cookies {
                res.push(cookie)
            }
        }
        match CString::new(res.dump()) {
            Ok(res) => Ok(res.into_raw()),
            Err(_) => Ok(CONVERT_ERROR.clone().into_raw())
        }
    }, |e| handle_err1(e, err, null_mut()))
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Response_drop(resp: *mut Response) {
    if resp.is_null() { return; }
    let resp = unsafe { Box::from_raw(resp) };
    drop(resp);
}