You've already forked authentication-service
mirror of
https://github.com/matrix-org/matrix-authentication-service.git
synced 2025-07-31 09:24:31 +03:00
Serve static files live from disk in dev mode
This commit is contained in:
54
Cargo.lock
generated
54
Cargo.lock
generated
@ -470,9 +470,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "axum"
|
name = "axum"
|
||||||
version = "0.5.3"
|
version = "0.5.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "f523b4e98ba6897ae90994bc18423d9877c54f9047b06a00ddc8122a957b1c70"
|
checksum = "f4af7447fc1214c1f3a1ace861d0216a6c8bb13965b64bbad9650f375b67689a"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"axum-core",
|
"axum-core",
|
||||||
@ -502,9 +502,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "axum-core"
|
name = "axum-core"
|
||||||
version = "0.2.2"
|
version = "0.2.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "d3ddbd16eabff8b45f21b98671fddcc93daaa7ac4c84f8473693437226040de5"
|
checksum = "3bdc19781b16e32f8a7200368a336fa4509d4b72ef15dd4e41df5290855ee1e6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-trait",
|
"async-trait",
|
||||||
"bytes 1.1.0",
|
"bytes 1.1.0",
|
||||||
@ -1626,9 +1626,9 @@ checksum = "0bfe8eed0a9285ef776bb792479ea3834e8b94e13d615c2f66d03dd50a435a29"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httparse"
|
name = "httparse"
|
||||||
version = "1.7.0"
|
version = "1.7.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "6330e8a36bd8c859f3fa6d9382911fbb7147ec39807f63b923933a247240b9ba"
|
checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "httpdate"
|
name = "httpdate"
|
||||||
@ -1989,6 +1989,7 @@ dependencies = [
|
|||||||
"mas-email",
|
"mas-email",
|
||||||
"mas-handlers",
|
"mas-handlers",
|
||||||
"mas-http",
|
"mas-http",
|
||||||
|
"mas-static-files",
|
||||||
"mas-storage",
|
"mas-storage",
|
||||||
"mas-tasks",
|
"mas-tasks",
|
||||||
"mas-templates",
|
"mas-templates",
|
||||||
@ -2096,7 +2097,6 @@ dependencies = [
|
|||||||
"mas-http",
|
"mas-http",
|
||||||
"mas-iana",
|
"mas-iana",
|
||||||
"mas-jose",
|
"mas-jose",
|
||||||
"mas-static-files",
|
|
||||||
"mas-storage",
|
"mas-storage",
|
||||||
"mas-templates",
|
"mas-templates",
|
||||||
"mime",
|
"mime",
|
||||||
@ -2213,10 +2213,12 @@ dependencies = [
|
|||||||
"axum",
|
"axum",
|
||||||
"headers",
|
"headers",
|
||||||
"http",
|
"http",
|
||||||
|
"http-body",
|
||||||
"mime_guess",
|
"mime_guess",
|
||||||
"rust-embed",
|
"rust-embed",
|
||||||
"tokio",
|
|
||||||
"tower",
|
"tower",
|
||||||
|
"tower-http",
|
||||||
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@ -2422,9 +2424,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "num-iter"
|
name = "num-iter"
|
||||||
version = "0.1.42"
|
version = "0.1.43"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b2021c8337a54d21aca0d59a92577a029af9431cb59b909b03252b9c164fad59"
|
checksum = "7d03e6c028c5dc5cac6e2dec0efda81fc887605bb3d884578bb6d6bf7514e252"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"autocfg",
|
"autocfg",
|
||||||
"num-integer",
|
"num-integer",
|
||||||
@ -2894,9 +2896,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-project-lite"
|
name = "pin-project-lite"
|
||||||
version = "0.2.8"
|
version = "0.2.9"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "e280fbe77cc62c91527259e9442153f4688736748d24660126286329742b4c6c"
|
checksum = "e0a7ae3ac2f1173085d398531c705756c94a4c56843785df85a60c1a0afac116"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "pin-utils"
|
name = "pin-utils"
|
||||||
@ -4009,9 +4011,9 @@ checksum = "42657b1a6f4d817cda8e7a0ace261fe0cc946cf3a80314390b22cc61ae080792"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tinyvec"
|
name = "tinyvec"
|
||||||
version = "1.5.1"
|
version = "1.6.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
|
checksum = "87cc5ceb3875bb20c2890005a4e226a4651264a5c75edb2421b52861a0a0cb50"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"tinyvec_macros",
|
"tinyvec_macros",
|
||||||
]
|
]
|
||||||
@ -4024,9 +4026,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio"
|
name = "tokio"
|
||||||
version = "1.17.0"
|
version = "1.18.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2af73ac49756f3f7c01172e34a23e5d0216f6c32333757c2c61feb2bbff5a5ee"
|
checksum = "0f48b6d60512a392e34dbf7fd456249fd2de3c83669ab642e021903f4015185b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"bytes 1.1.0",
|
"bytes 1.1.0",
|
||||||
"libc",
|
"libc",
|
||||||
@ -4192,9 +4194,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-http"
|
name = "tower-http"
|
||||||
version = "0.2.5"
|
version = "0.3.1"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "aba3f3efabf7fb41fae8534fc20a817013dd1c12cb45441efb6c82e6556b4cd8"
|
checksum = "f7755f984aa46a9d50829dc84b6a674b2f3b8b4de47c0708923953b090d48acc"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"async-compression",
|
"async-compression",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
@ -4204,7 +4206,11 @@ dependencies = [
|
|||||||
"http",
|
"http",
|
||||||
"http-body",
|
"http-body",
|
||||||
"http-range-header",
|
"http-range-header",
|
||||||
|
"httpdate",
|
||||||
"iri-string",
|
"iri-string",
|
||||||
|
"mime",
|
||||||
|
"mime_guess",
|
||||||
|
"percent-encoding",
|
||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"tokio",
|
"tokio",
|
||||||
"tokio-util 0.7.1",
|
"tokio-util 0.7.1",
|
||||||
@ -4251,9 +4257,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-attributes"
|
name = "tracing-attributes"
|
||||||
version = "0.1.20"
|
version = "0.1.21"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "2e65ce065b4b5c53e73bb28912318cb8c9e9ad3921f1d669eb0e68b4c8143a2b"
|
checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"proc-macro2",
|
"proc-macro2",
|
||||||
"quote",
|
"quote",
|
||||||
@ -4282,9 +4288,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tracing-log"
|
name = "tracing-log"
|
||||||
version = "0.1.2"
|
version = "0.1.3"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a6923477a48e41c1951f1999ef8bb5a3023eb723ceadafe78ffb65dc366761e3"
|
checksum = "78ddad33d2d10b1ed7eb9d1f518a5674713876e97e5bb9b7345a7984fbb4f922"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"log",
|
"log",
|
||||||
@ -4421,9 +4427,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-bidi"
|
name = "unicode-bidi"
|
||||||
version = "0.3.7"
|
version = "0.3.8"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
|
checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "unicode-normalization"
|
name = "unicode-normalization"
|
||||||
|
@ -7,7 +7,7 @@ license = "Apache-2.0"
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
async-trait = "0.1.53"
|
async-trait = "0.1.53"
|
||||||
axum = { version = "0.5.3", features = ["headers"] }
|
axum = { version = "0.5.4", features = ["headers"] }
|
||||||
bincode = "1.3.3"
|
bincode = "1.3.3"
|
||||||
chrono = "0.4.19"
|
chrono = "0.4.19"
|
||||||
cookie = { version = "0.16.0", features = ["private", "percent-encode"] }
|
cookie = { version = "0.16.0", features = ["private", "percent-encode"] }
|
||||||
@ -24,7 +24,7 @@ serde_urlencoded = "0.7.1"
|
|||||||
serde_json = "1.0.79"
|
serde_json = "1.0.79"
|
||||||
sqlx = "0.5.13"
|
sqlx = "0.5.13"
|
||||||
thiserror = "1.0.30"
|
thiserror = "1.0.30"
|
||||||
tokio = "1.17.0"
|
tokio = "1.18.0"
|
||||||
tower = { version = "0.4.12", features = ["util"] }
|
tower = { version = "0.4.12", features = ["util"] }
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
url = "2.2.2"
|
url = "2.2.2"
|
||||||
|
@ -6,7 +6,7 @@ edition = "2021"
|
|||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = { version = "1.17.0", features = ["full"] }
|
tokio = { version = "1.18.0", features = ["full"] }
|
||||||
futures = "0.3.21"
|
futures = "0.3.21"
|
||||||
anyhow = "1.0.57"
|
anyhow = "1.0.57"
|
||||||
clap = { version = "3.1.12", features = ["derive"] }
|
clap = { version = "3.1.12", features = ["derive"] }
|
||||||
@ -32,21 +32,22 @@ opentelemetry-jaeger = { version = "0.16.0", features = ["rt-tokio", "reqwest_co
|
|||||||
opentelemetry-otlp = { version = "0.10.0", features = ["trace", "metrics"], optional = true }
|
opentelemetry-otlp = { version = "0.10.0", features = ["trace", "metrics"], optional = true }
|
||||||
opentelemetry-zipkin = { version = "0.15.0", features = ["reqwest-client", "reqwest-rustls"], default-features = false, optional = true }
|
opentelemetry-zipkin = { version = "0.15.0", features = ["reqwest-client", "reqwest-rustls"], default-features = false, optional = true }
|
||||||
|
|
||||||
|
mas-axum-utils = { path = "../axum-utils" }
|
||||||
mas-config = { path = "../config" }
|
mas-config = { path = "../config" }
|
||||||
mas-email = { path = "../email" }
|
mas-email = { path = "../email" }
|
||||||
mas-handlers = { path = "../handlers" }
|
mas-handlers = { path = "../handlers" }
|
||||||
mas-http = { path = "../http" }
|
mas-http = { path = "../http" }
|
||||||
|
mas-static-files = { path = "../static-files" }
|
||||||
mas-storage = { path = "../storage" }
|
mas-storage = { path = "../storage" }
|
||||||
mas-tasks = { path = "../tasks" }
|
mas-tasks = { path = "../tasks" }
|
||||||
mas-templates = { path = "../templates" }
|
mas-templates = { path = "../templates" }
|
||||||
mas-axum-utils = { path = "../axum-utils" }
|
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
indoc = "1.0.4"
|
indoc = "1.0.4"
|
||||||
|
|
||||||
[features]
|
[features]
|
||||||
default = ["otlp", "jaeger", "zipkin"]
|
default = ["otlp", "jaeger", "zipkin"]
|
||||||
dev = ["mas-templates/dev", "mas-handlers/dev"]
|
dev = ["mas-templates/dev", "mas-static-files/dev"]
|
||||||
# Enable OpenTelemetry OTLP exporter. Requires "protoc"
|
# Enable OpenTelemetry OTLP exporter. Requires "protoc"
|
||||||
otlp = ["opentelemetry-otlp"]
|
otlp = ["opentelemetry-otlp"]
|
||||||
# Enable OpenTelemetry Jaeger exporter and propagator.
|
# Enable OpenTelemetry Jaeger exporter and propagator.
|
||||||
|
@ -194,6 +194,8 @@ impl Options {
|
|||||||
|
|
||||||
let url_builder = UrlBuilder::new(config.http.public_base.clone());
|
let url_builder = UrlBuilder::new(config.http.public_base.clone());
|
||||||
|
|
||||||
|
let static_files = mas_static_files::service(&config.http.web_root);
|
||||||
|
|
||||||
// Explicitely the config to properly zeroize secret keys
|
// Explicitely the config to properly zeroize secret keys
|
||||||
drop(config);
|
drop(config);
|
||||||
|
|
||||||
@ -217,6 +219,7 @@ impl Options {
|
|||||||
&mailer,
|
&mailer,
|
||||||
&url_builder,
|
&url_builder,
|
||||||
)
|
)
|
||||||
|
.fallback(static_files)
|
||||||
.layer(ServerLayer::default());
|
.layer(ServerLayer::default());
|
||||||
|
|
||||||
info!("Listening on http://{}", listener.local_addr().unwrap());
|
info!("Listening on http://{}", listener.local_addr().unwrap());
|
||||||
|
@ -6,7 +6,7 @@ edition = "2021"
|
|||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = { version = "1.17.0", features = [] }
|
tokio = { version = "1.18.0", features = [] }
|
||||||
tracing = { version = "0.1.34", features = ["log"] }
|
tracing = { version = "0.1.34", features = ["log"] }
|
||||||
async-trait = "0.1.53"
|
async-trait = "0.1.53"
|
||||||
|
|
||||||
|
@ -8,7 +8,7 @@ license = "Apache-2.0"
|
|||||||
[dependencies]
|
[dependencies]
|
||||||
anyhow = "1.0.57"
|
anyhow = "1.0.57"
|
||||||
async-trait = "0.1.53"
|
async-trait = "0.1.53"
|
||||||
tokio = { version = "1.17.0", features = ["macros"] }
|
tokio = { version = "1.18.0", features = ["macros"] }
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
aws-sdk-sesv2 = "0.10.1"
|
aws-sdk-sesv2 = "0.10.1"
|
||||||
aws-config = "0.10.1"
|
aws-config = "0.10.1"
|
||||||
|
@ -5,12 +5,9 @@ authors = ["Quentin Gliech <quenting@element.io>"]
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[features]
|
|
||||||
dev = ["mas-static-files/dev", "mas-templates/dev"]
|
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
# Async runtime
|
# Async runtime
|
||||||
tokio = { version = "1.17.0", features = ["macros"] }
|
tokio = { version = "1.18.0", features = ["macros"] }
|
||||||
|
|
||||||
# Logging and tracing
|
# Logging and tracing
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
@ -22,8 +19,8 @@ anyhow = "1.0.57"
|
|||||||
# Web server
|
# Web server
|
||||||
hyper = { version = "0.14.18", features = ["full"] }
|
hyper = { version = "0.14.18", features = ["full"] }
|
||||||
tower = "0.4.12"
|
tower = "0.4.12"
|
||||||
tower-http = { version = "0.2.5", features = ["cors"] }
|
tower-http = { version = "0.3.1", features = ["cors"] }
|
||||||
axum = "0.5.3"
|
axum = "0.5.4"
|
||||||
axum-macros = "0.2.0"
|
axum-macros = "0.2.0"
|
||||||
|
|
||||||
# Emails
|
# Emails
|
||||||
@ -64,7 +61,6 @@ mas-email = { path = "../email" }
|
|||||||
mas-http = { path = "../http" }
|
mas-http = { path = "../http" }
|
||||||
mas-iana = { path = "../iana" }
|
mas-iana = { path = "../iana" }
|
||||||
mas-jose = { path = "../jose" }
|
mas-jose = { path = "../jose" }
|
||||||
mas-static-files = { path = "../static-files" }
|
|
||||||
mas-storage = { path = "../storage" }
|
mas-storage = { path = "../storage" }
|
||||||
mas-templates = { path = "../templates" }
|
mas-templates = { path = "../templates" }
|
||||||
|
|
||||||
|
@ -125,7 +125,6 @@ where
|
|||||||
get(self::oauth2::authorization::step_get),
|
get(self::oauth2::authorization::step_get),
|
||||||
)
|
)
|
||||||
.merge(api_router)
|
.merge(api_router)
|
||||||
.fallback(mas_static_files::Assets)
|
|
||||||
.layer(Extension(pool.clone()))
|
.layer(Extension(pool.clone()))
|
||||||
.layer(Extension(templates.clone()))
|
.layer(Extension(templates.clone()))
|
||||||
.layer(Extension(key_store.clone()))
|
.layer(Extension(key_store.clone()))
|
||||||
|
@ -6,7 +6,7 @@ edition = "2021"
|
|||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
axum = "0.5.3"
|
axum = "0.5.4"
|
||||||
bytes = "1.1.0"
|
bytes = "1.1.0"
|
||||||
futures-util = "0.3.21"
|
futures-util = "0.3.21"
|
||||||
headers = "0.3.7"
|
headers = "0.3.7"
|
||||||
@ -22,8 +22,8 @@ rustls = "0.20.4"
|
|||||||
serde = "1.0.136"
|
serde = "1.0.136"
|
||||||
serde_json = "1.0.79"
|
serde_json = "1.0.79"
|
||||||
thiserror = "1.0.30"
|
thiserror = "1.0.30"
|
||||||
tokio = { version = "1.17.0", features = ["sync", "parking_lot"] }
|
tokio = { version = "1.18.0", features = ["sync", "parking_lot"] }
|
||||||
tower = { version = "0.4.12", features = ["timeout", "limit"] }
|
tower = { version = "0.4.12", features = ["timeout", "limit"] }
|
||||||
tower-http = { version = "0.2.5", features = ["follow-redirect", "decompression-full", "set-header", "compression-full", "cors"] }
|
tower-http = { version = "0.3.1", features = ["follow-redirect", "decompression-full", "set-header", "compression-full", "cors"] }
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
tracing-opentelemetry = "0.17.2"
|
tracing-opentelemetry = "0.17.2"
|
||||||
|
@ -13,6 +13,6 @@ csv = "1.1.6"
|
|||||||
futures-util = "0.3.21"
|
futures-util = "0.3.21"
|
||||||
reqwest = { version = "0.11.10", features = ["blocking", "rustls-tls"], default-features = false }
|
reqwest = { version = "0.11.10", features = ["blocking", "rustls-tls"], default-features = false }
|
||||||
serde = { version = "1.0.136", features = ["derive"] }
|
serde = { version = "1.0.136", features = ["derive"] }
|
||||||
tokio = { version = "1.17.0", features = ["full"] }
|
tokio = { version = "1.18.0", features = ["full"] }
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
tracing-subscriber = "0.3.11"
|
tracing-subscriber = "0.3.11"
|
||||||
|
@ -30,7 +30,7 @@ serde_with = { version = "1.13.0", features = ["base64"] }
|
|||||||
sha2 = "0.10.2"
|
sha2 = "0.10.2"
|
||||||
signature = "1.4.0"
|
signature = "1.4.0"
|
||||||
thiserror = "1.0.30"
|
thiserror = "1.0.30"
|
||||||
tokio = { version = "1.17.0", features = ["macros", "rt", "sync"] }
|
tokio = { version = "1.18.0", features = ["macros", "rt", "sync"] }
|
||||||
tower = { version = "0.4.12", features = ["util"] }
|
tower = { version = "0.4.12", features = ["util"] }
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
url = { version = "2.2.2", features = ["serde"] }
|
url = { version = "2.2.2", features = ["serde"] }
|
||||||
|
@ -9,10 +9,12 @@ license = "Apache-2.0"
|
|||||||
dev = []
|
dev = []
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
axum = "0.5.3"
|
axum = "0.5.4"
|
||||||
headers = "0.3.7"
|
headers = "0.3.7"
|
||||||
http = "0.2.6"
|
http = "0.2.6"
|
||||||
|
http-body = "0.4.4"
|
||||||
mime_guess = "2.0.4"
|
mime_guess = "2.0.4"
|
||||||
rust-embed = "6.4.0"
|
rust-embed = "6.4.0"
|
||||||
tokio = { version = "1.17.0", features = ["fs"] }
|
|
||||||
tower = "0.4.12"
|
tower = "0.4.12"
|
||||||
|
tower-http = { version = "0.3.1", features = ["fs"] }
|
||||||
|
tracing = "0.1.34"
|
||||||
|
128
crates/static-files/package-lock.json
generated
128
crates/static-files/package-lock.json
generated
@ -182,9 +182,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/browserslist": {
|
"node_modules/browserslist": {
|
||||||
"version": "4.20.2",
|
"version": "4.20.3",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
|
||||||
"integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
|
"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -197,10 +197,10 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"caniuse-lite": "^1.0.30001317",
|
"caniuse-lite": "^1.0.30001332",
|
||||||
"electron-to-chromium": "^1.4.84",
|
"electron-to-chromium": "^1.4.118",
|
||||||
"escalade": "^3.1.1",
|
"escalade": "^3.1.1",
|
||||||
"node-releases": "^2.0.2",
|
"node-releases": "^2.0.3",
|
||||||
"picocolors": "^1.0.0"
|
"picocolors": "^1.0.0"
|
||||||
},
|
},
|
||||||
"bin": {
|
"bin": {
|
||||||
@ -496,9 +496,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/dom-serializer": {
|
"node_modules/dom-serializer": {
|
||||||
"version": "1.3.2",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"domelementtype": "^2.0.1",
|
"domelementtype": "^2.0.1",
|
||||||
@ -510,9 +510,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/domelementtype": {
|
"node_modules/domelementtype": {
|
||||||
"version": "2.2.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"funding": [
|
"funding": [
|
||||||
{
|
{
|
||||||
@ -551,9 +551,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/electron-to-chromium": {
|
"node_modules/electron-to-chromium": {
|
||||||
"version": "1.4.86",
|
"version": "1.4.123",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.86.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.123.tgz",
|
||||||
"integrity": "sha512-EVTZ+igi8x63pK4bPuA95PXIs2b2Cowi3WQwI9f9qManLiZJOD1Lash1J3W4TvvcUCcIR4o/rgi9o8UicXSO+w==",
|
"integrity": "sha512-0pHGE53WkYoFbsgwYcVKEpWa6jbzlvkohIEA2CUoZ9b5KC+w/zlMiQHvW/4IBcOh7YoEFqRNavgTk02TBoUTUw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/entities": {
|
"node_modules/entities": {
|
||||||
@ -693,9 +693,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/is-core-module": {
|
"node_modules/is-core-module": {
|
||||||
"version": "2.8.1",
|
"version": "2.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
|
||||||
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
|
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"has": "^1.0.3"
|
"has": "^1.0.3"
|
||||||
@ -771,22 +771,22 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/micromatch": {
|
"node_modules/micromatch": {
|
||||||
"version": "4.0.4",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
||||||
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
|
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"braces": "^3.0.1",
|
"braces": "^3.0.2",
|
||||||
"picomatch": "^2.2.3"
|
"picomatch": "^2.3.1"
|
||||||
},
|
},
|
||||||
"engines": {
|
"engines": {
|
||||||
"node": ">=8.6"
|
"node": ">=8.6"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/mini-svg-data-uri": {
|
"node_modules/mini-svg-data-uri": {
|
||||||
"version": "1.4.3",
|
"version": "1.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
|
||||||
"integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==",
|
"integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"mini-svg-data-uri": "cli.js"
|
"mini-svg-data-uri": "cli.js"
|
||||||
@ -799,9 +799,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/nanoid": {
|
"node_modules/nanoid": {
|
||||||
"version": "3.3.1",
|
"version": "3.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
|
||||||
"integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
|
"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"bin": {
|
"bin": {
|
||||||
"nanoid": "bin/nanoid.cjs"
|
"nanoid": "bin/nanoid.cjs"
|
||||||
@ -811,9 +811,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"node_modules/node-releases": {
|
"node_modules/node-releases": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz",
|
||||||
"integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
|
"integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node_modules/normalize-path": {
|
"node_modules/normalize-path": {
|
||||||
@ -1765,15 +1765,15 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"browserslist": {
|
"browserslist": {
|
||||||
"version": "4.20.2",
|
"version": "4.20.3",
|
||||||
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.2.tgz",
|
"resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.20.3.tgz",
|
||||||
"integrity": "sha512-CQOBCqp/9pDvDbx3xfMi+86pr4KXIf2FDkTTdeuYw8OxS9t898LA1Khq57gtufFILXpfgsSx5woNgsBgvGjpsA==",
|
"integrity": "sha512-NBhymBQl1zM0Y5dQT/O+xiLP9/rzOIQdKM/eMJBAq7yBgaB6krIYLGejrwVYnSHZdqjscB1SPuAjHwxjvN6Wdg==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"caniuse-lite": "^1.0.30001317",
|
"caniuse-lite": "^1.0.30001332",
|
||||||
"electron-to-chromium": "^1.4.84",
|
"electron-to-chromium": "^1.4.118",
|
||||||
"escalade": "^3.1.1",
|
"escalade": "^3.1.1",
|
||||||
"node-releases": "^2.0.2",
|
"node-releases": "^2.0.3",
|
||||||
"picocolors": "^1.0.0"
|
"picocolors": "^1.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
@ -1982,9 +1982,9 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"dom-serializer": {
|
"dom-serializer": {
|
||||||
"version": "1.3.2",
|
"version": "1.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.3.2.tgz",
|
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
|
||||||
"integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==",
|
"integrity": "sha512-VHwB3KfrcOOkelEG2ZOfxqLZdfkil8PtJi4P8N2MMXucZq2yLp75ClViUlOVwyoHEDjYU433Aq+5zWP61+RGag==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"domelementtype": "^2.0.1",
|
"domelementtype": "^2.0.1",
|
||||||
@ -1993,9 +1993,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"domelementtype": {
|
"domelementtype": {
|
||||||
"version": "2.2.0",
|
"version": "2.3.0",
|
||||||
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.2.0.tgz",
|
"resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz",
|
||||||
"integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==",
|
"integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"domhandler": {
|
"domhandler": {
|
||||||
@ -2019,9 +2019,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"electron-to-chromium": {
|
"electron-to-chromium": {
|
||||||
"version": "1.4.86",
|
"version": "1.4.123",
|
||||||
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.86.tgz",
|
"resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.123.tgz",
|
||||||
"integrity": "sha512-EVTZ+igi8x63pK4bPuA95PXIs2b2Cowi3WQwI9f9qManLiZJOD1Lash1J3W4TvvcUCcIR4o/rgi9o8UicXSO+w==",
|
"integrity": "sha512-0pHGE53WkYoFbsgwYcVKEpWa6jbzlvkohIEA2CUoZ9b5KC+w/zlMiQHvW/4IBcOh7YoEFqRNavgTk02TBoUTUw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"entities": {
|
"entities": {
|
||||||
@ -2125,9 +2125,9 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"is-core-module": {
|
"is-core-module": {
|
||||||
"version": "2.8.1",
|
"version": "2.9.0",
|
||||||
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.8.1.tgz",
|
"resolved": "https://registry.npmjs.org/is-core-module/-/is-core-module-2.9.0.tgz",
|
||||||
"integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==",
|
"integrity": "sha512-+5FPy5PnwmO3lvfMb0AsoPaBG+5KHUI0wYFXOtYPnVVVspTFUuMZNfNaNVRt3FZadstu2c8x23vykRW/NBoU6A==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"has": "^1.0.3"
|
"has": "^1.0.3"
|
||||||
@ -2185,19 +2185,19 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"micromatch": {
|
"micromatch": {
|
||||||
"version": "4.0.4",
|
"version": "4.0.5",
|
||||||
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz",
|
"resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz",
|
||||||
"integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==",
|
"integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==",
|
||||||
"dev": true,
|
"dev": true,
|
||||||
"requires": {
|
"requires": {
|
||||||
"braces": "^3.0.1",
|
"braces": "^3.0.2",
|
||||||
"picomatch": "^2.2.3"
|
"picomatch": "^2.3.1"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"mini-svg-data-uri": {
|
"mini-svg-data-uri": {
|
||||||
"version": "1.4.3",
|
"version": "1.4.4",
|
||||||
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.3.tgz",
|
"resolved": "https://registry.npmjs.org/mini-svg-data-uri/-/mini-svg-data-uri-1.4.4.tgz",
|
||||||
"integrity": "sha512-gSfqpMRC8IxghvMcxzzmMnWpXAChSA+vy4cia33RgerMS8Fex95akUyQZPbxJJmeBGiGmK7n/1OpUX8ksRjIdA==",
|
"integrity": "sha512-r9deDe9p5FJUPZAk3A59wGH7Ii9YrjjWw0jmw/liSbHl2CHiyXj6FcDXDu2K3TjVAXqiJdaw3xxwlZZr9E6nHg==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"minimist": {
|
"minimist": {
|
||||||
@ -2207,15 +2207,15 @@
|
|||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"nanoid": {
|
"nanoid": {
|
||||||
"version": "3.3.1",
|
"version": "3.3.3",
|
||||||
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.1.tgz",
|
"resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.3.tgz",
|
||||||
"integrity": "sha512-n6Vs/3KGyxPQd6uO0eH4Bv0ojGSUvuLlIHtC3Y0kEO23YRge8H9x1GCzLn28YX0H66pMkxuaeESFq4tKISKwdw==",
|
"integrity": "sha512-p1sjXuopFs0xg+fPASzQ28agW1oHD7xDsd9Xkf3T15H3c/cifrFHVwrh74PdoklAPi+i7MdRsE47vm2r6JoB+w==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"node-releases": {
|
"node-releases": {
|
||||||
"version": "2.0.2",
|
"version": "2.0.3",
|
||||||
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.2.tgz",
|
"resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.3.tgz",
|
||||||
"integrity": "sha512-XxYDdcQ6eKqp/YjI+tb2C5WM2LgjnZrfYg4vgQt49EK268b6gYCHsBLrK2qvJo4FmCtqmKezb0WZFK4fkrZNsg==",
|
"integrity": "sha512-maHFz6OLqYxz+VQyCAtA3PTX4UP/53pa05fyDNc9CwjvJ0yEh6+xBwKsgCxMNhS8taUKBFYxfuiaD9U/55iFaw==",
|
||||||
"dev": true
|
"dev": true
|
||||||
},
|
},
|
||||||
"normalize-path": {
|
"normalize-path": {
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
// Copyright 2021 The Matrix.org Foundation C.I.C.
|
// Copyright 2021, 2022 The Matrix.org Foundation C.I.C.
|
||||||
//
|
//
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
// you may not use this file except in compliance with the License.
|
// you may not use this file except in compliance with the License.
|
||||||
@ -18,99 +18,157 @@
|
|||||||
#![deny(clippy::all, missing_docs, rustdoc::broken_intra_doc_links)]
|
#![deny(clippy::all, missing_docs, rustdoc::broken_intra_doc_links)]
|
||||||
#![warn(clippy::pedantic)]
|
#![warn(clippy::pedantic)]
|
||||||
|
|
||||||
use std::{
|
#[cfg(not(feature = "dev"))]
|
||||||
convert::Infallible,
|
mod builtin {
|
||||||
future::{ready, Ready},
|
use std::{
|
||||||
};
|
fmt::Write,
|
||||||
|
future::{ready, Ready},
|
||||||
|
};
|
||||||
|
|
||||||
use axum::{
|
use axum::{
|
||||||
response::{IntoResponse, Response},
|
response::{IntoResponse, Response},
|
||||||
TypedHeader,
|
TypedHeader,
|
||||||
};
|
};
|
||||||
use headers::{ContentLength, ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
use headers::{ContentLength, ContentType, ETag, HeaderMapExt, IfNoneMatch};
|
||||||
use http::{Method, Request, StatusCode};
|
use http::{Method, Request, StatusCode};
|
||||||
use rust_embed::RustEmbed;
|
use rust_embed::RustEmbed;
|
||||||
use tower::Service;
|
use tower::Service;
|
||||||
|
|
||||||
// TODO: read the assets live from the filesystem
|
/// Embedded public assets
|
||||||
|
#[derive(RustEmbed, Clone, Debug)]
|
||||||
|
#[folder = "public/"]
|
||||||
|
pub struct Assets;
|
||||||
|
|
||||||
/// Embedded public assets
|
impl Assets {
|
||||||
#[derive(RustEmbed, Clone)]
|
fn get_response(
|
||||||
#[folder = "public/"]
|
is_head: bool,
|
||||||
pub struct Assets;
|
path: &str,
|
||||||
|
if_none_match: Option<IfNoneMatch>,
|
||||||
|
) -> Option<Response> {
|
||||||
|
let asset = Self::get(path)?;
|
||||||
|
|
||||||
impl Assets {
|
let etag = {
|
||||||
fn get_response(
|
let hash = asset.metadata.sha256_hash();
|
||||||
is_head: bool,
|
let mut buf = String::with_capacity(2 + hash.len() * 2);
|
||||||
path: &str,
|
write!(buf, "\"").unwrap();
|
||||||
if_none_match: Option<IfNoneMatch>,
|
for byte in hash {
|
||||||
) -> Option<Response> {
|
write!(buf, "{:02x}", byte).unwrap();
|
||||||
let asset = Self::get(path)?;
|
}
|
||||||
|
write!(buf, "\"").unwrap();
|
||||||
|
buf
|
||||||
|
};
|
||||||
|
let etag: ETag = etag.parse().unwrap();
|
||||||
|
|
||||||
let etag: String = asset
|
if let Some(if_none_match) = if_none_match {
|
||||||
.metadata
|
if if_none_match.precondition_passes(&etag) {
|
||||||
.sha256_hash()
|
return Some(StatusCode::NOT_MODIFIED.into_response());
|
||||||
.iter()
|
}
|
||||||
.map(|x| format!("{:02x}", x))
|
|
||||||
.collect();
|
|
||||||
let etag: ETag = format!("\"{}\"", etag).parse().unwrap();
|
|
||||||
|
|
||||||
if let Some(if_none_match) = if_none_match {
|
|
||||||
if if_none_match.precondition_passes(&etag) {
|
|
||||||
return Some(StatusCode::NOT_MODIFIED.into_response());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let len = asset.data.len().try_into().unwrap();
|
||||||
|
let mime = mime_guess::from_path(path).first_or_octet_stream();
|
||||||
|
|
||||||
|
let res = if is_head {
|
||||||
|
(
|
||||||
|
StatusCode::OK,
|
||||||
|
TypedHeader(ContentType::from(mime)),
|
||||||
|
TypedHeader(ContentLength(len)),
|
||||||
|
TypedHeader(etag),
|
||||||
|
)
|
||||||
|
.into_response()
|
||||||
|
} else {
|
||||||
|
(
|
||||||
|
StatusCode::OK,
|
||||||
|
TypedHeader(ContentType::from(mime)),
|
||||||
|
TypedHeader(ContentLength(len)),
|
||||||
|
TypedHeader(etag),
|
||||||
|
asset.data,
|
||||||
|
)
|
||||||
|
.into_response()
|
||||||
|
};
|
||||||
|
|
||||||
|
Some(res)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<B> Service<Request<B>> for Assets {
|
||||||
|
type Response = Response;
|
||||||
|
type Error = std::io::Error;
|
||||||
|
type Future = Ready<Result<Self::Response, Self::Error>>;
|
||||||
|
|
||||||
|
fn poll_ready(
|
||||||
|
&mut self,
|
||||||
|
_cx: &mut std::task::Context<'_>,
|
||||||
|
) -> std::task::Poll<Result<(), Self::Error>> {
|
||||||
|
std::task::Poll::Ready(Ok(()))
|
||||||
}
|
}
|
||||||
|
|
||||||
let len = asset.data.len().try_into().unwrap();
|
fn call(&mut self, req: Request<B>) -> Self::Future {
|
||||||
let mime = mime_guess::from_path(path).first_or_octet_stream();
|
let (parts, _body) = req.into_parts();
|
||||||
|
let path = parts.uri.path().trim_start_matches('/');
|
||||||
|
let if_none_match = parts.headers.typed_get();
|
||||||
|
let is_head = match parts.method {
|
||||||
|
Method::GET => false,
|
||||||
|
Method::HEAD => true,
|
||||||
|
_ => return ready(Ok(StatusCode::METHOD_NOT_ALLOWED.into_response())),
|
||||||
|
};
|
||||||
|
|
||||||
let res = if is_head {
|
// TODO: support range requests
|
||||||
(
|
let response = Self::get_response(is_head, path, if_none_match)
|
||||||
StatusCode::OK,
|
.unwrap_or_else(|| StatusCode::NOT_FOUND.into_response());
|
||||||
TypedHeader(ContentType::from(mime)),
|
ready(Ok(response))
|
||||||
TypedHeader(ContentLength(len)),
|
}
|
||||||
TypedHeader(etag),
|
}
|
||||||
)
|
|
||||||
.into_response()
|
|
||||||
} else {
|
|
||||||
(
|
|
||||||
StatusCode::OK,
|
|
||||||
TypedHeader(ContentType::from(mime)),
|
|
||||||
TypedHeader(ContentLength(len)),
|
|
||||||
TypedHeader(etag),
|
|
||||||
asset.data,
|
|
||||||
)
|
|
||||||
.into_response()
|
|
||||||
};
|
|
||||||
|
|
||||||
Some(res)
|
/// Serve static files
|
||||||
|
#[must_use]
|
||||||
|
pub fn service() -> Assets {
|
||||||
|
Assets
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl<B> Service<Request<B>> for Assets {
|
#[cfg(feature = "dev")]
|
||||||
type Response = Response;
|
mod builtin {
|
||||||
type Error = Infallible;
|
use std::path::PathBuf;
|
||||||
type Future = Ready<Result<Self::Response, Self::Error>>;
|
|
||||||
|
|
||||||
fn poll_ready(
|
use tower_http::services::ServeDir;
|
||||||
&mut self,
|
|
||||||
_cx: &mut std::task::Context<'_>,
|
|
||||||
) -> std::task::Poll<Result<(), Self::Error>> {
|
|
||||||
std::task::Poll::Ready(Ok(()))
|
|
||||||
}
|
|
||||||
|
|
||||||
fn call(&mut self, req: Request<B>) -> Self::Future {
|
/// Serve static files in dev mode
|
||||||
let path = req.uri().path().trim_start_matches('/');
|
#[must_use]
|
||||||
let if_none_match = req.headers().typed_get();
|
pub fn service() -> ServeDir {
|
||||||
let is_head = match *req.method() {
|
let path = PathBuf::from(format!("{}/public", env!("CARGO_MANIFEST_DIR")));
|
||||||
Method::GET => false,
|
ServeDir::new(path).append_index_html_on_directories(false)
|
||||||
Method::HEAD => true,
|
|
||||||
_ => return ready(Ok(StatusCode::METHOD_NOT_ALLOWED.into_response())),
|
|
||||||
};
|
|
||||||
|
|
||||||
// TODO: support range requests
|
|
||||||
let response = Self::get_response(is_head, path, if_none_match)
|
|
||||||
.unwrap_or_else(|| StatusCode::NOT_FOUND.into_response());
|
|
||||||
ready(Ok(response))
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
use std::{convert::Infallible, future::ready, path::PathBuf};
|
||||||
|
|
||||||
|
use axum::{
|
||||||
|
body::HttpBody,
|
||||||
|
response::Response,
|
||||||
|
routing::{on_service, MethodFilter},
|
||||||
|
};
|
||||||
|
use http::{Request, StatusCode};
|
||||||
|
use tower::{util::BoxCloneService, ServiceExt};
|
||||||
|
use tower_http::services::ServeDir;
|
||||||
|
|
||||||
|
/// Serve static files
|
||||||
|
#[must_use]
|
||||||
|
pub fn service<B: HttpBody + Send + 'static>(
|
||||||
|
path: &Option<PathBuf>,
|
||||||
|
) -> BoxCloneService<Request<B>, Response, Infallible> {
|
||||||
|
let builtin = self::builtin::service();
|
||||||
|
|
||||||
|
let svc = if let Some(path) = path {
|
||||||
|
// TODO: fallback seems to have issues
|
||||||
|
let handler = ServeDir::new(path)
|
||||||
|
.append_index_html_on_directories(false)
|
||||||
|
.fallback(builtin);
|
||||||
|
on_service(MethodFilter::HEAD | MethodFilter::GET, handler)
|
||||||
|
} else {
|
||||||
|
on_service(MethodFilter::HEAD | MethodFilter::GET, builtin)
|
||||||
|
};
|
||||||
|
|
||||||
|
svc.handle_error(|_| ready(StatusCode::INTERNAL_SERVER_ERROR))
|
||||||
|
.boxed_clone()
|
||||||
|
}
|
||||||
|
@ -6,7 +6,7 @@ edition = "2021"
|
|||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = "1.17.0"
|
tokio = "1.18.0"
|
||||||
sqlx = { version = "0.5.13", features = ["runtime-tokio-rustls", "postgres", "migrate", "chrono", "offline", "json"] }
|
sqlx = { version = "0.5.13", features = ["runtime-tokio-rustls", "postgres", "migrate", "chrono", "offline", "json"] }
|
||||||
chrono = { version = "0.4.19", features = ["serde"] }
|
chrono = { version = "0.4.19", features = ["serde"] }
|
||||||
serde = { version = "1.0.136", features = ["derive"] }
|
serde = { version = "1.0.136", features = ["derive"] }
|
||||||
|
@ -6,7 +6,7 @@ edition = "2021"
|
|||||||
license = "Apache-2.0"
|
license = "Apache-2.0"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tokio = "1.17.0"
|
tokio = "1.18.0"
|
||||||
async-trait = "0.1.53"
|
async-trait = "0.1.53"
|
||||||
tokio-stream = "0.1.8"
|
tokio-stream = "0.1.8"
|
||||||
futures-util = "0.3.21"
|
futures-util = "0.3.21"
|
||||||
|
@ -10,7 +10,7 @@ dev = []
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
tracing = "0.1.34"
|
tracing = "0.1.34"
|
||||||
tokio = { version = "1.17.0", features = ["macros"] }
|
tokio = { version = "1.18.0", features = ["macros"] }
|
||||||
|
|
||||||
anyhow = "1.0.57"
|
anyhow = "1.0.57"
|
||||||
thiserror = "1.0.30"
|
thiserror = "1.0.30"
|
||||||
|
Reference in New Issue
Block a user