mirror of
https://github.com/YGGverse/agate.git
synced 2026-04-09 04:55:27 +00:00
Check URL schemes
This commit is contained in:
parent
3a41f40775
commit
6f490876cd
2 changed files with 14 additions and 4 deletions
|
|
@ -23,10 +23,10 @@ openssl req -x509 -newkey rsa:4096 -keyout key.rsa -out cert.pem \
|
||||||
-days 3650 -nodes -subj "/CN=example.com"
|
-days 3650 -nodes -subj "/CN=example.com"
|
||||||
```
|
```
|
||||||
|
|
||||||
4. Run the server. The command line arguments are `agate <address:port> <content_dir> <cert_file> <key_file>`. For example, to listen on the standard Gemini port (1965) on all network interfaces:
|
4. Run the server. The command line arguments are `agate <host:port> <content_dir> <cert_file> <key_file>`. For example, to listen on the standard Gemini port (1965) on localhost:
|
||||||
|
|
||||||
```
|
```
|
||||||
agate 0.0.0.0:1965 path/to/content/ cert.pem key.rsa
|
agate localhost:1965 path/to/content/ cert.pem key.rsa
|
||||||
```
|
```
|
||||||
|
|
||||||
When a client requests the URL `gemini://example.com/foo/bar`, Agate will respond with the file at `path/to/content/foo/bar`. If there is a directory at that path, Agate will look for a file named `index.gemini` inside that directory. Currently, Agate sends all responses with the `text/gemini` MIME type. (Support for other MIME types may be added in the future.)
|
When a client requests the URL `gemini://example.com/foo/bar`, Agate will respond with the file at `path/to/content/foo/bar`. If there is a directory at that path, Agate will look for a file named `index.gemini` inside that directory. Currently, Agate sends all responses with the `text/gemini` MIME type. (Support for other MIME types may be added in the future.)
|
||||||
|
|
|
||||||
14
src/main.rs
14
src/main.rs
|
|
@ -45,6 +45,7 @@ lazy_static! {
|
||||||
static ref ARGS: Args = args()
|
static ref ARGS: Args = args()
|
||||||
.expect("usage: agate <addr:port> <dir> <cert> <key>");
|
.expect("usage: agate <addr:port> <dir> <cert> <key>");
|
||||||
static ref ACCEPTOR: TlsAcceptor = acceptor().unwrap();
|
static ref ACCEPTOR: TlsAcceptor = acceptor().unwrap();
|
||||||
|
static ref BASE: Url = Url::parse(&format!("gemini://{}", ARGS.sock_addr)).unwrap();
|
||||||
}
|
}
|
||||||
|
|
||||||
fn args() -> Option<Args> {
|
fn args() -> Option<Args> {
|
||||||
|
|
@ -87,8 +88,17 @@ async fn parse_request(stream: &mut TlsStream<TcpStream>) -> Result<Url> {
|
||||||
let mut stream = async_std::io::BufReader::new(stream);
|
let mut stream = async_std::io::BufReader::new(stream);
|
||||||
let mut request = String::new();
|
let mut request = String::new();
|
||||||
stream.read_line(&mut request).await?;
|
stream.read_line(&mut request).await?;
|
||||||
let url = Url::parse(request.trim())?;
|
let request = request.trim();
|
||||||
eprintln!("Got request for {:?}", url);
|
eprintln!("Got request for {:?}", request);
|
||||||
|
|
||||||
|
let url = if request.starts_with("//") {
|
||||||
|
BASE.join(request.trim())?
|
||||||
|
} else {
|
||||||
|
Url::parse(request)?
|
||||||
|
};
|
||||||
|
if url.scheme() != "gemini" {
|
||||||
|
Err("unsupported URL scheme")?
|
||||||
|
}
|
||||||
Ok(url)
|
Ok(url)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue