Upgrade status parsing

CandyCorvid
Jul 13, 2023, 10:26 AM
AMTMTTJTF2XHEUC6ACP2PHP7GAFMFZRSJ47VJBKEO22X4ZGFIX7QC

Dependencies

Change contents

  • edit in src/main.rs at line 1
    [2.3665]
    [2.3666]
    use bstr::ByteVec;
  • replacement in src/main.rs at line 4
    [2.3712][2.3712:3756]()
    use rustls::{ClientConnection, ServerName};
    [2.3712]
    [2.3756]
    use rustls::ClientConnection;
  • replacement in src/main.rs at line 6
    [2.3767][2.3767:3807]()
    io::{self, BufReader, Read, Write},
    [2.3767]
    [2.3807]
    io::{BufReader, Read, Result as ioResult, Write},
  • edit in src/main.rs at line 8
    [2.3827][2.3827:3842]()
    sync::Arc,
  • edit in src/main.rs at line 10
    [2.3859]
    [2.3859]
    mod danger;
    mod io;
    mod read_until;
    //TODO: refactor and repurpose this
    mod 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
    [2.4208][2.4208:4244]()
    let mut stream = connect(&url);
    [2.4208]
    [2.4244]
    let mut stream = server::connect::<danger::Naive>(&url);
  • replacement in src/main.rs at line 48
    [2.4504][2.4504:4547]()
    // todo parse from 2-digit response header
    [2.4504]
    [2.4547]
    // TODO parse from 2-digit response header
  • replacement in src/main.rs at line 50
    [2.4568][2.4568:4586]()
    // todo parse etc
    [2.4568]
    [2.4586]
    // TODO parse etc
  • replacement in src/main.rs at line 52
    [2.4607][2.4607:4768]()
    fn read_response_header(
    stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>,
    ) -> io::Result<(Code, Meta)> {
    let code = read_n::<2>(stream)?;
    [2.4607]
    [2.4768]
    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
    [2.4769][2.4769:4801]()
    let c = read_byte(stream)?;
    [2.4769]
    [2.4801]
    let c = io::read_byte(stream)?;
  • edit in src/main.rs at line 63
    [2.4929]
    [2.4929]
    // TODO limit to 1024
  • edit in src/main.rs at line 66
    [2.5032]
    [2.5032]
    // drop last 2
    for _ in 0..2 {
    meta.pop();
    }
  • replacement in src/main.rs at line 71
    [2.5033][2.5033:5056]()
    Ok((code, meta))
    }
    [2.5033]
    [2.5056]
    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
    [2.5057][2.5057:5073]()
    mod read_until;
    [2.5057]
    [2.5073]
    Ok(header.try_into().expect("failed to parse header"))
    }
  • replacement in src/main.rs at line 77
    [2.5074][2.5074:5192]()
    fn read_response_string(
    stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>,
    ) -> io::Result<String> {
    [2.5074]
    [2.5192]
    fn read_response_string(stream: &mut Stream) -> ioResult<String> {
  • edit in src/main.rs at line 81
    [2.5278][2.5278:5633]()
    }
    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
    [2.5636][2.5636:5727]()
    fn send_request(stream: &mut rustls::StreamOwned<ClientConnection, TcpStream>, url: Url) {
    [2.5636]
    [2.5727]
    fn send_request(stream: &mut impl Write, url: Url) {
  • edit in src/main.rs at line 87
    [2.5853][2.5853:7895]()
    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) = host
    else {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 trusts
    pub struct Naive;
    // trust on first use
    pub 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>,
    }
    }