Skip to content

Commit

Permalink
feat: support http_headers host function (#64)
Browse files Browse the repository at this point in the history
* feat: support http_headers host function

* cleanup: free http_headers memory, add example
  • Loading branch information
zshipko authored Oct 15, 2024
1 parent c3d9ce3 commit 77041c3
Show file tree
Hide file tree
Showing 6 changed files with 42 additions and 1 deletion.
4 changes: 3 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,9 @@ plugins:
mkdir -p test
cargo build --release --example count_vowels
cargo build --release --example http
cargo build --release --example http_headers
cargo build --release --example host_function
cp target/wasm32-unknown-unknown/release/examples/count_vowels.wasm test/code.wasm
cp target/wasm32-unknown-unknown/release/examples/http.wasm test/http.wasm
cp target/wasm32-unknown-unknown/release/examples/host_function.wasm test/host_function.wasm
cp target/wasm32-unknown-unknown/release/examples/http_headers.wasm test/http_headers.wasm
cp target/wasm32-unknown-unknown/release/examples/host_function.wasm test/host_function.wasm
12 changes: 12 additions & 0 deletions examples/http_headers.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
#![no_main]

use std::collections::HashMap;

use extism_pdk::*;

#[plugin_fn]
pub fn http_get(Json(req): Json<HttpRequest>) -> FnResult<Json<HashMap<String, String>>> {
info!("Request to: {}", req.url);
let res = http::request::<()>(&req, None)?;
Ok(Json(res.headers().clone()))
}
1 change: 1 addition & 0 deletions src/extism.rs
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ extern "C" {
pub fn var_set(offs: u64, offs1: u64);
pub fn http_request(req: u64, body: u64) -> u64;
pub fn http_status_code() -> i32;
pub fn http_headers() -> u64;
pub fn log_info(offs: u64);
pub fn log_debug(offs: u64);
pub fn log_warn(offs: u64);
Expand Down
26 changes: 26 additions & 0 deletions src/http.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
use std::collections::HashMap;

use crate::*;

/// A HttpResponse is used to wrap the memory returned by
/// `extism_pdk::http::request`
pub struct HttpResponse {
memory: Memory,
status: u16,
headers: HashMap<String, String>,
}

impl HttpResponse {
Expand All @@ -28,6 +31,14 @@ impl HttpResponse {
let x = serde_json::from_slice(&self.body())?;
Ok(x)
}

pub fn headers(&self) -> &HashMap<String, String> {
&self.headers
}

pub fn header(&self, s: impl AsRef<str>) -> Option<&str> {
self.headers.get(s.as_ref()).map(|x| x.as_ref())
}
}

/// Execute `HttpRequest`, if `body` is not `None` then it will be sent as the
Expand All @@ -46,11 +57,26 @@ pub fn request<T: ToMemory>(
let offs = unsafe { extism::http_request(req.offset(), data) };
let status = unsafe { extism::http_status_code() };
let len = unsafe { extism::length_unsafe(offs) };

let headers = unsafe { extism::http_headers() };
let headers = if headers == 0 {
HashMap::new()
} else {
if let Some(h) = Memory::find(headers) {
let Json(j) = h.to()?;
h.free();
j
} else {
HashMap::new()
}
};

Ok(HttpResponse {
memory: Memory(MemoryHandle {
offset: offs,
length: len,
}),
status: status as u16,
headers,
})
}
Binary file modified test/http.wasm
Binary file not shown.
Binary file added test/http_headers.wasm
Binary file not shown.

0 comments on commit 77041c3

Please sign in to comment.