leyline-http 0.1.1

HTTP client that mimics browsers on the wire
Documentation
use super::connect::connect_err;
use super::*;
use crate::h2::{ErrorCode, H2Error};
use crate::tls::TlsError;
use crate::{Error, Kind};

#[test]
fn transport_separates_the_keyspace() {
    let tcp = make_key("http", "example.com", 443, None, Transport::Tcp);
    let quic = make_key("https", "example.com", 443, None, Transport::Quic);
    assert_ne!(tcp, quic, "H2 (Tcp) and H3 (Quic) must not share a key");

    assert_eq!(
        tcp,
        make_key("http", "example.com", 443, None, Transport::Tcp)
    );

    assert_ne!(
        tcp,
        make_key("http", "example.com", 443, Some("p:8080"), Transport::Tcp)
    );
}

#[test]
fn kinds() {
    let tcp = Error::new(Kind::Tls).with_source(TlsError::TcpConnect(
        std::io::ErrorKind::ConnectionRefused.into(),
    ));
    let tcp = connect_err(&tcp);
    assert!(matches!(
        tcp.tls(),
        Some(TlsError::TcpConnect(err)) if err.kind() == std::io::ErrorKind::ConnectionRefused
    ));

    let handshake = Error::new(Kind::Tls).with_source(TlsError::HandshakeIo(
        std::io::ErrorKind::UnexpectedEof.into(),
    ));
    let handshake = connect_err(&handshake);
    assert!(matches!(
        handshake.tls(),
        Some(TlsError::HandshakeIo(err)) if err.kind() == std::io::ErrorKind::UnexpectedEof
    ));

    let io = Error::new(Kind::Io)
        .with_source(std::io::Error::from(std::io::ErrorKind::ConnectionAborted));
    let io = connect_err(&io);
    assert!(
        io.io()
            .is_some_and(|e| e.kind() == std::io::ErrorKind::ConnectionAborted)
    );
}

#[test]
fn a_joined_connect_error_keeps_its_http2_cause() {
    let goaway = Error::new(Kind::Http2).with_source(H2Error::Connection {
        code: ErrorCode::NoError,
        reason: "server shutting down".into(),
    });
    let joined = connect_err(&goaway);
    assert!(
        matches!(
            joined.h2(),
            Some(H2Error::Connection {
                code: ErrorCode::NoError,
                ..
            })
        ),
        "{joined:?}"
    );
    assert!(goaway.is_retryable() && joined.is_retryable(), "{joined:?}");
}