Compare commits
3 Commits
16c1d0c4aa
...
b1717b6ded
Author | SHA1 | Date | |
---|---|---|---|
|
b1717b6ded | ||
|
d429b51cf8 | ||
|
8a530d4f7d |
@ -35,6 +35,12 @@ impl Certificate {
|
|||||||
.set_subject_name(&name)
|
.set_subject_name(&name)
|
||||||
.or_unexpected_while("setting subject name")?;
|
.or_unexpected_while("setting subject name")?;
|
||||||
|
|
||||||
|
// 1970/01/01
|
||||||
|
let not_before = Asn1Time::from_unix(0).expect("initializing not_before");
|
||||||
|
builder
|
||||||
|
.set_not_before(not_before.as_ref())
|
||||||
|
.or_unexpected_while("setting not_before")?;
|
||||||
|
|
||||||
// 9999/07/23
|
// 9999/07/23
|
||||||
let not_after = Asn1Time::from_unix(253388296800).expect("initializing not_after");
|
let not_after = Asn1Time::from_unix(253388296800).expect("initializing not_after");
|
||||||
builder
|
builder
|
||||||
|
@ -3,3 +3,32 @@ pub mod gemini;
|
|||||||
pub mod http;
|
pub mod http;
|
||||||
|
|
||||||
pub use config::*;
|
pub use config::*;
|
||||||
|
|
||||||
|
use std::borrow;
|
||||||
|
|
||||||
|
fn append_index_to_path<'path, 'index>(
|
||||||
|
path: &'path str,
|
||||||
|
index: &'index str,
|
||||||
|
) -> borrow::Cow<'path, str> {
|
||||||
|
if path.len() == 0 {
|
||||||
|
let mut path = String::with_capacity(1 + index.len());
|
||||||
|
path.push('/');
|
||||||
|
path.push_str(index);
|
||||||
|
return borrow::Cow::Owned(path);
|
||||||
|
}
|
||||||
|
|
||||||
|
if path.ends_with('/') {
|
||||||
|
let mut indexed_path = String::with_capacity(path.len() + index.len());
|
||||||
|
indexed_path.push_str(path.as_ref());
|
||||||
|
indexed_path.push_str(index);
|
||||||
|
return borrow::Cow::Owned(indexed_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
borrow::Cow::Borrowed(path)
|
||||||
|
}
|
||||||
|
|
||||||
|
fn guess_mime(path: &str) -> String {
|
||||||
|
mime_guess::from_path(path)
|
||||||
|
.first_or_octet_stream()
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
@ -88,14 +88,22 @@ impl Service {
|
|||||||
.into_gemini_request()
|
.into_gemini_request()
|
||||||
.map_err(|e| HandleConnError::ClientError(format!("failed to parse request: {e}")))?;
|
.map_err(|e| HandleConnError::ClientError(format!("failed to parse request: {e}")))?;
|
||||||
|
|
||||||
let f = match self.domain_manager.get_file(domain, req.path()) {
|
let path = service::append_index_to_path(req.path(), "index.gmi");
|
||||||
|
|
||||||
|
let f = match self.domain_manager.get_file(domain, &path) {
|
||||||
Ok(f) => f,
|
Ok(f) => f,
|
||||||
Err(domain::manager::GetFileError::DomainNotFound) => panic!("TODO"),
|
Err(domain::manager::GetFileError::DomainNotFound) => panic!("TODO"),
|
||||||
Err(domain::manager::GetFileError::FileNotFound) => panic!("TODO"),
|
Err(domain::manager::GetFileError::FileNotFound) => {
|
||||||
|
return Ok(self.respond_conn(w, "51", "File not found", None).await?)
|
||||||
|
}
|
||||||
Err(domain::manager::GetFileError::Unexpected(e)) => return Err(e.into()),
|
Err(domain::manager::GetFileError::Unexpected(e)) => return Err(e.into()),
|
||||||
};
|
};
|
||||||
|
|
||||||
Ok(self.respond_conn(w, "20", "TODO", Some(f)).await?)
|
let content_type = service::guess_mime(&path);
|
||||||
|
|
||||||
|
Ok(self
|
||||||
|
.respond_conn(w, "20", content_type.as_str(), Some(f))
|
||||||
|
.await?)
|
||||||
}
|
}
|
||||||
|
|
||||||
async fn proxy_conn<IO>(
|
async fn proxy_conn<IO>(
|
||||||
|
@ -79,13 +79,9 @@ struct DomainSyncArgs {
|
|||||||
|
|
||||||
impl<'svc> Service {
|
impl<'svc> Service {
|
||||||
fn serve(&self, status_code: u16, path: &str, body: Body) -> Response<Body> {
|
fn serve(&self, status_code: u16, path: &str, body: Body) -> Response<Body> {
|
||||||
let content_type = mime_guess::from_path(path)
|
|
||||||
.first_or_octet_stream()
|
|
||||||
.to_string();
|
|
||||||
|
|
||||||
match Response::builder()
|
match Response::builder()
|
||||||
.status(status_code)
|
.status(status_code)
|
||||||
.header("Content-Type", content_type)
|
.header("Content-Type", service::guess_mime(path))
|
||||||
.body(body)
|
.body(body)
|
||||||
{
|
{
|
||||||
Ok(res) => res,
|
Ok(res) => res,
|
||||||
@ -161,20 +157,10 @@ impl<'svc> Service {
|
|||||||
}
|
}
|
||||||
|
|
||||||
async fn serve_origin(&self, domain: domain::Name, req: Request<Body>) -> Response<Body> {
|
async fn serve_origin(&self, domain: domain::Name, req: Request<Body>) -> Response<Body> {
|
||||||
let mut path_owned;
|
let path = service::append_index_to_path(req.uri().path(), "index.html");
|
||||||
let path = req.uri().path();
|
|
||||||
|
|
||||||
let path = match path.ends_with('/') {
|
match self.domain_manager.get_file(&domain, &path) {
|
||||||
true => {
|
Ok(f) => self.serve(200, &path, Body::wrap_stream(f)),
|
||||||
path_owned = String::from(path);
|
|
||||||
path_owned.push_str("index.html");
|
|
||||||
path_owned.as_str()
|
|
||||||
}
|
|
||||||
false => path,
|
|
||||||
};
|
|
||||||
|
|
||||||
match self.domain_manager.get_file(&domain, path) {
|
|
||||||
Ok(f) => self.serve(200, path, Body::wrap_stream(f)),
|
|
||||||
Err(domain::manager::GetFileError::DomainNotFound) => {
|
Err(domain::manager::GetFileError::DomainNotFound) => {
|
||||||
return self.render_error_page(404, "Domain not found")
|
return self.render_error_page(404, "Domain not found")
|
||||||
}
|
}
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
|
|
||||||
This is the gemini index.
|
This is the gemini index.
|
||||||
|
|
||||||
=> foo /foo.gmi
|
=> /foo.gmi foo
|
||||||
|
|
||||||
=> bar /subdir/bar.gmi
|
=> /subdir/bar.gmi bar
|
||||||
|
|
||||||
=> penguin /penguin.jpg
|
=> /penguin.jpg penguin
|
||||||
|
Loading…
Reference in New Issue
Block a user