use frakt::Client;
use tokio;
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
println!("Starting upload task example...");
let test_data = b"Hello from NSURLSessionUploadTask! This is test data for upload.".repeat(100);
let mut temp_file = std::env::temp_dir();
temp_file.push("frakt_upload_test.txt");
std::fs::write(&temp_file, &test_data)?;
println!(
"Created test file: {:?} ({} bytes)",
temp_file,
test_data.len()
);
let client = Client::new()?;
println!("\n=== Testing file upload with progress ===");
let response = client
.upload("https://httpbin.org/post")?
.from_file(&temp_file)
.header("Content-Type", "text/plain")?
.progress(|bytes_uploaded, total_bytes| {
if let Some(total) = total_bytes {
let percentage = (bytes_uploaded as f64 / total as f64) * 100.0;
println!(
"Upload progress: {:.1}% ({} / {} bytes)",
percentage, bytes_uploaded, total
);
} else {
println!("Upload progress: {} bytes", bytes_uploaded);
}
})
.send()
.await?;
println!("โ
File upload completed!");
println!("Status: {}", response.status());
if let Ok(json_response) = response.json::<serde_json::Value>().await {
if let Some(files) = json_response.get("files") {
println!("Files received by server: {}", files);
}
if let Some(headers) = json_response.get("headers") {
println!("Headers: {}", headers);
}
}
println!("\n=== Testing data upload ===");
let small_data = b"Small data upload test";
let response2 = client
.upload("https://httpbin.org/post")?
.from_data(small_data.to_vec())
.header("Content-Type", "application/octet-stream")?
.progress(|bytes_uploaded, total_bytes| {
if let Some(total) = total_bytes {
println!("Data upload: {} / {} bytes", bytes_uploaded, total);
}
})
.send()
.await?;
println!("โ
Data upload completed!");
println!("Status: {}", response2.status());
if let Ok(json_response) = response2.json::<serde_json::Value>().await {
if let Some(data) = json_response.get("data") {
println!("Data received by server: {}", data);
}
}
let _ = std::fs::remove_file(&temp_file);
println!("\n๐งน Cleaned up temporary file");
Ok(())
}