reqrio 0.3.0-alpha2

A lightweight, high-performance, fingerprint-based HTTP request library.
Documentation
use std::ffi::CStr;
use std::os::raw::c_char;
use std::ptr::null_mut;
use reqtls::Url;
use crate::export::{check_run, handle_err1, handle_err2};
use crate::HlsError;

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Url_new(base_url: *const c_char, err: *mut *mut c_char) -> *mut Url {
    check_run(move || {
        let base_url = unsafe { CStr::from_ptr(base_url) }.to_str()?;
        Ok(Box::into_raw(Box::new(Url::try_from(base_url)?)))
    }, |e| handle_err1(e, err, null_mut()))
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Url_add_param(url: *mut Url, name: *const c_char, value: *const c_char) -> *mut c_char {
    check_run(move || {
        let url = unsafe { url.as_mut() }.ok_or(HlsError::NullPointer)?;
        let name = unsafe { CStr::from_ptr(name) }.to_str()?;
        let value = unsafe { CStr::from_ptr(value) }.to_str()?;
        url.uri_mut().insert_param(name, value);
        Ok(null_mut())
    }, handle_err2)
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Url_remove_param(url: *mut Url, name: *const c_char) -> *mut c_char {
    check_run(move || {
        let url = unsafe { url.as_mut() }.ok_or(HlsError::NullPointer)?;
        let name = unsafe { CStr::from_ptr(name) }.to_str()?;
        url.uri_mut().remove_param(name);
        Ok(null_mut())
    }, handle_err2)
}

#[unsafe(no_mangle)]
#[allow(non_snake_case)]
pub extern "C" fn Url_set_sni(url: *mut Url, sni: *const c_char) -> *mut c_char {
    check_run(move || {
        let url = unsafe { url.as_mut() }.ok_or(HlsError::NullPointer)?;
        let sni = unsafe { CStr::from_ptr(sni) }.to_str()?;
        url.set_domain(sni);
        Ok(null_mut())
    }, handle_err2)
}

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