morpheus_network/client/mod.rs
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
//! HTTP client implementation.
//!
//! Pure bare-metal HTTP client over TCP/IP. Uses smoltcp for the network
//! stack and dma-pool for DMA memory from code caves in our PE binary.
//!
//! # Example
//!
//! ```ignore
//! use dma_pool::DmaPool;
//! use morpheus_network::client::NativeHttpClient;
//! use morpheus_network::device::virtio::VirtioNetDevice;
//! use morpheus_network::device::hal::StaticHal;
//! use morpheus_network::stack::NetConfig;
//!
//! // Init DMA from caves
//! unsafe { DmaPool::init_from_caves(image_base, image_end) };
//! StaticHal::init();
//!
//! // Create VirtIO network device
//! let device = VirtioNetDevice::<StaticHal, _>::new(transport)?;
//!
//! // Create native HTTP client
//! let mut client = NativeHttpClient::new(device, NetConfig::Dhcp, get_time_ms);
//!
//! // Wait for DHCP
//! client.wait_for_network(30_000)?;
//!
//! // Download file
//! let response = client.get("http://mirror.example.com/tails.iso")?;
//! ```
use crate::error::Result;
use crate::http::{Request, Response};
use crate::types::ProgressCallback;
/// HTTP client trait.
pub trait HttpClient {
/// Execute an HTTP request.
fn request(&mut self, request: &Request) -> Result<Response>;
/// Execute request with progress tracking.
fn request_with_progress(
&mut self,
request: &Request,
progress: ProgressCallback,
) -> Result<Response>;
/// Check if client is ready to make requests.
fn is_ready(&self) -> bool;
}
pub mod native;
pub use native::NativeHttpClient;