i6_http/
lib.rs

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}