mirror of https://git.sr.ht/~garritfra/taurus
Garrit Franke
4 years ago
5 changed files with 350 additions and 22 deletions
@ -0,0 +1,9 @@
|
||||
# Generates a test-certificate |
||||
|
||||
# When prompted for multiple lines of information, leave everything blank instead of "common name" |
||||
# This should be your domain name. E.g. "localhost" if you are testing on your local machine |
||||
|
||||
openssl genrsa -des3 -out server.key 1024 |
||||
openssl req -new -key server.key -out server.csr |
||||
openssl x509 -req -days 1024 -in server.csr -signkey server.key -out server.crt |
||||
openssl pkcs12 -export -out identity.pfx -inkey server.key -in server.crt |
@ -1,49 +1,75 @@
|
||||
extern crate native_tls; |
||||
extern crate url; |
||||
|
||||
use native_tls::{Identity, TlsAcceptor, TlsStream}; |
||||
use std::fs::File; |
||||
use std::io::Read; |
||||
use std::io::Write; |
||||
use std::net::TcpListener; |
||||
use std::net::TcpStream; |
||||
use std::sync::Arc; |
||||
use std::thread; |
||||
use url::Url; |
||||
|
||||
fn main() { |
||||
let mut file = File::open("identity.pfx").unwrap(); |
||||
let mut identity = vec![]; |
||||
file.read_to_end(&mut identity).unwrap(); |
||||
let identity = Identity::from_pkcs12(&identity, "qqqq").unwrap(); |
||||
|
||||
// 1965 is the standard port for gemini
|
||||
let port = "1965"; |
||||
let address = format!("0.0.0.0:{}", port); |
||||
let listener = |
||||
TcpListener::bind(address).unwrap_or_else(|_| panic!("Could not bind to port {}", port)); |
||||
let acceptor = TlsAcceptor::new(identity).unwrap(); |
||||
let acceptor = Arc::new(acceptor); |
||||
|
||||
println!("Listening on port 1965"); |
||||
|
||||
for stream in listener.incoming() { |
||||
if let Ok(mut stream) = stream { |
||||
let mut buffer = [0; 1024]; |
||||
if let Err(e) = stream.read(&mut buffer) { |
||||
println!("Could not read from stream: {}", e) |
||||
match stream { |
||||
Ok(stream) => { |
||||
let acceptor = acceptor.clone(); |
||||
thread::spawn(move || { |
||||
let stream = acceptor.accept(stream).unwrap(); |
||||
handle_client(stream); |
||||
}); |
||||
} |
||||
Err(_e) => println!("Error: {}", _e), |
||||
} |
||||
} |
||||
} |
||||
|
||||
let mut raw_request = String::from_utf8_lossy(&buffer[..]).to_mut().to_owned(); |
||||
fn handle_client(mut stream: TlsStream<TcpStream>) { |
||||
let mut buffer = [0; 1024]; |
||||
if let Err(e) = stream.read(&mut buffer) { |
||||
println!("Could not read from stream: {}", e) |
||||
} |
||||
|
||||
if !raw_request.starts_with("gemini://") { |
||||
raw_request = "gemini://".to_owned() + &raw_request; |
||||
} |
||||
let mut raw_request = String::from_utf8_lossy(&buffer[..]).to_mut().to_owned(); |
||||
|
||||
let request = Url::parse(&raw_request).expect("Can not parse URL"); |
||||
let mut response: Vec<u8> = Vec::new(); |
||||
if !raw_request.starts_with("gemini://") { |
||||
raw_request = "gemini://".to_owned() + &raw_request; |
||||
} |
||||
|
||||
// 20 SUCESS status
|
||||
response.extend("20".as_bytes()); |
||||
let request = Url::parse(&raw_request).expect("Can not parse URL"); |
||||
let mut response: Vec<u8> = Vec::new(); |
||||
|
||||
// <Space>
|
||||
response.push(0x20); |
||||
// 20 SUCESS status
|
||||
response.extend("20".as_bytes()); |
||||
|
||||
// <Meta>
|
||||
response.extend("SUCCESS".as_bytes()); |
||||
// <Space>
|
||||
response.push(0x20); |
||||
|
||||
response.extend("\r\n".as_bytes()); |
||||
// <Meta>
|
||||
response.extend("text/gemini".as_bytes()); |
||||
|
||||
if let Err(e) = stream.write(&response) { |
||||
println!("Could not write to stream: {}", e); |
||||
} |
||||
} |
||||
response.extend("\r\n".as_bytes()); |
||||
|
||||
response.extend("Hello World!".as_bytes()); |
||||
|
||||
if let Err(e) = stream.write(&response) { |
||||
println!("Could not write to stream: {}", e); |
||||
} |
||||
} |
||||
|
Loading…
Reference in new issue