Upgrade status parsing
Dependencies
- [2]
DBKKKHC2Initial commit
Change contents
- edit in src/main.rs at line 1
use bstr::ByteVec; - replacement in src/main.rs at line 4
use rustls::{ClientConnection, ServerName};use rustls::ClientConnection; - replacement in src/main.rs at line 6
io::{self, BufReader, Read, Write},io::{BufReader, Read, Result as ioResult, Write}, - edit in src/main.rs at line 8
sync::Arc, - edit in src/main.rs at line 10
mod danger;mod io;mod read_until;//TODO: refactor and repurpose thismod response;mod server;mod cl {use clap::Parser;#[derive(Parser)]pub struct App {pub url: Option<String>,}} - replacement in src/main.rs at line 37
let mut stream = connect(&url);let mut stream = server::connect::<danger::Naive>(&url); - replacement in src/main.rs at line 48
// todo parse from 2-digit response header// TODO parse from 2-digit response header - replacement in src/main.rs at line 50
// todo parse etc// TODO parse etc - replacement in src/main.rs at line 52
fn read_response_header(stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>,) -> io::Result<(Code, Meta)> {let code = read_n::<2>(stream)?;fn read_response_header(stream: &mut Stream) -> ioResult<response::Status> {let status = io::read_n::<2>(stream)?;let status = status.map(|s| s.checked_sub(b'0').expect("bad status fragment")); - replacement in src/main.rs at line 57
let c = read_byte(stream)?;let c = io::read_byte(stream)?; - edit in src/main.rs at line 63
// TODO limit to 1024 - edit in src/main.rs at line 66
// drop last 2for _ in 0..2 {meta.pop();} - replacement in src/main.rs at line 71
Ok((code, meta))}let meta = meta.into_string().expect("Meta was not valid UTF8");let header = response::raw::Header { meta, status }; - replacement in src/main.rs at line 74
mod read_until;Ok(header.try_into().expect("failed to parse header"))} - replacement in src/main.rs at line 77
fn read_response_string(stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>,) -> io::Result<String> {fn read_response_string(stream: &mut Stream) -> ioResult<String> { - edit in src/main.rs at line 81
}fn read_byte(stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>,) -> Result<u8, io::Error> {let [c] = read_n::<1>(stream)?;Ok(c)}fn read_n<const N: usize>(stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>,) -> io::Result<[u8; N]> {let mut buf = [0; N];stream.read_exact(&mut buf)?;Ok(buf) - replacement in src/main.rs at line 83
fn send_request(stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>, url: Url) {fn send_request(stream: &mut impl Write, url: Url) { - edit in src/main.rs at line 87
fn connect(url: &Url) -> rustls::StreamOwned<ClientConnection, TcpStream> {let host = url.host().expect("");let sn = server(host);let stream = {let cfg = tls_cfg();let conn = {let client = ClientConnection::new(cfg, sn).expect("could not connect");client};let addrs = url.socket_addrs(|| Some(1965)).expect("could not get addresses for URL");let addr = addrs.get(0).expect("no addresses");let sock = TcpStream::connect(addr).expect("failed to connect");let stream = Stream { conn, sock };stream};stream}fn server(host: url::Host<&str>) -> ServerName {let url::Host::Domain(s) = hostelse {unreachable!("the url is always a string")};let sn = s.try_into().expect("this should be a valid DNS name");sn}fn tls_cfg() -> Arc<rustls::ClientConfig> {let root_store = rustls::RootCertStore::empty();let cfg = {let mut cfg = rustls::ClientConfig::builder().with_safe_defaults().with_root_certificates(root_store).with_no_client_auth();cfg.dangerous().set_certificate_verifier(Arc::new(danger::Naive {}));Arc::new(cfg)};cfg}mod danger {use std::time::SystemTime;use rustls::{client::ServerCertVerified, Certificate, Error, ServerName};// unconditionally trustspub struct Naive;// trust on first usepub struct Tofu {}impl rustls::client::ServerCertVerifier for Naive {fn verify_server_cert(&self,_: &Certificate,_: &[Certificate],_: &ServerName,_: &mut dyn Iterator<Item = &[u8]>,_: &[u8],_: SystemTime,) -> Result<ServerCertVerified, Error> {Ok(ServerCertVerified::assertion())}}}mod cl {use clap::Parser;#[derive(Parser)]pub struct App {pub url: Option<String>,}}