From e4a868078ab43772e36cd8ffc59fd995353fb402 Mon Sep 17 00:00:00 2001 From: Andrew Clayton Date: Mon, 25 Sep 2023 13:19:31 +0100 Subject: examples: Add C and Rust examples of handling large uploads The programs demonstrate handling requests with payloads larger than 4GiB which means they need to be written out to disk and so also demonstrates the use of the file-system access mechanism. Signed-off-by: Andrew Clayton --- examples/rust/large-upload/Cargo.toml | 12 +++++++ examples/rust/large-upload/src/lib.rs | 65 +++++++++++++++++++++++++++++++++++ 2 files changed, 77 insertions(+) create mode 100644 examples/rust/large-upload/Cargo.toml create mode 100644 examples/rust/large-upload/src/lib.rs (limited to 'examples/rust/large-upload') diff --git a/examples/rust/large-upload/Cargo.toml b/examples/rust/large-upload/Cargo.toml new file mode 100644 index 0000000..b74192e --- /dev/null +++ b/examples/rust/large-upload/Cargo.toml @@ -0,0 +1,12 @@ +[package] +name = "rust-large-upload" +version = "0.2.0" +edition = "2021" + +# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html + +[dependencies] +unit-wasm = { path = "../../../src/rust", version = "0.2.0" } + +[lib] +crate-type = ["cdylib"] diff --git a/examples/rust/large-upload/src/lib.rs b/examples/rust/large-upload/src/lib.rs new file mode 100644 index 0000000..a59bdb3 --- /dev/null +++ b/examples/rust/large-upload/src/lib.rs @@ -0,0 +1,65 @@ +/* SPDX-License-Identifier: Apache-2.0 */ + +/* + * Copyright (C) Andrew Clayton + * Copyright (C) Timo Stark + * Copyright (C) F5, Inc. + */ + +use unit_wasm::rusty::*; + +use std::fs::File; +use std::ptr::null_mut; + +static mut CTX: luw_ctx_t = UWR_CTX_INITIALIZER(); +static mut REQUEST_BUF: *mut u8 = null_mut(); +static mut TOTAL_BYTES_WROTE: u64 = 0; + +#[no_mangle] +pub extern "C" fn uwr_module_end_handler() { + unsafe { uwr_free(REQUEST_BUF); } +} + +#[no_mangle] +pub extern "C" fn uwr_module_init_handler() { + unsafe { REQUEST_BUF = uwr_malloc(uwr_mem_get_init_size()); } +} + +#[no_mangle] +pub extern "C" fn uwr_response_end_handler() { + unsafe { TOTAL_BYTES_WROTE = 0; } +} + +#[no_mangle] +pub extern "C" fn uwr_request_handler(addr: *mut u8) -> i32 { + let ctx: *mut luw_ctx_t = unsafe { &mut CTX }; + let mut f; + let bytes_wrote: isize; + let mut total = unsafe { TOTAL_BYTES_WROTE }; + + if total == 0 { + uwr_init_ctx(ctx, addr, 0); + uwr_set_req_buf(ctx, unsafe { &mut REQUEST_BUF }, LUW_SRB_NONE); + + f = File::create("/var/tmp/large-file.dat").unwrap(); + } else { + f = File::options() + .append(true) + .open("/var/tmp/large-file.dat") + .unwrap(); + } + + bytes_wrote = uwr_mem_splice_file(addr, &mut f); + if bytes_wrote == -1 { + return -1; + } + + total += bytes_wrote as u64; + if total == uwr_get_http_content_len(ctx) { + uwr_http_response_end(); + } else { + unsafe { TOTAL_BYTES_WROTE = total }; + } + + return 0; +} -- cgit