Allow plugins to opt out of automatic redirect following on a per-request basis. When set to true, the response returns the redirect status code and Location header directly instead of following to the final destination.
110 lines
3.1 KiB
Rust
110 lines
3.1 KiB
Rust
// Code generated by ndpgen. DO NOT EDIT.
|
|
//
|
|
// This file contains client wrappers for the HTTP host service.
|
|
// It is intended for use in Navidrome plugins built with extism-pdk.
|
|
|
|
use extism_pdk::*;
|
|
use serde::{Deserialize, Serialize};
|
|
use base64::Engine as _;
|
|
use base64::engine::general_purpose::STANDARD as BASE64;
|
|
|
|
mod base64_bytes {
|
|
use serde::{self, Deserialize, Deserializer, Serializer};
|
|
use base64::Engine as _;
|
|
use base64::engine::general_purpose::STANDARD as BASE64;
|
|
|
|
pub fn serialize<S>(bytes: &Vec<u8>, serializer: S) -> Result<S::Ok, S::Error>
|
|
where
|
|
S: Serializer,
|
|
{
|
|
serializer.serialize_str(&BASE64.encode(bytes))
|
|
}
|
|
|
|
pub fn deserialize<'de, D>(deserializer: D) -> Result<Vec<u8>, D::Error>
|
|
where
|
|
D: Deserializer<'de>,
|
|
{
|
|
let s = String::deserialize(deserializer)?;
|
|
BASE64.decode(&s).map_err(serde::de::Error::custom)
|
|
}
|
|
}
|
|
|
|
/// HTTPRequest represents an outbound HTTP request from a plugin.
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct HTTPRequest {
|
|
pub method: String,
|
|
pub url: String,
|
|
#[serde(default)]
|
|
pub headers: std::collections::HashMap<String, String>,
|
|
#[serde(default)]
|
|
pub no_follow_redirects: bool,
|
|
#[serde(default)]
|
|
#[serde(with = "base64_bytes")]
|
|
pub body: Vec<u8>,
|
|
#[serde(default)]
|
|
pub timeout_ms: i32,
|
|
}
|
|
|
|
/// HTTPResponse represents the response from an outbound HTTP request.
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
pub struct HTTPResponse {
|
|
pub status_code: i32,
|
|
#[serde(default)]
|
|
pub headers: std::collections::HashMap<String, String>,
|
|
#[serde(default)]
|
|
#[serde(with = "base64_bytes")]
|
|
pub body: Vec<u8>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
struct HTTPSendRequest {
|
|
request: HTTPRequest,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Deserialize)]
|
|
#[serde(rename_all = "camelCase")]
|
|
struct HTTPSendResponse {
|
|
#[serde(default)]
|
|
result: Option<HTTPResponse>,
|
|
#[serde(default)]
|
|
error: Option<String>,
|
|
}
|
|
|
|
#[host_fn]
|
|
extern "ExtismHost" {
|
|
fn http_send(input: Json<HTTPSendRequest>) -> Json<HTTPSendResponse>;
|
|
}
|
|
|
|
/// Send executes an HTTP request and returns the response.
|
|
///
|
|
/// Parameters:
|
|
/// - request: The HTTP request to execute, including method, URL, headers, body, and timeout
|
|
///
|
|
/// Returns the HTTP response with status code, headers, and body.
|
|
/// Network errors, timeouts, and permission failures are returned as Go errors.
|
|
/// Successful HTTP calls (including 4xx/5xx status codes) return a non-nil response with nil error.
|
|
///
|
|
/// # Arguments
|
|
/// * `request` - HTTPRequest parameter.
|
|
///
|
|
/// # Returns
|
|
/// The result value.
|
|
///
|
|
/// # Errors
|
|
/// Returns an error if the host function call fails.
|
|
pub fn send(request: HTTPRequest) -> Result<Option<HTTPResponse>, Error> {
|
|
let response = unsafe {
|
|
http_send(Json(HTTPSendRequest {
|
|
request: request,
|
|
}))?
|
|
};
|
|
|
|
if let Some(err) = response.0.error {
|
|
return Err(Error::msg(err));
|
|
}
|
|
|
|
Ok(response.0.result)
|
|
}
|