aboutsummaryrefslogtreecommitdiffstats
path: root/tests/serve_request.rs
diff options
context:
space:
mode:
authorSven-Hendrik Haase <svenstaro@gmail.com>2021-04-18 06:54:21 +0000
committerGitHub <noreply@github.com>2021-04-18 06:54:21 +0000
commita135c5df0544407257ad25ab31d5e2851847f0a4 (patch)
tree82e13f0bf838093f1f3548522a69a9848a5c6388 /tests/serve_request.rs
parentPrefer UTF8 for text reponses (fixes #263) (diff)
parentMerge branch 'master' into rfc-resolve-symlinks (diff)
downloadminiserve-a135c5df0544407257ad25ab31d5e2851847f0a4.tar.gz
miniserve-a135c5df0544407257ad25ab31d5e2851847f0a4.zip
Merge pull request #479 from aliemjay/rfc-resolve-symlinks
Resolve symlinks on directory listing
Diffstat (limited to 'tests/serve_request.rs')
-rw-r--r--tests/serve_request.rs74
1 files changed, 74 insertions, 0 deletions
diff --git a/tests/serve_request.rs b/tests/serve_request.rs
index 25c5574..e259b9e 100644
--- a/tests/serve_request.rs
+++ b/tests/serve_request.rs
@@ -8,10 +8,16 @@ use regex::Regex;
use rstest::rstest;
use select::document::Document;
use select::node::Node;
+use std::path::Path;
use std::process::{Command, Stdio};
use std::thread::sleep;
use std::time::Duration;
+#[cfg(unix)]
+use std::os::unix::fs::{symlink as symlink_dir, symlink as symlink_file};
+#[cfg(windows)]
+use std::os::windows::fs::{symlink_dir, symlink_file};
+
#[rstest]
fn serves_requests_with_no_options(tmpdir: TempDir) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?
@@ -159,6 +165,74 @@ fn serves_requests_no_hidden_files_without_flag(tmpdir: TempDir, port: u16) -> R
Ok(())
}
+#[rstest(no_symlinks, case(true), case(false))]
+fn serves_requests_symlinks(tmpdir: TempDir, port: u16, no_symlinks: bool) -> Result<(), Error> {
+ let mut comm = Command::cargo_bin("miniserve")?;
+ comm.arg(tmpdir.path())
+ .arg("-p")
+ .arg(port.to_string())
+ .stdout(Stdio::null());
+ if no_symlinks {
+ comm.arg("--no-symlinks");
+ }
+
+ let mut child = comm.spawn()?;
+ sleep(Duration::from_secs(1));
+
+ let files = &["symlink-file.html"];
+ let dirs = &["symlink-dir/"];
+ let broken = &["symlink broken"];
+
+ for &directory in dirs {
+ let orig = Path::new(DIRECTORIES[0].strip_suffix("/").unwrap());
+ let link = tmpdir
+ .path()
+ .join(Path::new(directory.strip_suffix("/").unwrap()));
+ symlink_dir(orig, link).expect("Couldn't create symlink");
+ }
+ for &file in files {
+ let orig = Path::new(FILES[0]);
+ let link = tmpdir.path().join(Path::new(file));
+ symlink_file(orig, link).expect("Couldn't create symlink");
+ }
+ for &file in broken {
+ let orig = Path::new("should-not-exist.xxx");
+ let link = tmpdir.path().join(Path::new(file));
+ symlink_file(orig, link).expect("Couldn't create symlink");
+ }
+
+ let body = reqwest::blocking::get(format!("http://localhost:{}", port).as_str())?
+ .error_for_status()?;
+ let parsed = Document::from_read(body)?;
+
+ for &entry in files.into_iter().chain(dirs) {
+ let node = parsed
+ .find(|x: &Node| x.name().unwrap_or_default() == "a" && x.text() == entry)
+ .next();
+ assert_eq!(node.is_none(), no_symlinks);
+ if no_symlinks {
+ continue;
+ }
+
+ let node = node.unwrap();
+ assert_eq!(node.attr("href").unwrap().strip_prefix("/").unwrap(), entry);
+ reqwest::blocking::get(format!("http://localhost:{}/{}", port, entry))?
+ .error_for_status()?;
+ if entry.ends_with("/") {
+ assert_eq!(node.attr("class").unwrap(), "directory");
+ } else {
+ assert_eq!(node.attr("class").unwrap(), "file");
+ }
+ }
+ for &entry in broken {
+ assert!(parsed.find(|x: &Node| x.text() == entry).next().is_none());
+ }
+
+ child.kill()?;
+
+ Ok(())
+}
+
#[rstest]
fn serves_requests_with_randomly_assigned_port(tmpdir: TempDir) -> Result<(), Error> {
let mut child = Command::cargo_bin("miniserve")?