curl -X PATCH -H "X-Update-Range: append" --data-binary @- http://127.0.0.1:5000/file
```
+Health checks
+
+```sh
+curl http://127.0.0.1:5000/__dufs__/health
+```
+
<details>
-<summary><h2>Advanced topics</h2></summary>
+<summary><h2>Advanced Topics</h2></summary>
### Access Control
dufs --assets my-assets-dir/
```
+> If you only need to make slight adjustments to the current UI, you copy dufs's [assets](https://github.com/sigoden/dufs/tree/main/assets) directory and modify it accordingly. The current UI doesn't use any frameworks, just plain HTML/JS/CSS. As long as you have some basic knowledge of web development, it shouldn't be difficult to modify.
+
Your assets folder must contains a `index.html` file.
`index.html` can use the following placeholder variables to retrieve internal data.
const BUF_SIZE: usize = 65536;
const EDITABLE_TEXT_MAX_SIZE: u64 = 4194304; // 4M
const RESUMABLE_UPLOAD_MIN_SIZE: u64 = 20971520; // 20M
+const HEALTH_CHECK_PATH: &str = "__dufs__/health";
pub struct Server {
args: Args,
if method == Method::GET
&& self
- .handle_assets(&relative_path, headers, &mut res)
+ .handle_internal(&relative_path, headers, &mut res)
.await?
{
return Ok(res);
Ok(())
}
- async fn handle_assets(
+ async fn handle_internal(
&self,
req_path: &str,
headers: &HeaderMap<HeaderValue>,
HeaderValue::from_static("nosniff"),
);
Ok(true)
+ } else if req_path == HEALTH_CHECK_PATH {
+ res.headers_mut()
+ .typed_insert(ContentType::from(mime_guess::mime::APPLICATION_JSON));
+
+ *res.body_mut() = body_full(r#"{"status":"OK"}"#);
+ Ok(true)
} else {
Ok(false)
}
--- /dev/null
+mod fixtures;
+mod utils;
+
+use fixtures::{server, Error, TestServer};
+use rstest::rstest;
+
+const HEALTH_CHECK_PATH: &str = "__dufs__/health";
+const HEALTH_CHECK_RESPONSE: &str = r#"{"status":"OK"}"#;
+
+#[rstest]
+fn normal_health(server: TestServer) -> Result<(), Error> {
+ let resp = reqwest::blocking::get(format!("{}{HEALTH_CHECK_PATH}", server.url()))?;
+ assert_eq!(resp.text()?, HEALTH_CHECK_RESPONSE);
+ Ok(())
+}
+
+#[rstest]
+fn auth_health(
+ #[with(&["--auth", "user:pass@/:rw", "-A"])] server: TestServer,
+) -> Result<(), Error> {
+ let resp = reqwest::blocking::get(format!("{}{HEALTH_CHECK_PATH}", server.url()))?;
+ assert_eq!(resp.text()?, HEALTH_CHECK_RESPONSE);
+ Ok(())
+}
+
+#[rstest]
+fn path_prefix_health(#[with(&["--path-prefix", "xyz"])] server: TestServer) -> Result<(), Error> {
+ let resp = reqwest::blocking::get(format!("{}xyz/{HEALTH_CHECK_PATH}", server.url()))?;
+ assert_eq!(resp.text()?, HEALTH_CHECK_RESPONSE);
+ Ok(())
+}