Sni works.

This commit is contained in:
int 80h
2020-04-20 13:07:41 -04:00
parent f85c33f042
commit ef003c3eee
3 changed files with 34 additions and 16 deletions

View File

@@ -6,6 +6,7 @@ use std::fs::File;
use std::sync::Arc;
use std::net::ToSocketAddrs;
use std::io::{ self, BufReader };
use std::collections::HashMap;
use futures_util::future::TryFutureExt;
use tokio::prelude::*;
use tokio::runtime;
@@ -23,6 +24,15 @@ use std::error::Error;
mod config;
mod tls;
fn get_tls_config(cfg: config::Config) -> rustls::ServerConfig {
let store = rustls::RootCertStore::empty();
let verifier = rustls::AllowAnyAnonymousOrAuthenticatedClient::new(store);
let mut tls_config = rustls::ServerConfig::new( verifier /*NoClientAuth::new()*/);
tls_config.cert_resolver = Arc::new(tls::CertResolver::from_config(cfg).unwrap());
tls_config
}
fn get_content(request: String) -> String {
let url = Url::parse(&request).unwrap();
@@ -43,7 +53,14 @@ async fn handle_connection(mut stream: TlsStream<TcpStream>) -> Result<(), Box<d
stream.read(&mut buffer).await?;
let request = String::from_utf8_lossy(&buffer[..]).to_owned();
println!("Request: {}", request);
/*
let url = Url::parse(&request).unwrap();
for name in cfg.server {
if url.host_str() == Some(&name.url) {
println!("serving url: {:?}", url.host_str());
}
}
*/
stream.write_all(&b"20\ttext/gemini\r\n"[..]).await?;
stream.flush().await?;
@@ -57,26 +74,21 @@ async fn handle_connection(mut stream: TlsStream<TcpStream>) -> Result<(), Box<d
fn main() -> io::Result<()> {
let cfg = config::Config::new("config.toml");
let srv_map = cfg.to_map();
let addr = format!("{}:{}", cfg.host, cfg.port);
addr.to_socket_addrs()?
.next()
.ok_or_else(|| io::Error::from(io::ErrorKind::AddrNotAvailable))?;
let certs = tls::load_certs(&cfg.server[0].cert)?;
let keys = tls::load_key(&cfg.server[0].key);
let mut runtime = runtime::Builder::new()
.threaded_scheduler()
.enable_io()
.build()?;
let handle = runtime.handle().clone();
let mut config = ServerConfig::new(NoClientAuth::new());
config.set_single_cert(certs, keys)
.map_err(|err| io::Error::new(io::ErrorKind::InvalidInput, err))?;
let acceptor = TlsAcceptor::from(Arc::new(config));
let config = get_tls_config(cfg);
println!("Serving");
let acceptor = TlsAcceptor::from(Arc::new(config));
let fut = async {
let mut listener = TcpListener::bind(&addr).await?;