1use rcgen::{
2 generate_simple_self_signed, BasicConstraints, Certificate,
3 CertificateParams, DistinguishedName, DnType, IsCa,
4};
5use std::error::Error;
6use std::fs::{File, OpenOptions};
7use std::io::Write;
8use std::path::Path;
9use std::thread::sleep;
10use tracing_subscriber::fmt::format::FmtSpan;
11use warp::Filter;
12
13pub fn open_or_create_file(path: &str) -> Result<File, Box<dyn Error>> {
14 let path = Path::new(path);
15
16 if let Some(parent) = path.parent() {
17 std::fs::create_dir_all(parent)?;
18 }
19
20 let file = OpenOptions::new()
21 .read(true)
22 .write(true)
23 .create(true)
24 .truncate(false)
25 .open(path)?;
26
27 Ok(file)
28}
29
30pub fn generate_self_signed_cert_key_files(
31 cert_file_path: &str,
32 key_file_path: &str,
33) -> Result<(), Box<dyn Error>> {
34 let cert = generate_simple_self_signed(vec!["localhost".to_string()])?;
35
36 let cert_pem = cert.cert.pem();
37 let key_pem = cert.key_pair.serialize_pem();
38
39 let mut key_file = open_or_create_file(key_file_path)?;
40 key_file.write_all(key_pem.as_bytes())?;
41
42 let mut cert_file = open_or_create_file(cert_file_path)?;
43 cert_file.write_all(cert_pem.as_bytes())?;
44
45 Ok(())
46}
47
48pub fn create_server_http(port: u16) -> Result<(), Box<dyn Error>> {
49 tracing_subscriber::fmt().with_span_events(FmtSpan::CLOSE).init();
50
51 let rt = tokio::runtime::Runtime::new()?;
52 rt.block_on(
53 warp::serve(warp::fs::dir(".").with(warp::trace::request()))
54 .run(([0, 0, 0, 0], port)),
55 );
56
57 Ok(())
58}
59
60pub fn create_server_https(port: u16) -> Result<(), Box<dyn Error>> {
61 let key_file_path = &format!(
62 "{}/i6-http-d4cd362e-89ef-4267-9e35-4cc8a79b60eb/key.pem",
63 std::env::temp_dir().to_str().unwrap_or(".")
64 );
65
66 let cert_file_path = &format!(
67 "{}/i6-http-d4cd362e-89ef-4267-9e35-4cc8a79b60eb/cert.pem",
68 std::env::temp_dir().to_str().unwrap_or(".")
69 );
70
71 generate_self_signed_cert_key_files(cert_file_path, key_file_path)?;
72
73 tracing_subscriber::fmt().with_span_events(FmtSpan::CLOSE).init();
74
75 let rt = tokio::runtime::Runtime::new()?;
76 rt.block_on(
77 warp::serve(warp::fs::dir(".").with(warp::trace::request()))
78 .tls()
79 .cert_path(cert_file_path)
80 .key_path(key_file_path)
81 .run(([0, 0, 0, 0], port)),
82 );
83
84 Ok(())
85}