feat(ffi): add hyper_request_set_uri_parts

Add a second FFI interface for setting the URI of a request with three
separate schema, authority, and path/query strings, rather than one URI
string.
This commit is contained in:
David Cook
2021-06-20 10:47:22 -05:00
committed by Sean McArthur
parent ea3e228287
commit a54689b921
2 changed files with 65 additions and 0 deletions

View File

@@ -430,6 +430,23 @@ enum hyper_code hyper_request_set_uri(struct hyper_request *req,
const uint8_t *uri,
size_t uri_len);
/*
Set the URI of the request with separate scheme, authority, and
path/query strings.
Each of `scheme`, `authority`, and `path_and_query` should either be
null, to skip providing a component, or point to a UTF-8 encoded
string. If any string pointer argument is non-null, its corresponding
`len` parameter must be set to the string's length.
*/
enum hyper_code hyper_request_set_uri_parts(struct hyper_request *req,
const uint8_t *scheme,
size_t scheme_len,
const uint8_t *authority,
size_t authority_len,
const uint8_t *path_and_query,
size_t path_and_query_len);
/*
Set the preferred HTTP version of the request.

View File

@@ -90,6 +90,54 @@ ffi_fn! {
}
}
ffi_fn! {
/// Set the URI of the request with separate scheme, authority, and
/// path/query strings.
///
/// Each of `scheme`, `authority`, and `path_and_query` should either be
/// null, to skip providing a component, or point to a UTF-8 encoded
/// string. If any string pointer argument is non-null, its corresponding
/// `len` parameter must be set to the string's length.
fn hyper_request_set_uri_parts(
req: *mut hyper_request,
scheme: *const u8,
scheme_len: size_t,
authority: *const u8,
authority_len: size_t,
path_and_query: *const u8,
path_and_query_len: size_t
) -> hyper_code {
let mut builder = Uri::builder();
if !scheme.is_null() {
let scheme_bytes = unsafe {
std::slice::from_raw_parts(scheme, scheme_len as usize)
};
builder = builder.scheme(scheme_bytes);
}
if !authority.is_null() {
let authority_bytes = unsafe {
std::slice::from_raw_parts(authority, authority_len as usize)
};
builder = builder.authority(authority_bytes);
}
if !path_and_query.is_null() {
let path_and_query_bytes = unsafe {
std::slice::from_raw_parts(path_and_query, path_and_query_len as usize)
};
builder = builder.path_and_query(path_and_query_bytes);
}
match builder.build() {
Ok(u) => {
*unsafe { &mut *req }.0.uri_mut() = u;
hyper_code::HYPERE_OK
},
Err(_) => {
hyper_code::HYPERE_INVALID_ARG
}
}
}
}
ffi_fn! {
/// Set the preferred HTTP version of the request.
///