Skip to content

Commit bcbcd1e

Browse files
authored
Use actual interface to check available ports (#2789)
1 parent e613aa8 commit bcbcd1e

File tree

5 files changed

+15
-11
lines changed

5 files changed

+15
-11
lines changed

components/site/src/lib.rs

+3-2
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ pub mod tpls;
77

88
use std::borrow::Cow;
99
use std::collections::{HashMap, HashSet};
10+
use std::net::IpAddr;
1011
use std::path::{Path, PathBuf};
1112
use std::sync::{Arc, Mutex, RwLock};
1213

@@ -149,8 +150,8 @@ impl Site {
149150
/// We avoid the port the server is going to use as it's not bound yet
150151
/// when calling this function and we could end up having tried to bind
151152
/// both http and websocket server to the same port
152-
pub fn enable_live_reload(&mut self, port_to_avoid: u16) {
153-
self.live_reload = get_available_port(port_to_avoid);
153+
pub fn enable_live_reload(&mut self, interface: IpAddr, port_to_avoid: u16) {
154+
self.live_reload = get_available_port(interface, port_to_avoid);
154155
}
155156

156157
/// Only used in `zola serve` to re-use the initial websocket port

components/site/tests/site.rs

+3-1
Original file line numberDiff line numberDiff line change
@@ -237,7 +237,9 @@ fn can_build_site_without_live_reload() {
237237
#[test]
238238
fn can_build_site_with_live_reload_and_drafts() {
239239
let (site, _tmp_dir, public) = build_site_with_setup("test_site", |mut site| {
240-
site.enable_live_reload(1000);
240+
use std::net::IpAddr;
241+
use std::str::FromStr;
242+
site.enable_live_reload(IpAddr::from_str("127.0.0.1").unwrap(), 1000);
241243
site.include_drafts();
242244
(site, true)
243245
});

components/utils/src/net.rs

+5-4
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
1+
use std::net::IpAddr;
12
use std::net::TcpListener;
23

3-
pub fn get_available_port(avoid: u16) -> Option<u16> {
4+
pub fn get_available_port(interface: IpAddr, avoid: u16) -> Option<u16> {
45
// Start after "well-known" ports (0–1023) as they require superuser
56
// privileges on UNIX-like operating systems.
6-
(1024..9000).find(|port| *port != avoid && port_is_available(*port))
7+
(1024..9000).find(|port| *port != avoid && port_is_available(interface, *port))
78
}
89

9-
pub fn port_is_available(port: u16) -> bool {
10-
TcpListener::bind(("127.0.0.1", port)).is_ok()
10+
pub fn port_is_available(interface: IpAddr, port: u16) -> bool {
11+
TcpListener::bind((interface, port)).is_ok()
1112
}
1213

1314
/// Returns whether a link starts with an HTTP(s) scheme.

src/cmd/serve.rs

+1-1
Original file line numberDiff line numberDiff line change
@@ -409,7 +409,7 @@ fn create_new_site(
409409
if let Some(p) = ws_port {
410410
site.enable_live_reload_with_port(p);
411411
} else {
412-
site.enable_live_reload(interface_port);
412+
site.enable_live_reload(interface, interface_port);
413413
}
414414
messages::notify_site_size(&site);
415415
messages::warn_about_ignored_pages(&site);

src/main.rs

+3-3
Original file line numberDiff line numberDiff line change
@@ -90,13 +90,13 @@ fn main() {
9090
no_port_append,
9191
extra_watch_path,
9292
} => {
93-
if port != 1111 && !port_is_available(port) {
93+
if port != 1111 && !port_is_available(interface, port) {
9494
console::error("The requested port is not available");
9595
std::process::exit(1);
9696
}
9797

98-
if !port_is_available(port) {
99-
port = get_available_port(1111).unwrap_or_else(|| {
98+
if !port_is_available(interface, port) {
99+
port = get_available_port(interface, 1111).unwrap_or_else(|| {
100100
console::error("No port available");
101101
std::process::exit(1);
102102
});

0 commit comments

Comments
 (0)