Sending plaintext response for non-TLS connection attempts
Open
Nobody has claimed this yet.
- Dominant language
- Rust
- Stars
- 234
- Forks
- 108
- Avg merge
- 5h 12m
- Merged PRs (30d)
- 4
Description
This is my current attempt among others. Both print statements print. I have had intermittent success... its just not stable. Whats the correct way to approach this within the lib itself?
pub struct TlsListener(
Vec<CertificateDer<'static>>,
PrivateKeyDer<'static>,
TlsAcceptor,
TcpListener,
);
impl TlsListener {
pub async fn bind(address: SocketAddr) -> Self {
let listener = TcpListener::bind(address).await.unwrap();
let certs = Path::new(CERTS_PATH);
let cert = load_certs(&certs).unwrap();
let key = Path::new(KEY_PATH);
let key = load_keys(&key).unwrap();
let config = rustls::ServerConfig::builder()
.with_no_client_auth()
.with_single_cert(cert.clone(), key.clone_key())
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))
.unwrap();
let acceptor = TlsAcceptor::from(Arc::new(config));
TlsListener(cert, key, acceptor, listener)
}
pub async fn redirect(&self) -> io::Result<()> {
println!("Redirecting");
let (mut stream, _peer_addr) = self.3.accept().await?;
let redirect =
b"HTTP/1.1 301 Moved Permanently\r\nLocation: https://localhost:4010/\r\n\r\n";
stream.write(redirect).await?;
stream.flush().await?;
println!("Redirected");
Ok(())
}
pub async fn accept(&self) -> io::Result<(TlsStream<TcpStream>, SocketAddr)> {
let listener = &self.3;
let (stream, peer_addr) = listener.accept().await?;
match self.2.accept(stream).await {
Ok(stream) => Ok((stream, peer_addr)),
Err(error) => {
self.redirect().await?;
Err(error)
}
}
}
}
Contributor guide
No contributing guide indexed for this repository
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
Research direction
Start with the TlsListener::accept and redirect methods shown in the issue, focusing on how a failed TLS handshake is handled and how the underlying TCP stream is reused. Define the intended behavior for non-TLS clients, then add or update coverage for that behavior; the payload names no files or tests.
Written by the indexing model from the issue text.
Assessment
- Tech stack
- rust
- Domain
- networking
- Issue type
- Feature
- Difficulty
- 5/5
- Estimated time
- Over a week
- Activity status
- Stale
- Clarity
- Needs clarification
- Newbie friendliness
- 25/100