refactor(http): rename HTTP client files and update struct names for consistency
Signed-off-by: Deluan <deluan@navidrome.org>
This commit is contained in:
@@ -6,3 +6,10 @@ require (
|
|||||||
github.com/extism/go-pdk v1.1.3
|
github.com/extism/go-pdk v1.1.3
|
||||||
github.com/stretchr/testify v1.11.1
|
github.com/stretchr/testify v1.11.1
|
||||||
)
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
github.com/stretchr/objx v0.5.2 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import (
|
|||||||
"github.com/navidrome/navidrome/plugins/pdk/go/pdk"
|
"github.com/navidrome/navidrome/plugins/pdk/go/pdk"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
// HTTPRequest represents the HTTPRequest data structure.
|
||||||
// HTTPRequest represents an outbound HTTP request from a plugin.
|
// HTTPRequest represents an outbound HTTP request from a plugin.
|
||||||
type HTTPRequest struct {
|
type HTTPRequest struct {
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
@@ -23,6 +24,7 @@ type HTTPRequest struct {
|
|||||||
TimeoutMs int32 `json:"timeoutMs"`
|
TimeoutMs int32 `json:"timeoutMs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HTTPResponse represents the HTTPResponse data structure.
|
||||||
// HTTPResponse represents the response from an outbound HTTP request.
|
// HTTPResponse represents the response from an outbound HTTP request.
|
||||||
type HTTPResponse struct {
|
type HTTPResponse struct {
|
||||||
StatusCode int32 `json:"statusCode"`
|
StatusCode int32 `json:"statusCode"`
|
||||||
@@ -35,11 +37,11 @@ type HTTPResponse struct {
|
|||||||
//go:wasmimport extism:host/user http_send
|
//go:wasmimport extism:host/user http_send
|
||||||
func http_send(uint64) uint64
|
func http_send(uint64) uint64
|
||||||
|
|
||||||
type httpSendRequest struct {
|
type hTTPSendRequest struct {
|
||||||
Request HTTPRequest `json:"request"`
|
Request HTTPRequest `json:"request"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type httpSendResponse struct {
|
type hTTPSendResponse struct {
|
||||||
Result *HTTPResponse `json:"result,omitempty"`
|
Result *HTTPResponse `json:"result,omitempty"`
|
||||||
Error string `json:"error,omitempty"`
|
Error string `json:"error,omitempty"`
|
||||||
}
|
}
|
||||||
@@ -55,7 +57,7 @@ type httpSendResponse struct {
|
|||||||
// Successful HTTP calls (including 4xx/5xx status codes) return a non-nil response with nil error.
|
// Successful HTTP calls (including 4xx/5xx status codes) return a non-nil response with nil error.
|
||||||
func HTTPSend(request HTTPRequest) (*HTTPResponse, error) {
|
func HTTPSend(request HTTPRequest) (*HTTPResponse, error) {
|
||||||
// Marshal request to JSON
|
// Marshal request to JSON
|
||||||
req := httpSendRequest{
|
req := hTTPSendRequest{
|
||||||
Request: request,
|
Request: request,
|
||||||
}
|
}
|
||||||
reqBytes, err := json.Marshal(req)
|
reqBytes, err := json.Marshal(req)
|
||||||
@@ -73,7 +75,7 @@ func HTTPSend(request HTTPRequest) (*HTTPResponse, error) {
|
|||||||
responseBytes := responseMem.ReadBytes()
|
responseBytes := responseMem.ReadBytes()
|
||||||
|
|
||||||
// Parse the response
|
// Parse the response
|
||||||
var response httpSendResponse
|
var response hTTPSendResponse
|
||||||
if err := json.Unmarshal(responseBytes, &response); err != nil {
|
if err := json.Unmarshal(responseBytes, &response); err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
+2
@@ -10,6 +10,7 @@ package host
|
|||||||
|
|
||||||
import "github.com/stretchr/testify/mock"
|
import "github.com/stretchr/testify/mock"
|
||||||
|
|
||||||
|
// HTTPRequest represents the HTTPRequest data structure.
|
||||||
// HTTPRequest represents an outbound HTTP request from a plugin.
|
// HTTPRequest represents an outbound HTTP request from a plugin.
|
||||||
type HTTPRequest struct {
|
type HTTPRequest struct {
|
||||||
Method string `json:"method"`
|
Method string `json:"method"`
|
||||||
@@ -19,6 +20,7 @@ type HTTPRequest struct {
|
|||||||
TimeoutMs int32 `json:"timeoutMs"`
|
TimeoutMs int32 `json:"timeoutMs"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// HTTPResponse represents the HTTPResponse data structure.
|
||||||
// HTTPResponse represents the response from an outbound HTTP request.
|
// HTTPResponse represents the response from an outbound HTTP request.
|
||||||
type HTTPResponse struct {
|
type HTTPResponse struct {
|
||||||
StatusCode int32 `json:"statusCode"`
|
StatusCode int32 `json:"statusCode"`
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# 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-py.
|
||||||
|
#
|
||||||
|
# IMPORTANT: Due to a limitation in extism-py, you cannot import this file directly.
|
||||||
|
# The @extism.import_fn decorators are only detected when defined in the plugin's
|
||||||
|
# main __init__.py file. Copy the needed functions from this file into your plugin.
|
||||||
|
|
||||||
|
from dataclasses import dataclass
|
||||||
|
from typing import Any
|
||||||
|
|
||||||
|
import extism
|
||||||
|
import json
|
||||||
|
|
||||||
|
|
||||||
|
class HostFunctionError(Exception):
|
||||||
|
"""Raised when a host function returns an error."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
||||||
|
@extism.import_fn("extism:host/user", "http_send")
|
||||||
|
def _http_send(offset: int) -> int:
|
||||||
|
"""Raw host function - do not call directly."""
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def http_send(request: Any) -> Any:
|
||||||
|
"""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.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
request: Any parameter.
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
Any: The result value.
|
||||||
|
|
||||||
|
Raises:
|
||||||
|
HostFunctionError: If the host function returns an error.
|
||||||
|
"""
|
||||||
|
request = {
|
||||||
|
"request": request,
|
||||||
|
}
|
||||||
|
request_bytes = json.dumps(request).encode("utf-8")
|
||||||
|
request_mem = extism.memory.alloc(request_bytes)
|
||||||
|
response_offset = _http_send(request_mem.offset)
|
||||||
|
response_mem = extism.memory.find(response_offset)
|
||||||
|
response = json.loads(extism.memory.string(response_mem))
|
||||||
|
|
||||||
|
if response.get("error"):
|
||||||
|
raise HostFunctionError(response["error"])
|
||||||
|
|
||||||
|
return response.get("result", None)
|
||||||
@@ -9,7 +9,7 @@ use serde::{Deserialize, Serialize};
|
|||||||
/// HTTPRequest represents an outbound HTTP request from a plugin.
|
/// HTTPRequest represents an outbound HTTP request from a plugin.
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct HttpRequest {
|
pub struct HTTPRequest {
|
||||||
pub method: String,
|
pub method: String,
|
||||||
pub url: String,
|
pub url: String,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
@@ -23,7 +23,7 @@ pub struct HttpRequest {
|
|||||||
/// HTTPResponse represents the response from an outbound HTTP request.
|
/// HTTPResponse represents the response from an outbound HTTP request.
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct HttpResponse {
|
pub struct HTTPResponse {
|
||||||
pub status_code: i32,
|
pub status_code: i32,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
pub headers: std::collections::HashMap<String, String>,
|
pub headers: std::collections::HashMap<String, String>,
|
||||||
@@ -34,14 +34,14 @@ pub struct HttpResponse {
|
|||||||
#[derive(Debug, Clone, Serialize)]
|
#[derive(Debug, Clone, Serialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct HTTPSendRequest {
|
struct HTTPSendRequest {
|
||||||
request: HttpRequest,
|
request: HTTPRequest,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, Deserialize)]
|
#[derive(Debug, Clone, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
struct HTTPSendResponse {
|
struct HTTPSendResponse {
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
result: Option<HttpResponse>,
|
result: Option<HTTPResponse>,
|
||||||
#[serde(default)]
|
#[serde(default)]
|
||||||
error: Option<String>,
|
error: Option<String>,
|
||||||
}
|
}
|
||||||
@@ -52,23 +52,23 @@ extern "ExtismHost" {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Send executes an HTTP request and returns the response.
|
/// Send executes an HTTP request and returns the response.
|
||||||
///
|
///
|
||||||
/// Parameters:
|
/// Parameters:
|
||||||
/// - request: The HTTP request to execute, including method, URL, headers, body, and timeout
|
/// - request: The HTTP request to execute, including method, URL, headers, body, and timeout
|
||||||
///
|
///
|
||||||
/// Returns the HTTP response with status code, headers, and body.
|
/// Returns the HTTP response with status code, headers, and body.
|
||||||
/// Network errors, timeouts, and permission failures are returned as errors.
|
/// 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.
|
/// Successful HTTP calls (including 4xx/5xx status codes) return a non-nil response with nil error.
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
/// * `request` - HttpRequest parameter.
|
/// * `request` - HTTPRequest parameter.
|
||||||
///
|
///
|
||||||
/// # Returns
|
/// # Returns
|
||||||
/// The result value.
|
/// The result value.
|
||||||
///
|
///
|
||||||
/// # Errors
|
/// # Errors
|
||||||
/// Returns an error if the host function call fails.
|
/// Returns an error if the host function call fails.
|
||||||
pub fn send(request: HttpRequest) -> Result<Option<HttpResponse>, Error> {
|
pub fn send(request: HTTPRequest) -> Result<Option<HTTPResponse>, Error> {
|
||||||
let response = unsafe {
|
let response = unsafe {
|
||||||
http_send(Json(HTTPSendRequest {
|
http_send(Json(HTTPSendRequest {
|
||||||
request: request,
|
request: request,
|
||||||
|
|||||||
Reference in New Issue
Block a user