api-client/packages/hoppscotch-desktop/plugin-workspace/relay
Shreyas 137e95e873
fix(relay): expand MIME type support (#5306)
This fixes file uploads incorrectly showing MIME type as "Other" instead
 of their actual content types by expanding the `MediaType` enum relay
 to include common audio, video, and image formats.

 Basically `MediaType` enum is used for both `ContentType` which would
 map to `ContentType` from `hoppscotch-data` (e.g. `multipart/form-data`)
 but also to `FormValue` in `interop`
 ```rust
 pub enum FormValue {
     ...
     File {
         filename: String,
         content_type: MediaType,
         data: Bytes,
     },
 }
 ```
 although the later should be much more pervasive.

 This is a follow up on #5244

 Closes FE-887
 Closes #3810
 Closes #5223
 Closes #5233

 The issue occurred because the `relay`'s `MediaType` couldn't deserialize
 beyond the basic types (text, JSON, XML, etc.), lacked support for
 other media file types. The TypeScript layer correctly detected MIME
 types (e.g., "audio/x-m4a"), but the deserialization process fell back
 to `MediaType::Other`. Main reason for servers performing strict MIME
 validation to reject uploads.
2025-08-08 13:51:46 +05:30
..
src fix(relay): expand MIME type support (#5306) 2025-08-08 13:51:46 +05:30
.envrc feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30
.gitignore feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30
Cargo.lock fix(kernel): deterministic form data processing (#4945) 2025-04-08 14:50:04 +05:30
Cargo.toml fix(kernel): deterministic form data processing (#4945) 2025-04-08 14:50:04 +05:30
devenv.lock feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30
devenv.nix feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30
devenv.yaml feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30
LICENSE.md feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30
README.md feat: platform independent core and the new desktop app (#4684) 2025-02-28 00:01:25 +05:30

Relay

A HTTP request-response relay used by Hoppscotch Desktop and Hoppscotch Agent for more advanced request handling including custom headers, certificates, proxies, and local system integration.

Important

This crate is only available via GitHub and not published on crates.io right now.

GitHub License MIT Rust

Installation

Add to your Cargo.toml:

[dependencies]
relay = { git = "https://github.com/CuriousCorrelation/relay.git" }

Features

  • 🦀 Blazingly fast!
  • HTTP client built on libcurl
  • HTTP/1.1, HTTP/2.0, HTTP/3.0 support
  • Security with SSL/TLS certificate management
  • Proxy support with authentication
  • Multiple authentication methods (Basic, Bearer, Digest)
  • Content handling (JSON, Form Data, Binary)
  • Custom security configurations
  • Async request execution with cancellation support

Usage

use relay::{Request, Response, execute};

let request = Request {
    id: 1,
    url: "https://api.example.com".to_string(),
    method: Method::Get,
    version: Version::Http2,
    // ... configure other options
};

let response = execute(request).await?;

Note

All requests are executed asynchronously and can be cancelled using the cancel(request_id) function.

Security Features

Tip

You can configure certificate validation, host verification, and custom certificates:

let security_config = SecurityConfig {
    validate_certificates: Some(true),
    verify_host: Some(true),
    certificates: Some(CertificateConfig {
        client: Some(CertificateType::Pem { 
            cert: cert_data,
            key: key_data 
        }),
        ca: Some(vec![ca_cert_data])
    })
};

Error Handling

The crate uses a custom error type RelayError that provides information about failures:

#[derive(Error)]
pub enum RelayError {
    Network { message: String, cause: Option<String> },
    Certificate { message: String, cause: Option<String> },
    Parse { message: String, cause: Option<String> },
    // ... other variants
}

Requirements

  • Rust 1.77.2 or later
  • OpenSSL development libraries
  • libcurl with SSL and HTTP/2.0 support

Warning

This crate uses custom forks of some dependencies for NTLM support and consistent OpenSSL backend across platforms.

License

Code: (c) 2024 - CuriousCorrelation

MIT or MIT/Apache 2.0 where applicable.