1use crate::error::RuntimeError;
4use codec::{Decode, Encode};
5use std::collections::BTreeMap;
6
7#[derive(Debug, Clone, Copy, Eq, PartialEq, Encode, Decode)]
8pub enum HttpMethod {
9 Options,
10 Get,
11 Post,
12 Put,
13 Delete,
14 Head,
15 Trace,
16 Connect,
17 Patch,
18}
19
20#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode)]
21pub struct RequestHead {
22 pub method: HttpMethod,
23 pub uri: String,
24 pub headers: BTreeMap<String, String>,
25}
26
27#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode)]
28pub struct HttpRequest {
29 pub head: RequestHead,
30 pub body: Vec<u8>,
31}
32
33#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode)]
34pub struct ResponseHead {
35 pub status: u16,
36 pub headers: BTreeMap<String, String>,
37}
38
39#[derive(Debug, Clone, Eq, PartialEq, Encode, Decode)]
40pub struct HttpResponse {
41 pub head: ResponseHead,
42 pub body: Vec<u8>,
43}
44
45#[link(wasm_import_module = "env")]
46extern "C" {
47 fn http_request(req_ptr: *const u8, req_len: u32, return_ptr: *mut u8) -> i32;
48}
49
50pub fn request(request: HttpRequest) -> Result<u64, RuntimeError> {
85 let bytes = request.encode();
86 let mut return_bytes = crate::allocate_buffer();
87 let status = unsafe {
88 http_request(
89 bytes.as_ptr(),
90 bytes.len() as u32,
91 return_bytes.as_mut_ptr(),
92 )
93 };
94 assert!(status == crate::NO_MORE_DATA);
95 Result::<u64, RuntimeError>::decode(&mut &return_bytes[..])
96 .map_err(|_| RuntimeError::DecodeReturnValueError)?
97}