aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorFuwn <[email protected]>2022-03-31 03:02:09 +0000
committerFuwn <[email protected]>2022-03-31 03:02:09 +0000
commit00f1d10de4f6597f22fec086c34265b322dd9ef3 (patch)
treeed12a2f9c6dec57193ea38124ce00b3cf36459b0
parentfix(router): use different certificate file (diff)
downloadwindmark-00f1d10de4f6597f22fec086c34265b322dd9ef3.tar.xz
windmark-00f1d10de4f6597f22fec086c34265b322dd9ef3.zip
feat(features): auto-deduce-mime
-rw-r--r--Cargo.toml3
-rw-r--r--Makefile.toml32
-rw-r--r--examples/windmark.rs18
-rw-r--r--src/lib.rs11
-rw-r--r--src/response.rs110
5 files changed, 147 insertions, 27 deletions
diff --git a/Cargo.toml b/Cargo.toml
index ba7a8a0..893dadf 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -16,6 +16,7 @@ categories = ["web-programming"]
[features]
logger = ["pretty_env_logger"]
+auto-deduce-mime = ["tree_magic"]
[dependencies]
# TCP
@@ -35,4 +36,4 @@ regex = "1.5.5"
matchit = "0.5.0"
# MIME
-tree_magic = "0.2.3"
+tree_magic = { version = "0.2.3", optional = true }
diff --git a/Makefile.toml b/Makefile.toml
index 9ae10e6..b193690 100644
--- a/Makefile.toml
+++ b/Makefile.toml
@@ -25,37 +25,27 @@ dependencies = ["fmt", "check"]
[tasks.checkfc]
dependencies = ["fmt", "check", "clippy"]
-# openssl req -x509 -newkey rsa:4096 -keyout windmark_private.pem -out windmark_public.pem -days 365
-
[tasks.genkey]
command = "openssl"
args = [
"req",
- "-newkey",
- "rsa:2048",
"-new",
- "-nodes",
- "-keyout",
- "windmark_private.pem",
- "-out",
- "windmark_public.pem",
"-subj",
- "/CN=localhost"
-]
-
-[tasks.fixkey]
-command = "openssl"
-args = [
- "x509",
- "-req",
+ "/CN=localhost",
+ "-x509",
+ "-newkey",
+ "ec",
+ "-pkeyopt",
+ "ec_paramgen_curve:prime256v1",
"-days",
"365",
- "-in",
+ "-nodes",
+ "-out",
"windmark_public.pem",
- "-signkey",
+ "-keyout",
"windmark_private.pem",
- "-out",
- "windmark_pair.pem"
+ "-inform",
+ "pem",
]
[tasks.docs]
diff --git a/examples/windmark.rs b/examples/windmark.rs
index 93eccce..211d235 100644
--- a/examples/windmark.rs
+++ b/examples/windmark.rs
@@ -155,10 +155,20 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Response::PermanentRedirect("gemini://localhost/test".into())
}),
)
- .mount(
- "/file",
- Box::new(|_| Response::SuccessFile(include_bytes!("../LICENSE"))),
- )
+ .mount("/file", {
+ #[cfg(feature = "auto-deduce-mime")]
+ {
+ Box::new(|_| Response::SuccessFile(include_bytes!("../LICENSE")))
+ }
+
+ #[cfg(not(feature = "auto-deduce-mime"))]
+ Box::new(|_| {
+ Response::SuccessFile(
+ include_bytes!("../LICENSE"),
+ "text/plain".to_string(),
+ )
+ })
+ })
.run()
.await
}
diff --git a/src/lib.rs b/src/lib.rs
index 3069d0b..cb1962e 100644
--- a/src/lib.rs
+++ b/src/lib.rs
@@ -310,6 +310,7 @@ impl Router {
let mut buffer = [0u8; 1024];
let mut url = Url::parse("gemini://fuwn.me/")?;
let mut response_status = 0;
+ let mut response_mime_type = "".to_string();
let mut footer = String::new();
let mut header = String::new();
let content;
@@ -369,6 +370,7 @@ impl Router {
&route.params,
),)),
&mut response_status,
+ &mut response_mime_type,
)
};
} else {
@@ -378,6 +380,7 @@ impl Router {
.unwrap()
.call_mut((ErrorContext::new(stream.get_ref(), &url),)),
&mut response_status,
+ &mut response_mime_type,
);
}
@@ -396,7 +399,10 @@ impl Router {
" text/gemini; charset={}; lang={}",
self.charset, self.language
),
+ #[cfg(feature = "auto-deduce-mime")]
21 => tree_magic::from_u8(&*content.as_bytes()),
+ #[cfg(not(feature = "auto-deduce-mime"))]
+ 21 => response_mime_type,
_ => (&*content).to_string(),
},
match response_status {
@@ -459,7 +465,10 @@ impl Router {
/// .set_private_key_file("windmark_private.pem", ssl::SslFiletype::PEM)
/// .unwrap();
/// builder
- /// .set_certificate_file("windmark_public.pem", openssl::ssl::SslFiletype::PEM)
+ /// .set_certificate_file(
+ /// "windmark_public.pem",
+ /// openssl::ssl::SslFiletype::PEM,
+ /// )
/// .unwrap();
/// builder.check_private_key().unwrap();
///
diff --git a/src/response.rs b/src/response.rs
index b9c5354..0459c06 100644
--- a/src/response.rs
+++ b/src/response.rs
@@ -23,7 +23,10 @@ pub enum Response<'a> {
Input(String),
SensitiveInput(String),
Success(String),
+ #[cfg(feature = "auto-deduce-mime")]
SuccessFile(&'a [u8]),
+ #[cfg(not(feature = "auto-deduce-mime"))]
+ SuccessFile(&'a [u8], String),
TemporaryRedirect(String),
PermanentRedirect(String),
TemporaryFailure(String),
@@ -41,6 +44,113 @@ pub enum Response<'a> {
CertificateNotValid(String),
}
+#[cfg(not(feature = "auto-deduce-mime"))]
+pub(crate) fn to_value_set_status(
+ response: Response<'_>,
+ status: &mut i32,
+ mime: &mut String,
+) -> String {
+ match response {
+ Response::Input(value) => {
+ *status = 10;
+
+ value
+ }
+ Response::SensitiveInput(value) => {
+ *status = 11;
+
+ value
+ }
+ Response::Success(value) => {
+ *status = 20;
+
+ value
+ }
+ Response::SuccessFile(value, value_mime) => {
+ *status = 21; // Internal status code, not real.
+ *mime = value_mime;
+
+ String::from_utf8(value.to_vec()).unwrap()
+ }
+ Response::TemporaryRedirect(value) => {
+ *status = 30;
+
+ value
+ }
+ Response::PermanentRedirect(value) => {
+ *status = 31;
+
+ value
+ }
+ Response::TemporaryFailure(value) => {
+ *status = 40;
+
+ value
+ }
+ Response::ServerUnavailable(value) => {
+ *status = 41;
+
+ value
+ }
+ Response::CGIError(value) => {
+ *status = 42;
+
+ value
+ }
+ Response::ProxyError(value) => {
+ *status = 43;
+
+ value
+ }
+ Response::SlowDown(value) => {
+ *status = 44;
+
+ value
+ }
+ Response::PermanentFailure(value) => {
+ *status = 50;
+
+ value
+ }
+ Response::NotFound(value) => {
+ *status = 51;
+
+ value
+ }
+ Response::Gone(value) => {
+ *status = 52;
+
+ value
+ }
+ Response::ProxyRefused(value) => {
+ *status = 53;
+
+ value
+ }
+ Response::BadRequest(value) => {
+ *status = 59;
+
+ value
+ }
+ Response::ClientCertificateRequired(value) => {
+ *status = 60;
+
+ value
+ }
+ Response::CertificateNotAuthorised(value) => {
+ *status = 61;
+
+ value
+ }
+ Response::CertificateNotValid(value) => {
+ *status = 62;
+
+ value
+ }
+ }
+}
+
+#[cfg(feature = "auto-deduce-mime")]
pub(crate) fn to_value_set_status(
response: Response<'_>,
status: &mut i32,