remove svg rasterization
Signed-off-by: eternal-flame-AD <yume@yumechi.jp>
This commit is contained in:
parent
f86c7d69db
commit
2e12350abc
8 changed files with 209 additions and 410 deletions
375
Cargo.lock
generated
375
Cargo.lock
generated
|
@ -137,12 +137,6 @@ dependencies = [
|
|||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "arrayref"
|
||||
version = "0.3.9"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "76a2e8124351fda1ef8aaaa3bbd7ebbcb486bbcd4225aca0aa0d84bb2db8fecb"
|
||||
|
||||
[[package]]
|
||||
name = "arrayvec"
|
||||
version = "0.7.6"
|
||||
|
@ -151,9 +145,9 @@ checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50"
|
|||
|
||||
[[package]]
|
||||
name = "async-compression"
|
||||
version = "0.4.17"
|
||||
version = "0.4.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0cb8f1d480b0ea3783ab015936d2a55c87e219676f0c0b7dec61494043f21857"
|
||||
checksum = "df895a515f70646414f4b45c0b79082783b80552b373a68283012928df56f522"
|
||||
dependencies = [
|
||||
"brotli",
|
||||
"flate2",
|
||||
|
@ -237,7 +231,7 @@ dependencies = [
|
|||
"serde_json",
|
||||
"serde_path_to_error",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper 1.0.1",
|
||||
"sync_wrapper 1.0.2",
|
||||
"tokio",
|
||||
"tower 0.5.1",
|
||||
"tower-layer",
|
||||
|
@ -259,7 +253,7 @@ dependencies = [
|
|||
"mime",
|
||||
"pin-project-lite",
|
||||
"rustversion",
|
||||
"sync_wrapper 1.0.1",
|
||||
"sync_wrapper 1.0.2",
|
||||
"tower-layer",
|
||||
"tower-service",
|
||||
]
|
||||
|
@ -357,9 +351,9 @@ checksum = "79296716171880943b8470b5f8d03aa55eb2e645a4874bdbb28adb49162e012c"
|
|||
|
||||
[[package]]
|
||||
name = "bytemuck"
|
||||
version = "1.19.0"
|
||||
version = "1.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8334215b81e418a0a7bdb8ef0849474f40bb10c8b71f1c4ed315cff49f32494d"
|
||||
checksum = "8b37c88a63ffd85d15b406896cc343916d7cf57838a847b3a6f2ca5d39a5695a"
|
||||
|
||||
[[package]]
|
||||
name = "byteorder"
|
||||
|
@ -505,15 +499,6 @@ version = "0.8.7"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b"
|
||||
|
||||
[[package]]
|
||||
name = "core_maths"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3b02505ccb8c50b0aa21ace0fc08c3e53adebd4e58caa18a36152803c7709a3"
|
||||
dependencies = [
|
||||
"libm",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "crc32fast"
|
||||
version = "1.4.2"
|
||||
|
@ -543,12 +528,6 @@ dependencies = [
|
|||
"parking_lot_core",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "data-url"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
|
||||
|
||||
[[package]]
|
||||
name = "displaydoc"
|
||||
version = "0.2.5"
|
||||
|
@ -639,12 +618,6 @@ dependencies = [
|
|||
"miniz_oxide",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "float-cmp"
|
||||
version = "0.9.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
|
||||
|
||||
[[package]]
|
||||
name = "fnv"
|
||||
version = "1.0.7"
|
||||
|
@ -657,29 +630,6 @@ version = "0.1.3"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f81ec6369c545a7d40e4589b5597581fa1c441fe1cce96dd1de43159910a36a2"
|
||||
|
||||
[[package]]
|
||||
name = "fontconfig-parser"
|
||||
version = "0.5.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "c1fcfcd44ca6e90c921fee9fa665d530b21ef1327a4c1a6c5250ea44b776ada7"
|
||||
dependencies = [
|
||||
"roxmltree",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "fontdb"
|
||||
version = "0.23.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "457e789b3d1202543297a350643cf459f836cade38934e7a4cf6a39e7cde2905"
|
||||
dependencies = [
|
||||
"fontconfig-parser",
|
||||
"log",
|
||||
"memmap2",
|
||||
"slotmap",
|
||||
"tinyvec",
|
||||
"ttf-parser",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "foreign-types"
|
||||
version = "0.3.2"
|
||||
|
@ -845,9 +795,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "h2"
|
||||
version = "0.4.6"
|
||||
version = "0.4.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "524e8ac6999421f49a846c2d4411f337e53497d8ec55d67753beffa43c5d9205"
|
||||
checksum = "ccae279728d634d083c00f6099cb58f01cc99c145b84b8be2f6c74618d79922e"
|
||||
dependencies = [
|
||||
"atomic-waker",
|
||||
"bytes",
|
||||
|
@ -949,9 +899,9 @@ checksum = "9a3a5bfb195931eeb336b2a7b4d761daec841b97f947d34394601737a7bba5e4"
|
|||
|
||||
[[package]]
|
||||
name = "hyper"
|
||||
version = "1.5.0"
|
||||
version = "1.5.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "bbbff0a806a4728c99295b254c8838933b5b082d75e3cb70c8dab21fdfbcfa9a"
|
||||
checksum = "97818827ef4f364230e16705d4706e2897df2bb60617d6ca15d598025a3c481f"
|
||||
dependencies = [
|
||||
"bytes",
|
||||
"futures-channel",
|
||||
|
@ -1188,12 +1138,6 @@ dependencies = [
|
|||
"quick-error",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "imagesize"
|
||||
version = "0.13.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "edcd27d72f2f071c64249075f42e205ff93c9a4c5f6c6da53e79ed9f9832c285"
|
||||
|
||||
[[package]]
|
||||
name = "imgref"
|
||||
version = "1.11.0"
|
||||
|
@ -1244,9 +1188,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "1.0.11"
|
||||
version = "1.0.13"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "49f1f14873335454500d59611f1cf4a4b0f786f9ac11f4312a78e4cf2566695b"
|
||||
checksum = "540654e97a3f4470a492cd30ff187bc95d89557a903a2bbf112e2fae98104ef2"
|
||||
|
||||
[[package]]
|
||||
name = "jobserver"
|
||||
|
@ -1266,16 +1210,6 @@ dependencies = [
|
|||
"wasm-bindgen",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "kurbo"
|
||||
version = "0.11.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "89234b2cc610a7dd927ebde6b41dd1a5d4214cffaef4cf1fb2195d592f92518f"
|
||||
dependencies = [
|
||||
"arrayvec",
|
||||
"smallvec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "lazy_static"
|
||||
version = "1.5.0"
|
||||
|
@ -1298,12 +1232,6 @@ dependencies = [
|
|||
"cc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "libm"
|
||||
version = "0.2.11"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8355be11b20d696c8f18f6cc018c4e372165b1fa8126cef092399c9951984ffa"
|
||||
|
||||
[[package]]
|
||||
name = "libwebp-sys"
|
||||
version = "0.9.6"
|
||||
|
@ -1322,9 +1250,9 @@ checksum = "78b3ae25bc7c8c38cec158d1f2757ee79e9b3740fbc7ccf0e59e4b08d793fa89"
|
|||
|
||||
[[package]]
|
||||
name = "litemap"
|
||||
version = "0.7.3"
|
||||
version = "0.7.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "643cb0b8d4fcc284004d5fd0d67ccf61dfffadb7f75e1e71bc420f4688a3a704"
|
||||
checksum = "4ee93343901ab17bd981295f2cf0026d4ad018c7c31ba84549a4ddbb47a45104"
|
||||
|
||||
[[package]]
|
||||
name = "lock_api"
|
||||
|
@ -1381,15 +1309,6 @@ version = "2.7.4"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3"
|
||||
|
||||
[[package]]
|
||||
name = "memmap2"
|
||||
version = "0.9.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd3f7eed9d3848f8b98834af67102b720745c4ec028fcd0aa0239277e7de374f"
|
||||
dependencies = [
|
||||
"libc",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "mime"
|
||||
version = "0.3.17"
|
||||
|
@ -1619,12 +1538,6 @@ version = "2.3.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
|
||||
|
||||
[[package]]
|
||||
name = "pico-args"
|
||||
version = "0.5.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5be167a7af36ee22fe3115051bc51f6e6c7054c9348e28deb4f49bd6f705a315"
|
||||
|
||||
[[package]]
|
||||
name = "pin-project"
|
||||
version = "1.1.7"
|
||||
|
@ -1678,9 +1591,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "portable-atomic"
|
||||
version = "1.9.0"
|
||||
version = "1.10.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "cc9c68a3f6da06753e9335d63e27f6b9754dd1920d941135b7ea8224f141adb2"
|
||||
checksum = "280dc24453071f1b63954171985a0b0d30058d287960968b9b2aca264c8d4ee6"
|
||||
|
||||
[[package]]
|
||||
name = "ppv-lite86"
|
||||
|
@ -1693,9 +1606,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "proc-macro2"
|
||||
version = "1.0.89"
|
||||
version = "1.0.92"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "f139b0662de085916d1fb67d2b4169d1addddda1919e696f3252b740b629986e"
|
||||
checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0"
|
||||
dependencies = [
|
||||
"unicode-ident",
|
||||
]
|
||||
|
@ -1937,7 +1850,7 @@ dependencies = [
|
|||
"serde",
|
||||
"serde_json",
|
||||
"serde_urlencoded",
|
||||
"sync_wrapper 1.0.1",
|
||||
"sync_wrapper 1.0.2",
|
||||
"system-configuration",
|
||||
"tokio",
|
||||
"tokio-native-tls",
|
||||
|
@ -1951,30 +1864,11 @@ dependencies = [
|
|||
"windows-registry",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "resvg"
|
||||
version = "0.44.0"
|
||||
source = "git+https://github.com/linebender/resvg?rev=ac767218d791fa42bb6da3a8cc85f0a4454685f1#ac767218d791fa42bb6da3a8cc85f0a4454685f1"
|
||||
dependencies = [
|
||||
"gif",
|
||||
"image-webp",
|
||||
"log",
|
||||
"pico-args",
|
||||
"rgb",
|
||||
"svgtypes",
|
||||
"tiny-skia",
|
||||
"usvg",
|
||||
"zune-jpeg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "rgb"
|
||||
version = "0.8.50"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "57397d16646700483b67d2dd6511d79318f9d057fdbd21a4066aeac8b41d310a"
|
||||
dependencies = [
|
||||
"bytemuck",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ring"
|
||||
|
@ -1991,12 +1885,6 @@ dependencies = [
|
|||
"windows-sys 0.52.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "roxmltree"
|
||||
version = "0.20.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c20b6793b5c2fa6553b250154b78d6d0db37e72700ae35fad9387a46f487c97"
|
||||
|
||||
[[package]]
|
||||
name = "rustc-demangle"
|
||||
version = "0.1.24"
|
||||
|
@ -2018,9 +1906,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "rustls"
|
||||
version = "0.23.17"
|
||||
version = "0.23.18"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "7f1a745511c54ba6d4465e8d5dfbd81b45791756de28d4981af70d6dca128f1e"
|
||||
checksum = "9c9cc1d47e243d655ace55ed38201c19ae02c148ae56412ab8750e8f0166ab7f"
|
||||
dependencies = [
|
||||
"once_cell",
|
||||
"rustls-pki-types",
|
||||
|
@ -2061,24 +1949,6 @@ version = "1.0.18"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0e819f2bc632f285be6d7cd36e25940d45b2391dd6d9b939e79de557f7014248"
|
||||
|
||||
[[package]]
|
||||
name = "rustybuzz"
|
||||
version = "0.20.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "fd3c7c96f8a08ee34eff8857b11b49b07d71d1c3f4e88f8a88d4c9e9f90b1702"
|
||||
dependencies = [
|
||||
"bitflags 2.6.0",
|
||||
"bytemuck",
|
||||
"core_maths",
|
||||
"log",
|
||||
"smallvec",
|
||||
"ttf-parser",
|
||||
"unicode-bidi-mirroring",
|
||||
"unicode-ccc",
|
||||
"unicode-properties",
|
||||
"unicode-script",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "ryu"
|
||||
version = "1.0.18"
|
||||
|
@ -2087,9 +1957,9 @@ checksum = "f3cb5ba0dc43242ce17de99c180e96db90b235b8a9fdc9543c96d2209116bd9f"
|
|||
|
||||
[[package]]
|
||||
name = "schannel"
|
||||
version = "0.1.26"
|
||||
version = "0.1.27"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "01227be5826fa0690321a2ba6c5cd57a19cf3f6a09e76973b58e61de6ab9d1c1"
|
||||
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
|
||||
dependencies = [
|
||||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
@ -2238,15 +2108,6 @@ dependencies = [
|
|||
"quote",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "simplecss"
|
||||
version = "0.2.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a11be7c62927d9427e9f40f3444d5499d868648e2edbc4e2116de69e7ec0e89d"
|
||||
dependencies = [
|
||||
"log",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "siphasher"
|
||||
version = "1.0.1"
|
||||
|
@ -2262,15 +2123,6 @@ dependencies = [
|
|||
"autocfg",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "slotmap"
|
||||
version = "1.0.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "dbff4acf519f630b3a3ddcfaea6c06b42174d9a44bc70c620e9ed1649d58b82a"
|
||||
dependencies = [
|
||||
"version_check",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "smallvec"
|
||||
version = "1.13.2"
|
||||
|
@ -2321,15 +2173,6 @@ dependencies = [
|
|||
"windows-sys 0.59.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strict-num"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6637bab7722d379c8b41ba849228d680cc12d0a45ba1fa2b48f2a30577a06731"
|
||||
dependencies = [
|
||||
"float-cmp",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "strsim"
|
||||
version = "0.11.1"
|
||||
|
@ -2342,21 +2185,11 @@ version = "2.6.1"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
|
||||
|
||||
[[package]]
|
||||
name = "svgtypes"
|
||||
version = "0.15.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "794de53cc48eaabeed0ab6a3404a65f40b3e38c067e4435883a65d2aa4ca000e"
|
||||
dependencies = [
|
||||
"kurbo",
|
||||
"siphasher",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "syn"
|
||||
version = "2.0.87"
|
||||
version = "2.0.89"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "25aa4ce346d03a6dcd68dd8b4010bcb74e54e62c90c573f394c46eae99aba32d"
|
||||
checksum = "44d46482f1c1c87acd84dea20c1bf5ebff4c757009ed6bf19cfd36fb10e92c4e"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -2371,9 +2204,9 @@ checksum = "2047c6ded9c721764247e62cd3b03c09ffc529b2ba5b10ec482ae507a4a70160"
|
|||
|
||||
[[package]]
|
||||
name = "sync_wrapper"
|
||||
version = "1.0.1"
|
||||
version = "1.0.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "a7065abeca94b6a8a577f9bd45aa0867a2238b74e8eb67cf10d492bc39351394"
|
||||
checksum = "0bf256ce5efdfa370213c1dabab5935a12e49f2c58d15e9eac2870d3b4f27263"
|
||||
dependencies = [
|
||||
"futures-core",
|
||||
]
|
||||
|
@ -2482,32 +2315,6 @@ dependencies = [
|
|||
"syn",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tiny-skia"
|
||||
version = "0.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "83d13394d44dae3207b52a326c0c85a8bf87f1541f23b0d143811088497b09ab"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"arrayvec",
|
||||
"bytemuck",
|
||||
"cfg-if",
|
||||
"log",
|
||||
"png",
|
||||
"tiny-skia-path",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tiny-skia-path"
|
||||
version = "0.11.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9c9e7fc0c2e86a30b117d0462aa261b72b7a99b7ebd7deb3a14ceda95c5bdc93"
|
||||
dependencies = [
|
||||
"arrayref",
|
||||
"bytemuck",
|
||||
"strict-num",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinystr"
|
||||
version = "0.7.6"
|
||||
|
@ -2518,21 +2325,6 @@ dependencies = [
|
|||
"zerovec",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec"
|
||||
version = "1.8.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "445e881f4f6d382d5f27c034e25eb92edd7c784ceab92a0937db7f2e9471b938"
|
||||
dependencies = [
|
||||
"tinyvec_macros",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "tinyvec_macros"
|
||||
version = "0.1.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
|
||||
|
||||
[[package]]
|
||||
name = "tokio"
|
||||
version = "1.41.1"
|
||||
|
@ -2716,56 +2508,11 @@ version = "0.2.5"
|
|||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e421abadd41a4225275504ea4d6566923418b7f05506fbc9c0fe86ba7396114b"
|
||||
|
||||
[[package]]
|
||||
name = "ttf-parser"
|
||||
version = "0.25.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5902c5d130972a0000f60860bfbf46f7ca3db5391eddfedd1b8728bd9dc96c0e"
|
||||
dependencies = [
|
||||
"core_maths",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "unicode-bidi"
|
||||
version = "0.3.17"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5ab17db44d7388991a428b2ee655ce0c212e862eff1768a455c58f9aad6e7893"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-bidi-mirroring"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "5dfa6e8c60bb66d49db113e0125ee8711b7647b5579dc7f5f19c42357ed039fe"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ccc"
|
||||
version = "0.4.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ce61d488bcdc9bc8b5d1772c404828b17fc481c0a582b5581e95fb233aef503e"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-ident"
|
||||
version = "1.0.13"
|
||||
version = "1.0.14"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e91b56cd4cadaeb79bbf1a5645f6b4f8dc5bde8834ad5894a8db35fda9efa1fe"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-properties"
|
||||
version = "0.1.3"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "e70f2a8b45122e719eb623c01822704c4e0907e7e426a05927e1a1cfff5b75d0"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-script"
|
||||
version = "0.5.7"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "9fb421b350c9aff471779e262955939f565ec18b86c15364e6bdf0d662ca7c1f"
|
||||
|
||||
[[package]]
|
||||
name = "unicode-vo"
|
||||
version = "0.1.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "b1d386ff53b415b7fe27b50bb44679e2cc4660272694b7b6f3326d8480823a94"
|
||||
checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
|
||||
|
||||
[[package]]
|
||||
name = "untrusted"
|
||||
|
@ -2775,41 +2522,15 @@ checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
|
|||
|
||||
[[package]]
|
||||
name = "url"
|
||||
version = "2.5.3"
|
||||
version = "2.5.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "8d157f1b96d14500ffdc1f10ba712e780825526c03d9a49b4d0324b0d9113ada"
|
||||
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
|
||||
dependencies = [
|
||||
"form_urlencoded",
|
||||
"idna",
|
||||
"percent-encoding",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "usvg"
|
||||
version = "0.44.0"
|
||||
source = "git+https://github.com/linebender/resvg?rev=ac767218d791fa42bb6da3a8cc85f0a4454685f1#ac767218d791fa42bb6da3a8cc85f0a4454685f1"
|
||||
dependencies = [
|
||||
"base64",
|
||||
"data-url",
|
||||
"flate2",
|
||||
"fontdb",
|
||||
"imagesize",
|
||||
"kurbo",
|
||||
"log",
|
||||
"pico-args",
|
||||
"roxmltree",
|
||||
"rustybuzz",
|
||||
"simplecss",
|
||||
"siphasher",
|
||||
"strict-num",
|
||||
"svgtypes",
|
||||
"tiny-skia-path",
|
||||
"unicode-bidi",
|
||||
"unicode-script",
|
||||
"unicode-vo",
|
||||
"xmlwriter",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "utf16_iter"
|
||||
version = "1.0.5"
|
||||
|
@ -3209,16 +2930,25 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
|
|||
checksum = "1e9df38ee2d2c3c5948ea468a8406ff0db0b29ae1ffde1bcf20ef305bcc95c51"
|
||||
|
||||
[[package]]
|
||||
name = "xmlwriter"
|
||||
version = "0.1.0"
|
||||
name = "xml"
|
||||
version = "0.8.20"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "ec7a2a501ed189703dba8b08142f057e887dfc4b2cc4db2d343ac6376ba3e0b9"
|
||||
checksum = "ede1c99c55b4b3ad0349018ef0eccbe954ce9c342334410707ee87177fcf2ab4"
|
||||
dependencies = [
|
||||
"xml-rs",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "xml-rs"
|
||||
version = "0.8.23"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "af310deaae937e48a26602b730250b4949e125f468f11e6990be3e5304ddd96f"
|
||||
|
||||
[[package]]
|
||||
name = "yoke"
|
||||
version = "0.7.4"
|
||||
version = "0.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "6c5b1314b079b0930c31e3af543d8ee1757b1951ae1e1565ec704403a7240ca5"
|
||||
checksum = "120e6aef9aa629e3d4f52dc8cc43a015c7724194c97dfaf45180d2daf2b77f40"
|
||||
dependencies = [
|
||||
"serde",
|
||||
"stable_deref_trait",
|
||||
|
@ -3228,9 +2958,9 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "yoke-derive"
|
||||
version = "0.7.4"
|
||||
version = "0.7.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "28cc31741b18cb6f1d5ff12f5b7523e3d6eb0852bbbad19d73905511d9849b95"
|
||||
checksum = "2380878cad4ac9aac1e2435f3eb4020e8374b5f13c296cb75b4620ff8e229154"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
@ -3249,7 +2979,6 @@ dependencies = [
|
|||
"console_error_panic_hook",
|
||||
"dashmap",
|
||||
"env_logger",
|
||||
"fontdb",
|
||||
"futures",
|
||||
"getrandom",
|
||||
"governor",
|
||||
|
@ -3260,7 +2989,6 @@ dependencies = [
|
|||
"prometheus",
|
||||
"quote",
|
||||
"reqwest",
|
||||
"resvg",
|
||||
"serde",
|
||||
"serde_json",
|
||||
"siphasher",
|
||||
|
@ -3274,6 +3002,7 @@ dependencies = [
|
|||
"webp",
|
||||
"worker",
|
||||
"worker-macros",
|
||||
"xml",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
|
@ -3299,18 +3028,18 @@ dependencies = [
|
|||
|
||||
[[package]]
|
||||
name = "zerofrom"
|
||||
version = "0.1.4"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "91ec111ce797d0e0784a1116d0ddcdbea84322cd79e5d5ad173daeba4f93ab55"
|
||||
checksum = "cff3ee08c995dee1859d998dea82f7374f2826091dd9cd47def953cae446cd2e"
|
||||
dependencies = [
|
||||
"zerofrom-derive",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "zerofrom-derive"
|
||||
version = "0.1.4"
|
||||
version = "0.1.5"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0ea7b4a3637ea8669cedf0f1fd5c286a17f3de97b8dd5a70a6c167a1730e63a5"
|
||||
checksum = "595eed982f7d355beb85837f651fa22e90b3c044842dc7f2c2842c086f295808"
|
||||
dependencies = [
|
||||
"proc-macro2",
|
||||
"quote",
|
||||
|
|
12
Cargo.toml
12
Cargo.toml
|
@ -37,10 +37,8 @@ env-local = ["axum/http1", "axum/http2",
|
|||
"lossy-webp",
|
||||
"tower-http",
|
||||
"metrics",
|
||||
"svg-text", "resvg/system-fonts", "resvg/raster-images", "fontdb/fontconfig"
|
||||
]
|
||||
cf-worker = ["dep:worker", "dep:worker-macros", "dep:wasm-bindgen"]
|
||||
cf-worker-paid = ["cf-worker", "resvg/raster-images", "resvg/text", "image/ico", "panic-console-error"]
|
||||
cf-worker = ["dep:worker", "dep:worker-macros", "dep:wasm-bindgen", "image/ico", "panic-console-error"]
|
||||
|
||||
# Observability and tracing features
|
||||
panic-console-error = ["dep:console_error_panic_hook"]
|
||||
|
@ -48,7 +46,6 @@ metrics = ["prometheus"]
|
|||
prometheus = ["dep:prometheus"]
|
||||
|
||||
# Processing capabilities
|
||||
svg-text = ["resvg/text", "dep:fontdb"]
|
||||
lossy-webp = ["dep:webp"]
|
||||
|
||||
# Server runtime features
|
||||
|
@ -81,23 +78,18 @@ toml = { version = "0.8", optional = true }
|
|||
log = "0.4"
|
||||
env_logger = { version = "0.11", optional = true }
|
||||
governor = { version = "0.7.0", features = ["dashmap"], optional = true }
|
||||
resvg = { version = "0.44.0", default-features = false, features = ["gif", "image-webp"] }
|
||||
thiserror = "2.0"
|
||||
serde_json = "1"
|
||||
wasm-bindgen = { version = "0.2", optional = true }
|
||||
libc = { version = "0.2.162", optional = true }
|
||||
axum-server = { version = "0.7.1", optional = true }
|
||||
fontdb = { version = "0.23", optional = true }
|
||||
webp = { version = "0.3.0", optional = true }
|
||||
url = { version = "2", optional = true }
|
||||
tower-http = { version = "0.6.2", features = ["catch-panic", "timeout"], optional = true }
|
||||
dashmap = "6.1.0"
|
||||
lru = "0.12.5"
|
||||
prometheus = { version = "0.13.4", optional = true }
|
||||
|
||||
[patch.crates-io]
|
||||
# licensing and webp dependencies
|
||||
resvg = { git = "https://github.com/linebender/resvg", rev = "ac767218d791fa42bb6da3a8cc85f0a4454685f1" }
|
||||
xml = "0.8.20"
|
||||
|
||||
[build-dependencies]
|
||||
chumsky = "0.9.3"
|
||||
|
|
12
README.md
12
README.md
|
@ -7,8 +7,6 @@ It has been deployed on my instance for since 11/14 under the AppArmor deploymen
|
|||
Currently to do:
|
||||
|
||||
- [X] Content-Type sniffing
|
||||
- [X] SVG rendering
|
||||
- [ ] Font rendering (will not run on Cloudflare Workers Free plan)
|
||||
- [X] Preset image resizing
|
||||
- [X] Opportunistic Redirection on large video files
|
||||
- [X] RFC9110 compliant proxy loop detection with defensive programming against known vulnerable proxies
|
||||
|
@ -30,7 +28,7 @@ This project is designed to match the upstream [specification](https://github.co
|
|||
|
||||
- We will not honor remote `Content-Disposition` headers but instead reply with the actual filename in the request URL.
|
||||
- Remote `Content-Type` headers will only be used as a hint rather than authoritative, and resniffing is unconditionally performed.
|
||||
- SVG rasterization is planned to be removed from the proxy in favor of sanitization and CSP enforcement.
|
||||
- SVG rasterization is removed from the proxy in favor of sanitization and CSP enforcement.
|
||||
|
||||
## Demo
|
||||
|
||||
|
@ -51,8 +49,6 @@ Image:
|
|||
|
||||
### SVG rendering
|
||||
|
||||
(font rendering disabled due to size restrictions)
|
||||
|
||||
CF Worker: [https://yumechi-no-kuni-proxy-worker.eternal-flame-ad.workers.dev/proxy/static.webp?url=https://upload.wikimedia.org/wikipedia/commons/a/ad/AES-AddRoundKey.svg](https://yumechi-no-kuni-proxy-worker.eternal-flame-ad.workers.dev/proxy/static.webp?url=https://upload.wikimedia.org/wikipedia/commons/a/ad/AES-AddRoundKey.svg)
|
||||
|
||||
Local: [https://mproxy.mi.yumechi.jp/proxy/static.webp?url=https://upload.wikimedia.org/wikipedia/commons/a/ad/AES-AddRoundKey.svg](https://mproxy.mi.yumechi.jp/proxy/static.webp?url=https://upload.wikimedia.org/wikipedia/commons/a/ad/AES-AddRoundKey.svg)
|
||||
|
@ -80,9 +76,7 @@ Local: [https://mproxy.mi.yumechi.jp/proxy/static.webp?url=https://upload.wikime
|
|||
|
||||
IF deploying to Cloudflare Workers:
|
||||
|
||||
Firstly I don't recommend deploying using the free plan because there are much faster implementations that do not or almost do not perform any Image processing. I have this feature mainly because I don't want to pay for a Cloudflare Workers plan just to support this.
|
||||
|
||||
The reported CPU time by Cloudflare is consistently over the free plan limit (which is only 10ms! probably not even enough for decoding an image) and will likely be throttled or terminated once you deploy it to real workloads. The paid plan is recommended for this worker.
|
||||
Firstly I don't recommend deploying using the free plan because there are much faster implementations that do not or almost do not perform any Image processing. The reported CPU time by Cloudflare is consistently over the free plan limit (which is only 10ms! probably not even enough for decoding an image) and will likely be throttled or terminated once you deploy it to real workloads. The paid plan is recommended for this worker.
|
||||
|
||||
5. Add the wasm target with `rustup +$(cat rust-toolchain) target add wasm32-unknown-unknown`.
|
||||
|
||||
|
@ -90,7 +84,7 @@ Local: [https://mproxy.mi.yumechi.jp/proxy/static.webp?url=https://upload.wikime
|
|||
|
||||
7. Install `wrangler` with you JS package manager of choice. See <https://developers.cloudflare.com/workers/wrangler/install-and-update>/. `npx` also works.
|
||||
|
||||
8. Edit `wrangler.toml` to your liking. Everything in the `[vars]` section maps directly into the `config` section of the TOML configuration file. There is a `cf-worker-paid` feature set which enable some additional features that will never fit in the free plan, mainly SVG font rendering and some debugging features.
|
||||
8. Edit `wrangler.toml` to your liking. Everything in the `[vars]` section maps directly into the `config` section of the TOML configuration file.
|
||||
|
||||
9. Test locally with `wrangler dev`.
|
||||
|
||||
|
|
|
@ -92,7 +92,6 @@ allow = [
|
|||
"CC0-1.0",
|
||||
"MIT",
|
||||
"Apache-2.0",
|
||||
"Unicode-DFS-2016",
|
||||
"ISC",
|
||||
"Unicode-3.0",
|
||||
"BSD-3-Clause",
|
||||
|
|
|
@ -81,7 +81,6 @@ profile yumechi-no-kuni-proxy-worker @{prog_path} {
|
|||
^image {
|
||||
include <abstractions/base>
|
||||
include <abstractions/apparmor_api/change_profile>
|
||||
include <abstractions/fonts>
|
||||
|
||||
deny capability,
|
||||
deny network,
|
||||
|
|
|
@ -33,6 +33,8 @@ use lru::LruCache;
|
|||
use post_process::{CompressionLevel, MediaResponse};
|
||||
use sandbox::Sandboxing;
|
||||
|
||||
#[cfg(feature = "cf-worker")]
|
||||
use crate::config::CfConfigError;
|
||||
use serde::Deserialize;
|
||||
#[cfg(feature = "cf-worker")]
|
||||
use worker::{event, Context, Env, HttpRequest, Result as WorkerResult};
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
use std::io::Cursor;
|
||||
use std::io::{BufReader, Cursor};
|
||||
|
||||
use image::{
|
||||
codecs::{png::PngDecoder, webp::WebPDecoder},
|
||||
|
@ -86,81 +86,167 @@ pub fn postprocess_png_image(data: &[u8], opt: &ImageOptions) -> ImageResult<Opt
|
|||
#[derive(Debug, thiserror::Error)]
|
||||
/// An error that occurred during SVG postprocessing
|
||||
pub enum SvgPostprocessError {
|
||||
/// The SVG image is unsupported
|
||||
#[error("SVG unsupported")]
|
||||
Unsupported,
|
||||
/// The complexity of the SVG image exceeded the limit
|
||||
#[error("SVG complexity limit exceeded: computed complexity is {0}")]
|
||||
LimitExceeded(usize),
|
||||
/// An error that occurred during rasterization
|
||||
#[error("Rasterization error: {0}")]
|
||||
Rasterization(#[from] image::ImageError),
|
||||
#[error("SVG complexity limit exceeded")]
|
||||
LimitExceeded,
|
||||
/// Disallowed content was found in the SVG image
|
||||
#[error("Disallowed content found in SVG")]
|
||||
DisallowedContent,
|
||||
/// An error that occurred during SVG parsing
|
||||
#[error("SVG error: {0}")]
|
||||
Svg(#[from] resvg::usvg::Error),
|
||||
#[error("XML read error: {0}")]
|
||||
XmlRead(#[from] xml::reader::Error),
|
||||
/// An error that occurred during SVG writing
|
||||
#[error("XML write error: {0}")]
|
||||
XmlWrite(#[from] xml::writer::Error),
|
||||
}
|
||||
|
||||
/// Preprocesses an SVG image using the given options. By specs SVG must be rasterized as opposed to passing the SVG data directly for security reasons.
|
||||
pub fn postprocess_svg_image(
|
||||
data: &[u8],
|
||||
#[cfg(feature = "svg-text")] font_data: Option<Vec<u8>>,
|
||||
#[cfg(not(feature = "svg-text"))] _font_data: Option<()>,
|
||||
opt: &ImageOptions,
|
||||
) -> Result<DynamicImage, SvgPostprocessError> {
|
||||
use resvg::{
|
||||
tiny_skia::Pixmap,
|
||||
usvg::{self, Transform},
|
||||
};
|
||||
) -> Result<Vec<u8>, SvgPostprocessError> {
|
||||
let static_ = opt.static_ == Some(true);
|
||||
let rdr = BufReader::new(Cursor::new(data));
|
||||
let tree = xml::EventReader::new(rdr);
|
||||
let mut out = Vec::new();
|
||||
let mut wtr = xml::EventWriter::new(&mut out);
|
||||
|
||||
let svg = usvg::Tree::from_data(
|
||||
data,
|
||||
&usvg::Options {
|
||||
default_size: usvg::Size::from_wh(256., 256.).unwrap(),
|
||||
text_rendering: usvg::TextRendering::OptimizeLegibility,
|
||||
image_rendering: usvg::ImageRendering::OptimizeSpeed,
|
||||
#[cfg(feature = "svg-text")]
|
||||
fontdb: {
|
||||
let mut db = usvg::fontdb::Database::new();
|
||||
#[cfg(not(target_arch = "wasm32"))]
|
||||
db.load_system_fonts();
|
||||
|
||||
if let Some(font_data) = font_data {
|
||||
db.load_font_data(font_data);
|
||||
}
|
||||
|
||||
std::sync::Arc::new(db)
|
||||
},
|
||||
..Default::default()
|
||||
},
|
||||
let mut complexity = 0;
|
||||
let mut ignore_stack = None;
|
||||
for r in tree {
|
||||
match r {
|
||||
Ok(o) => match o {
|
||||
xml::reader::XmlEvent::StartDocument { .. } => {
|
||||
complexity += 1;
|
||||
wtr.write(
|
||||
o.as_writer_event()
|
||||
.ok_or(SvgPostprocessError::Unsupported)?,
|
||||
)?;
|
||||
|
||||
let complexity = svg.clip_paths().len()
|
||||
+ svg.filters().len()
|
||||
+ svg.linear_gradients().len()
|
||||
+ svg.radial_gradients().len()
|
||||
+ svg.patterns().len()
|
||||
+ (svg.size().width() * svg.size().height()) as usize / 1000;
|
||||
|
||||
if complexity > 25535 {
|
||||
return Err(SvgPostprocessError::LimitExceeded(complexity));
|
||||
}
|
||||
xml::reader::XmlEvent::EndDocument => {
|
||||
break;
|
||||
}
|
||||
xml::reader::XmlEvent::ProcessingInstruction { ref name, .. } => {
|
||||
complexity += 1 + name.len();
|
||||
if ignore_stack.is_some() {
|
||||
continue;
|
||||
}
|
||||
if name != "xml" {
|
||||
return Err(SvgPostprocessError::DisallowedContent);
|
||||
}
|
||||
|
||||
let size = svg.size();
|
||||
let clamped = clamp_dimensions((size.width() as u32, size.height() as u32), 800, 800);
|
||||
wtr.write(
|
||||
o.as_writer_event()
|
||||
.ok_or(SvgPostprocessError::Unsupported)?,
|
||||
)?;
|
||||
}
|
||||
xml::reader::XmlEvent::StartElement {
|
||||
name,
|
||||
mut attributes,
|
||||
namespace,
|
||||
} => {
|
||||
complexity += 1 + attributes.len() + namespace.0.len();
|
||||
|
||||
let transform = Transform::from_scale(
|
||||
clamped.0 as f32 / size.width(),
|
||||
clamped.1 as f32 / size.height(),
|
||||
);
|
||||
if ignore_stack.is_some() {
|
||||
ignore_stack = ignore_stack.map(|v| v + 1);
|
||||
continue;
|
||||
}
|
||||
|
||||
let mut pm = Pixmap::new(clamped.0 as _, clamped.1 as _).unwrap();
|
||||
let name_str = name.local_name.to_ascii_lowercase();
|
||||
if name_str.contains("script") {
|
||||
return Err(SvgPostprocessError::DisallowedContent);
|
||||
}
|
||||
|
||||
resvg::render(&svg, transform, &mut pm.as_mut());
|
||||
if static_ {
|
||||
if name_str == "set" || name_str.starts_with("animate") {
|
||||
ignore_stack = Some(0);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
attributes.retain(|attr| {
|
||||
let lname = attr.name.local_name.to_ascii_lowercase();
|
||||
if lname.starts_with("on") {
|
||||
return false;
|
||||
}
|
||||
|
||||
let image =
|
||||
image::RgbaImage::from_vec(pm.width() as _, pm.height() as _, pm.data().to_vec()).unwrap();
|
||||
if lname.ends_with("src") || lname.ends_with("href") {
|
||||
if !attr.value.starts_with("data:image/")
|
||||
&& !attr.value.contains("svg")
|
||||
&& !attr.value.contains("xml")
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Ok(process_static_image_impl(
|
||||
DynamicImage::ImageRgba8(image),
|
||||
opt,
|
||||
))
|
||||
if lname.eq_ignore_ascii_case("style") {
|
||||
let style = attr.value.as_str();
|
||||
if style.to_ascii_lowercase().contains("url") {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
return true;
|
||||
});
|
||||
|
||||
wtr.write(
|
||||
xml::reader::XmlEvent::StartElement {
|
||||
name,
|
||||
attributes,
|
||||
namespace,
|
||||
}
|
||||
.as_writer_event()
|
||||
.ok_or(SvgPostprocessError::Unsupported)?,
|
||||
)?;
|
||||
}
|
||||
xml::reader::XmlEvent::EndElement { .. } => {
|
||||
complexity += 1;
|
||||
if ignore_stack.is_some() {
|
||||
ignore_stack = ignore_stack.map(|v| v - 1);
|
||||
if ignore_stack == Some(0) {
|
||||
ignore_stack = None;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
wtr.write(
|
||||
o.as_writer_event()
|
||||
.ok_or(SvgPostprocessError::Unsupported)?,
|
||||
)?;
|
||||
}
|
||||
xml::reader::XmlEvent::CData(ref s) => {
|
||||
complexity += 1 + s.len() / 32;
|
||||
if ignore_stack.is_some() {
|
||||
continue;
|
||||
}
|
||||
wtr.write(
|
||||
o.as_writer_event()
|
||||
.ok_or(SvgPostprocessError::Unsupported)?,
|
||||
)?;
|
||||
}
|
||||
xml::reader::XmlEvent::Comment(s) => complexity += 1 + s.len() / 64,
|
||||
xml::reader::XmlEvent::Characters(ref s) => {
|
||||
complexity += 1 + s.len() / 32;
|
||||
if ignore_stack.is_some() {
|
||||
continue;
|
||||
}
|
||||
wtr.write(
|
||||
o.as_writer_event()
|
||||
.ok_or(SvgPostprocessError::Unsupported)?,
|
||||
)?;
|
||||
}
|
||||
xml::reader::XmlEvent::Whitespace(s) => complexity += 1 + s.len() / 64,
|
||||
},
|
||||
|
||||
Err(e) => return Err(SvgPostprocessError::XmlRead(e)),
|
||||
}
|
||||
|
||||
if complexity > 65536 {
|
||||
return Err(SvgPostprocessError::LimitExceeded);
|
||||
}
|
||||
}
|
||||
|
||||
Ok(out)
|
||||
}
|
||||
|
||||
fn default_limits() -> Limits {
|
||||
|
|
|
@ -197,15 +197,13 @@ where
|
|||
buf.extend_from_slice(bytes.as_ref());
|
||||
}
|
||||
|
||||
let img = sandboxed!(sandbox => image_processing::postprocess_svg_image(&buf, None, &options)
|
||||
let img = sandboxed!(sandbox => image_processing::postprocess_svg_image(&buf, &options)
|
||||
.map_err(|e| ErrorResponse::postprocess_failed(e.to_string().into())))?;
|
||||
|
||||
Ok(MediaResponse::ProcessedStaticImage(StaticImage {
|
||||
Ok(MediaResponse::Buffer {
|
||||
data: img,
|
||||
format: ImageFormat::WebP,
|
||||
compression: options.compression_level(),
|
||||
is_https,
|
||||
})
|
||||
content_type: Some("image/svg+xml".into()),
|
||||
}
|
||||
.with_timing_info(TIME_TO_FIRST_BYTE_KEY, ttfb)
|
||||
.with_opt_timing_info(SLURP_TIMING_KEY, None)
|
||||
.with_timing_info(TIMING_KEY, begin.elapsed()))
|
||||
|
|
Loading…
Reference in a new issue