Revproxy can't connect
This commit is contained in:
@@ -20,6 +20,7 @@ pub struct Server {
|
|||||||
pub cert: String,
|
pub cert: String,
|
||||||
pub cgi: Option<String>,
|
pub cgi: Option<String>,
|
||||||
pub usrdir: Option<bool>,
|
pub usrdir: Option<bool>,
|
||||||
|
pub proxy: Option<Vec<String>>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone)]
|
#[derive(Debug, Clone)]
|
||||||
@@ -31,6 +32,7 @@ pub struct ServerCfg {
|
|||||||
pub cgi: String,
|
pub cgi: String,
|
||||||
pub usrdir: bool,
|
pub usrdir: bool,
|
||||||
pub port: i32,
|
pub port: i32,
|
||||||
|
pub proxy: HashMap<String, String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
impl Config {
|
impl Config {
|
||||||
@@ -50,6 +52,16 @@ impl Config {
|
|||||||
Some(u) => u,
|
Some(u) => u,
|
||||||
None => false,
|
None => false,
|
||||||
};
|
};
|
||||||
|
let mut pmap = HashMap::new();
|
||||||
|
match &srv.proxy {
|
||||||
|
Some(pr) => {
|
||||||
|
for p in pr {
|
||||||
|
let p: Vec<&str> = p.split("=").collect();
|
||||||
|
pmap.insert(p[0].trim().to_string(), p[1].trim().to_string());
|
||||||
|
}
|
||||||
|
},
|
||||||
|
None => {},
|
||||||
|
};
|
||||||
map.insert(srv.hostname.clone(), ServerCfg {
|
map.insert(srv.hostname.clone(), ServerCfg {
|
||||||
hostname: srv.hostname.clone(),
|
hostname: srv.hostname.clone(),
|
||||||
dir: srv.dir.clone(),
|
dir: srv.dir.clone(),
|
||||||
@@ -58,6 +70,7 @@ impl Config {
|
|||||||
cgi: cgi,
|
cgi: cgi,
|
||||||
usrdir: usrdir,
|
usrdir: usrdir,
|
||||||
port: self.port.clone(),
|
port: self.port.clone(),
|
||||||
|
proxy: pmap,
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
map
|
map
|
||||||
|
|||||||
11
src/main.rs
11
src/main.rs
@@ -36,6 +36,7 @@ mod config;
|
|||||||
mod status;
|
mod status;
|
||||||
mod tls;
|
mod tls;
|
||||||
mod conn;
|
mod conn;
|
||||||
|
mod revproxy;
|
||||||
|
|
||||||
fn get_mime(path: &PathBuf) -> String {
|
fn get_mime(path: &PathBuf) -> String {
|
||||||
let mut mime = "text/gemini";
|
let mut mime = "text/gemini";
|
||||||
@@ -124,6 +125,16 @@ async fn handle_connection(mut con: conn::Connection, srv: &config::ServerCfg) -
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
if srv.proxy.len() != 0 {
|
||||||
|
match srv.proxy.get(url.path()) {
|
||||||
|
Some(p) => {
|
||||||
|
revproxy::proxy(p.to_string(), url).await?;
|
||||||
|
return Ok(());
|
||||||
|
},
|
||||||
|
None => {},
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if Some(srv.hostname.as_str()) != url.host_str() {
|
if Some(srv.hostname.as_str()) != url.host_str() {
|
||||||
con.send_status(status::Status::ProxyRequestRefused, "Url doesn't match certificate!").await?;
|
con.send_status(status::Status::ProxyRequestRefused, "Url doesn't match certificate!").await?;
|
||||||
return Ok(());
|
return Ok(());
|
||||||
|
|||||||
37
src/revproxy.rs
Normal file
37
src/revproxy.rs
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
use std::io;
|
||||||
|
use std::fs::File;
|
||||||
|
use std::sync::Arc;
|
||||||
|
use std::net::ToSocketAddrs;
|
||||||
|
use std::io::BufReader;
|
||||||
|
use futures_util::future;
|
||||||
|
use tokio::net::TcpStream;
|
||||||
|
use tokio::io::{
|
||||||
|
AsyncWriteExt,
|
||||||
|
copy, split,
|
||||||
|
};
|
||||||
|
use tokio_rustls::{ TlsConnector, rustls::ClientConfig, webpki::DNSNameRef };
|
||||||
|
use url::Url;
|
||||||
|
|
||||||
|
pub async fn proxy(addr: String, _u: url::Url) -> Result<(), io::Error> {
|
||||||
|
let addr = addr.to_socket_addrs()?
|
||||||
|
.next()
|
||||||
|
.ok_or_else(|| io::Error::from(io::ErrorKind::AddrNotAvailable))?;
|
||||||
|
let mut config = ClientConfig::new();
|
||||||
|
|
||||||
|
let mut pem = BufReader::new(File::open("cafile")?);
|
||||||
|
config.root_store.add_pem_file(&mut pem)
|
||||||
|
.map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "invalid cert"))?;
|
||||||
|
|
||||||
|
let connector = TlsConnector::from(Arc::new(config));
|
||||||
|
let stream = TcpStream::connect(&addr).await?;
|
||||||
|
|
||||||
|
let domain = DNSNameRef::try_from_ascii_str("cbook.lan")
|
||||||
|
.map_err(|_| io::Error::new(io::ErrorKind::InvalidInput, "invalid dnsname"))?;
|
||||||
|
|
||||||
|
println!("Connecting to agena...");
|
||||||
|
let mut stream = connector.connect(domain, stream).await?;
|
||||||
|
//stream.write_all(b"gopher://gopher.club/\r\n").await?;
|
||||||
|
//stream.flush().await?;
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user