Rust HTTP GET with timeouts and JSON field extraction
Rust
use std::io::{Read, Write};
use std::net::TcpStream;
use std::time::Duration;
fn get_json(host: &str, path: &str) -> std::io::Result<String> {
let mut stream = TcpStream::connect((host, 80))?;
stream.set_read_timeout(Some(Duration::from_secs(5)))?;
stream.set_write_timeout(Some(Duration::from_secs(5)))?;
write!(stream, "GET {path} HTTP/1.1\r\nHost: {host}\r\nConnection: close\r\n\r\n")?;
let mut raw = String::new();
stream.read_to_string(&mut raw)?;
Ok(raw.split("\r\n\r\n").nth(1).unwrap_or("").trim().to_string())
}
fn json_field<'a>(body: &'a str, key: &str) -> Option<&'a str> {
let pat = format!("\"{key}\":\"");
let start = body.find(pat.as_str())? + pat.len();
let end = start + body[start..].find('"')?;
Some(&body[start..end])
}