mirror of
https://github.com/samsonjs/agate.git
synced 2026-03-25 09:05:50 +00:00
actually bind to multiple addresses
resolves #63 This now causes an error message with the default bindings because on Linux binding to both IPv6's [::] and IPv4's 0.0.0.0 results in a "port in use" error
This commit is contained in:
parent
ba3c01d38f
commit
b0d0f64be0
5 changed files with 141 additions and 52 deletions
|
|
@ -6,11 +6,15 @@ The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
|||
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
||||
|
||||
## [Unreleased]
|
||||
Thank you to @jgarte for contributing to this release.
|
||||
Thank you to @jgarte and @alvaro-cuesta for contributing to this release.
|
||||
|
||||
### Added
|
||||
* running Agate using GNU Guix (#62)
|
||||
|
||||
### Fixed
|
||||
* actually bind to multiple IP addresses. Despite the documentation saying so,
|
||||
Agate would only bind to the first address that did not result in an error. (#63)
|
||||
|
||||
## [3.1.0] - 2021-06-08
|
||||
Thank you to Matthew Ingwersen and Oliver Simmons (@GoodClover) for contributing to this release.
|
||||
|
||||
|
|
|
|||
122
Cargo.lock
generated
122
Cargo.lock
generated
|
|
@ -1,5 +1,7 @@
|
|||
# This file is automatically @generated by Cargo.
|
||||
# It is not intended for manual editing.
|
||||
version = 3
|
||||
|
||||
[[package]]
|
||||
name = "agate"
|
||||
version = "3.1.0"
|
||||
|
|
@ -7,6 +9,7 @@ dependencies = [
|
|||
"anyhow",
|
||||
"configparser",
|
||||
"env_logger",
|
||||
"futures-util",
|
||||
"gemini-fetch",
|
||||
"getopts",
|
||||
"glob",
|
||||
|
|
@ -24,9 +27,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "anyhow"
|
||||
version = "1.0.40"
|
||||
version = "1.0.42"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28b2cd92db5cbd74e8e5028f7e27dd7aa3090e89e4f2a197cc7c8dfb69c7063b"
|
||||
checksum = "595d3cfa7a60d4555cb5067b99f07142a08ea778de5cf993f7b75c7d8fabc486"
|
||||
|
||||
[[package]]
|
||||
name = "atty"
|
||||
|
|
@ -65,9 +68,9 @@ checksum = "b700ce4376041dcd0a327fd0097c41095743c4c8af8887265942faf1100bd040"
|
|||
|
||||
[[package]]
|
||||
name = "cc"
|
||||
version = "1.0.68"
|
||||
version = "1.0.69"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "4a72c244c1ff497a746a7e1fb3d14bd08420ecda70c8f25c7112f2781652d787"
|
||||
checksum = "e70cc2f62c6ce1868963827bd677764c62d07c3d9a3e1fb1177ee1a9ab199eb2"
|
||||
|
||||
[[package]]
|
||||
name = "cfg-if"
|
||||
|
|
@ -93,9 +96,9 @@ checksum = "f7201ee416d124d589a820111ba755930df8b75855321a9a1b87312a0597ec8f"
|
|||
|
||||
[[package]]
|
||||
name = "env_logger"
|
||||
version = "0.8.3"
|
||||
version = "0.8.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "17392a012ea30ef05a610aa97dfb49496e71c9f676b27879922ea5bdf60d9d3f"
|
||||
checksum = "a19187fea3ac7e84da7dacf48de0c45d63c6a76f9490dae389aead16c243fce3"
|
||||
dependencies = [
|
||||
"atty",
|
||||
"humantime",
|
||||
|
|
@ -113,6 +116,48 @@ dependencies = [
|
|||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-core"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0402f765d8a89a26043b889b26ce3c4679d268fa6bb22cd7c6aad98340e179d1"
|
||||
|
||||
[[package]]
|
||||
name = "futures-macro"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a4c40298486cdf52cc00cd6d6987892ba502c7656a16a4192a9992b1ccedd121"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"proc-macro-hack",
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "futures-task"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a16bef9fc1a4dddb5bee51c989e3fbba26569cbb0e31f5b303c184e3dd33dae"
|
||||
|
||||
[[package]]
|
||||
name = "futures-util"
|
||||
version = "0.3.15"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "feb5c238d27e2bf94ffdfd27b2c29e3df4a68c4193bb6427384259e2bf191967"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"futures-core",
|
||||
"futures-macro",
|
||||
"futures-task",
|
||||
"pin-project-lite",
|
||||
"pin-utils",
|
||||
"proc-macro-hack",
|
||||
"proc-macro-nested",
|
||||
"slab",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "gemini-fetch"
|
||||
version = "0.2.1"
|
||||
|
|
@ -148,9 +193,9 @@ checksum = "9b919933a397b79c37e33b77bb2aa3dc8eb6e165ad809e58ff75bc7db2e34574"
|
|||
|
||||
[[package]]
|
||||
name = "hermit-abi"
|
||||
version = "0.1.18"
|
||||
version = "0.1.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "322f4de77956e22ed0e5032c359a0f1273f1f7f0d79bfa3b8ffbc730d7fbcc5c"
|
||||
checksum = "62b467343b94ba476dcb2500d242dadbb39557df889310ac77c5d99100aaac33"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
|
@ -189,9 +234,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
|
|||
|
||||
[[package]]
|
||||
name = "libc"
|
||||
version = "0.2.95"
|
||||
version = "0.2.98"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "789da6d93f1b866ffe175afc5322a4d76c038605a1c3319bb57b06967ca98a36"
|
||||
checksum = "320cfe77175da3a483efed4bc0adc1968ca050b098ce4f2f1c13a56626128790"
|
||||
|
||||
[[package]]
|
||||
name = "log"
|
||||
|
|
@ -232,9 +277,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "mio"
|
||||
version = "0.7.11"
|
||||
version = "0.7.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cf80d3e903b34e0bd7282b218398aec54e082c840d9baf8339e0080a0c542956"
|
||||
checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16"
|
||||
dependencies = [
|
||||
"libc",
|
||||
"log",
|
||||
|
|
@ -292,9 +337,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "once_cell"
|
||||
version = "1.7.2"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af8b08b04175473088b46763e51ee54da5f9a164bc162f615b91bc179dbf15a3"
|
||||
checksum = "692fcb63b64b1758029e0a96ee63e049ce8c5948587f2f7208df04625e5f6b56"
|
||||
|
||||
[[package]]
|
||||
name = "pem"
|
||||
|
|
@ -315,9 +360,27 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
|
|||
|
||||
[[package]]
|
||||
name = "pin-project-lite"
|
||||
version = "0.2.6"
|
||||
version = "0.2.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dc0e1f259c92177c30a4c9d177246edd0a3568b25756a977d0632cf8fa37e905"
|
||||
checksum = "8d31d11c69a6b52a174b42bdc0c30e5e11670f90788b2c471c31c1d17d449443"
|
||||
|
||||
[[package]]
|
||||
name = "pin-utils"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-hack"
|
||||
version = "0.5.19"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbf0c48bc1d91375ae5c3cd81e3722dff1abcf81a30960240640d223f59fe0e5"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro-nested"
|
||||
version = "0.1.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bc881b2c22681370c6a780e47af9840ef841837bc98118431d4e1868bd0c1086"
|
||||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
|
|
@ -402,6 +465,12 @@ dependencies = [
|
|||
"untrusted",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slab"
|
||||
version = "0.4.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f173ac3d1a7e3b28003f40de0b5ce7fe2710f9b9dc3fc38664cebee46b3b6527"
|
||||
|
||||
[[package]]
|
||||
name = "spin"
|
||||
version = "0.5.2"
|
||||
|
|
@ -410,9 +479,9 @@ checksum = "6e63cff320ae2c57904679ba7cb63280a3dc4613885beafb148ee7bf9aa9042d"
|
|||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "1.0.72"
|
||||
version = "1.0.73"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a1e8cdbefb79a9a5a65e0db8b47b723ee907b7c7f8496c76a1770b5c310bab82"
|
||||
checksum = "f71489ff30030d2ae598524f61326b902466f72a0fb1a8564c001cc63425bcc7"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
@ -430,18 +499,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "thiserror"
|
||||
version = "1.0.25"
|
||||
version = "1.0.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fa6f76457f59514c7eeb4e59d891395fab0b2fd1d40723ae737d64153392e9c6"
|
||||
checksum = "93119e4feac1cbe6c798c34d3a53ea0026b0b1de6a120deef895137c0529bfe2"
|
||||
dependencies = [
|
||||
"thiserror-impl",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "thiserror-impl"
|
||||
version = "1.0.25"
|
||||
version = "1.0.26"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8a36768c0fbf1bb15eca10defa29526bda730a2376c2ab4393ccfa16fb1a318d"
|
||||
checksum = "060d69a0afe7796bf42e9e2ff91f5ee691fb15c53d38b4b62a9a53eb23164745"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
@ -465,9 +534,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
|||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.6.1"
|
||||
version = "1.8.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0a38d31d7831c6ed7aad00aa4c12d9375fd225a6dd77da1d25b707346319a975"
|
||||
checksum = "98c8b05dc14c75ea83d63dd391100353789f5f24b8b3866542a5e85c8be8e985"
|
||||
dependencies = [
|
||||
"autocfg",
|
||||
"bytes",
|
||||
|
|
@ -477,13 +546,14 @@ dependencies = [
|
|||
"num_cpus",
|
||||
"pin-project-lite",
|
||||
"tokio-macros",
|
||||
"winapi",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tokio-macros"
|
||||
version = "1.2.0"
|
||||
version = "1.3.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c49e3df43841dafb86046472506755d8501c5615673955f6aa17181125d13c37"
|
||||
checksum = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
|
|||
|
|
@ -14,6 +14,7 @@ exclude = ["/tools", "/.github", "/release.sh", "/Cross.toml", "/content", "/COD
|
|||
[dependencies]
|
||||
configparser = "2.0"
|
||||
env_logger = { version = "0.8", default-features = false, features = ["atty", "humantime", "termcolor"] }
|
||||
futures-util = "0.3"
|
||||
getopts = "0.2.21"
|
||||
glob = "0.3"
|
||||
log = "0.4"
|
||||
|
|
|
|||
62
src/main.rs
62
src/main.rs
|
|
@ -30,37 +30,51 @@ use {
|
|||
url::{Host, Url},
|
||||
};
|
||||
|
||||
fn main() -> Result {
|
||||
fn main() {
|
||||
env_logger::Builder::from_env(
|
||||
// by default only turn on logging for agate
|
||||
env_logger::Env::default().default_filter_or("agate=info"),
|
||||
)
|
||||
.init();
|
||||
Runtime::new()?.block_on(async {
|
||||
let default = PresetMeta::Parameters(
|
||||
ARGS.language
|
||||
.as_ref()
|
||||
.map_or(String::new(), |lang| format!(";lang={}", lang)),
|
||||
);
|
||||
let mimetypes = Arc::new(Mutex::new(FileOptions::new(default)));
|
||||
let listener = TcpListener::bind(&ARGS.addrs[..]).await?;
|
||||
log::info!("Listening on {:?}...", ARGS.addrs);
|
||||
loop {
|
||||
let (stream, _) = listener.accept().await?;
|
||||
let arc = mimetypes.clone();
|
||||
tokio::spawn(async {
|
||||
match RequestHandle::new(stream, arc).await {
|
||||
Ok(handle) => match handle.handle().await {
|
||||
Ok(info) => log::info!("{}", info),
|
||||
Err(err) => log::warn!("{}", err),
|
||||
},
|
||||
Err(log_line) => {
|
||||
log::warn!("{}", log_line);
|
||||
Runtime::new()
|
||||
.expect("could not start tokio runtime")
|
||||
.block_on(async {
|
||||
let default = PresetMeta::Parameters(
|
||||
ARGS.language
|
||||
.as_ref()
|
||||
.map_or(String::new(), |lang| format!(";lang={}", lang)),
|
||||
);
|
||||
let mimetypes = Arc::new(Mutex::new(FileOptions::new(default)));
|
||||
|
||||
let handles = ARGS.addrs.iter().map(|addr| {
|
||||
let arc = mimetypes.clone();
|
||||
tokio::spawn(async move {
|
||||
let listener = TcpListener::bind(addr)
|
||||
.await
|
||||
.unwrap_or_else(|e| panic!("Failed to listen on {}: {}", addr, e));
|
||||
log::info!("Started listener on {}", addr);
|
||||
loop {
|
||||
let (stream, _) = listener.accept().await.unwrap_or_else(|e| {
|
||||
panic!("could not accept new connection on {}: {}", addr, e)
|
||||
});
|
||||
let arc = arc.clone();
|
||||
tokio::spawn(async {
|
||||
match RequestHandle::new(stream, arc).await {
|
||||
Ok(handle) => match handle.handle().await {
|
||||
Ok(info) => log::info!("{}", info),
|
||||
Err(err) => log::warn!("{}", err),
|
||||
},
|
||||
Err(log_line) => {
|
||||
log::warn!("{}", log_line);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
})
|
||||
});
|
||||
}
|
||||
})
|
||||
|
||||
futures_util::future::join_all(handles).await;
|
||||
});
|
||||
}
|
||||
|
||||
type Result<T = (), E = Box<dyn Error + Send + Sync>> = std::result::Result<T, E>;
|
||||
|
|
|
|||
|
|
@ -40,7 +40,7 @@ impl Server {
|
|||
let mut buffer = String::new();
|
||||
while matches!(reader.read_line(&mut buffer), Ok(i) if i>0) {
|
||||
print!("log: {}", buffer);
|
||||
if buffer.contains("Listening") {
|
||||
if buffer.contains("Started") {
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
|||
Loading…
Reference in a new issue