| Crates.io | saffron-http |
| lib.rs | saffron-http |
| version | 0.1.1 |
| created_at | 2025-12-08 19:15:09.38861+00 |
| updated_at | 2025-12-08 21:05:19.648994+00 |
| description | HTTP client implementation for Saffron |
| homepage | |
| repository | https://github.com/Vitorhenriquesilvadesa/Saffron |
| max_upload_size | |
| id | 1974239 |
| size | 56,439 |
HTTP client implementation for the Saffron project. Provides a robust, feature-rich HTTP client built on top of ureq with advanced capabilities for API testing and automation.
โ Full HTTP Methods Support
โ Multiple Body Types
โ Advanced Configuration
โ Rich Error Handling
โ Helper Functions
use saffron_http::HttpClient;
let client = HttpClient::new();
let response = client.get("https://api.example.com/users")?;
println!("Status: {}", response.status);
println!("Body: {}", response.body_as_string()?);
use saffron_core::domain::request::HttpRequest;
use saffron_http::HttpClient;
let request = HttpRequest::post("https://api.example.com/users")
.with_json_body(r#"{"name": "Alice", "email": "alice@example.com"}"#)
.with_header("Authorization", "Bearer token123");
let client = HttpClient::new();
let response = client.send(&request)?;
use saffron_http::{HttpClient, HttpClientConfig};
let config = HttpClientConfig {
timeout_seconds: 60,
follow_redirects: true,
max_redirects: 10,
user_agent: Some("MyApp/1.0".to_string()),
accept_invalid_certs: false,
max_response_size: Some(50 * 1024 * 1024), // 50MB
};
let client = HttpClient::with_config(config);
use saffron_core::domain::request::{FormDataPart, FormDataContent, HttpRequest, RequestBody};
use saffron_http::HttpClient;
let file_data = std::fs::read("photo.jpg")?;
let part = FormDataPart {
name: "photo".to_string(),
content: FormDataContent::File {
filename: "photo.jpg".to_string(),
data: file_data,
content_type: Some("image/jpeg".to_string()),
},
};
let request = HttpRequest::post("https://api.example.com/upload")
.with_body(RequestBody::FormData(vec![part]));
let client = HttpClient::new();
let response = client.send(&request)?;
use std::collections::HashMap;
use saffron_core::domain::request::{HttpRequest, RequestBody};
use saffron_http::HttpClient;
let mut form = HashMap::new();
form.insert("username".to_string(), "alice".to_string());
form.insert("password".to_string(), "secret123".to_string());
let request = HttpRequest::post("https://api.example.com/login")
.with_body(RequestBody::FormUrlEncoded(form));
let client = HttpClient::new();
let response = client.send(&request)?;
use saffron_http::helpers;
use std::path::Path;
// Download a file
helpers::download_file(
"https://example.com/file.pdf",
Path::new("downloaded.pdf")
)?;
// Upload a file
let response = helpers::upload_file(
"https://api.example.com/upload",
"file",
Path::new("document.pdf")
)?;
// Measure request time
let request = HttpRequest::get("https://api.example.com/slow-endpoint");
let (response, total_time) = helpers::measure_request_time(&request)?;
println!("Request took: {:?}", total_time);
use saffron_http::{HttpClient, HttpError};
let client = HttpClient::new();
match client.get("https://api.example.com/data") {
Ok(response) => {
if response.is_success() {
println!("Success: {}", response.status);
} else if response.is_client_error() {
println!("Client error: {}", response.status);
}
}
Err(HttpError::Timeout) => {
println!("Request timed out");
}
Err(HttpError::NetworkError(msg)) => {
println!("Network error: {}", msg);
}
Err(HttpError::TlsError(msg)) => {
println!("TLS error: {}", msg);
}
Err(e) => {
println!("Other error: {}", e);
}
}
let response = client.get("https://api.example.com/users")?;
// Status checking
println!("Success: {}", response.is_success());
println!("Redirect: {}", response.is_redirect());
println!("Client Error: {}", response.is_client_error());
println!("Server Error: {}", response.is_server_error());
// Content type detection
if response.is_json() {
// Parse JSON
} else if response.is_html() {
// Handle HTML
}
// Headers
if let Some(content_type) = response.content_type() {
println!("Content-Type: {}", content_type);
}
// Body
let text = response.body_as_string()?;
let bytes = &response.body;
Run the advanced usage example:
cargo run --example advanced_usage --package saffron-http
The saffron-http crate is the implementation layer that:
saffron-core for domain modelsureq for the actual HTTP networkingPart of the Saffron project.