From 172dba215a81a7801a42aee65871b2cbf9880da2 Mon Sep 17 00:00:00 2001 From: "Dawid J. Kubis" Date: Sun, 6 Mar 2022 01:45:39 +0100 Subject: [PATCH] added http handling, parsing, status codes, post structure, database options, formatted code --- .gitignore | 1 + Cargo.lock | 567 ++++----------------------------------------- Cargo.toml | 7 +- README.md | 12 +- src/http.rs | 95 ++++++++ src/main.rs | 82 ++++--- src/models.rs | 36 --- src/post.rs | 6 + src/routes.rs | 1 - src/www/index.html | 188 +++++++++++++++ 10 files changed, 393 insertions(+), 602 deletions(-) create mode 100644 src/http.rs delete mode 100644 src/models.rs create mode 100644 src/post.rs delete mode 100644 src/routes.rs diff --git a/.gitignore b/.gitignore index ea8c4bf..aaf7dd1 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +data.sled diff --git a/Cargo.lock b/Cargo.lock index 3d8a302..5b4bc44 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2,21 +2,6 @@ # It is not intended for manual editing. version = 3 -[[package]] -name = "adler" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f26201604c87b1e01bd3d98f8d5d9a8fcbb815e8cedb41ffccbeb4bf593a35fe" - -[[package]] -name = "aho-corasick" -version = "0.7.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f" -dependencies = [ - "memchr", -] - [[package]] name = "ansi_term" version = "0.11.0" @@ -39,24 +24,9 @@ dependencies = [ [[package]] name = "autocfg" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cdb031dd78e28731d87d56cc8ffef4a8f36ca26c38fe2de700543e627f8a464a" - -[[package]] -name = "base64" -version = "0.13.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd" - -[[package]] -name = "bincode" -version = "1.3.3" +version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b1f45e9417d87227c7a56d22e471c6206462cba514c7590c09aff4cf6d1ddcad" -dependencies = [ - "serde", -] +checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa" [[package]] name = "bitflags" @@ -64,51 +34,12 @@ version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a" -[[package]] -name = "block-buffer" -version = "0.7.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c0940dc441f31689269e10ac70eb1002a3a1d3ad1390e030043662eb7fe4688b" -dependencies = [ - "block-padding", - "byte-tools", - "byteorder", - "generic-array", -] - -[[package]] -name = "block-padding" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa79dedbb091f449f1f39e53edf88d5dbe95f895dae6135a8d7b881fb5af73f5" -dependencies = [ - "byte-tools", -] - -[[package]] -name = "byte-tools" -version = "0.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e3b5ca7a04898ad4bcd41c90c5285445ff5b791899bb1b0abdd2a2aa791211d7" - [[package]] name = "byteorder" version = "1.4.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "14c189c53d098945499cdfa7ecc63567cf3886b3332b312a5b4585d8d3a6a610" -[[package]] -name = "bytesize" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c58ec36aac5066d5ca17df51b3e70279f5670a72102f5752cb7e7c856adfc70" - -[[package]] -name = "cc" -version = "1.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee" - [[package]] name = "cfg-if" version = "1.0.0" @@ -130,40 +61,20 @@ dependencies = [ "vec_map", ] -[[package]] -name = "comrak" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff3c476e1a33eb4df1212a02db79d0f788bbd760901f34f5897644623e0e4e74" -dependencies = [ - "clap", - "entities", - "lazy_static", - "pest", - "pest_derive", - "regex", - "shell-words", - "syntect", - "twoway", - "typed-arena", - "unicode_categories", - "xdg", -] - [[package]] name = "crc32fast" -version = "1.2.2" +version = "1.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3825b1e8580894917dc4468cb634a1b4e9745fddc854edad72d9c04644c0319f" +checksum = "b540bd8bc810d3885c6ea91e2018302f68baba2129ab3e88f32389ee9370880d" dependencies = [ "cfg-if", ] [[package]] name = "crossbeam-epoch" -version = "0.9.5" +version = "0.9.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4ec02e091aa634e2c3ada4a392989e7c3116673ef0ac5b72232439094d73b7fd" +checksum = "c00d6d2ea26e8b151d99093005cb442fb9a37aeaca582a03ec70946f49ab5ed9" dependencies = [ "cfg-if", "crossbeam-utils", @@ -174,73 +85,14 @@ dependencies = [ [[package]] name = "crossbeam-utils" -version = "0.8.5" +version = "0.8.7" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d82cfc11ce7f2c3faef78d8a684447b40d503d9681acebed6cb728d45940c4db" +checksum = "b5e5bed1f1c269533fa816a0a5492b3545209a205ca1a54842be180eb63a16a6" dependencies = [ "cfg-if", "lazy_static", ] -[[package]] -name = "digest" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f3d0c8c8752312f9713efd397ff63acb9f85585afbf179282e720e7704954dd5" -dependencies = [ - "generic-array", -] - -[[package]] -name = "dirs" -version = "3.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "30baa043103c9d0c2a57cf537cc2f35623889dc0d405e6c3cccfadbc81c71309" -dependencies = [ - "dirs-sys", -] - -[[package]] -name = "dirs-sys" -version = "0.3.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "03d86534ed367a67548dc68113a0f5db55432fdfbb6e6f9d77704397d95d5780" -dependencies = [ - "libc", - "redox_users", - "winapi", -] - -[[package]] -name = "entities" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b5320ae4c3782150d900b79807611a59a99fc9a1d61d686faafc24b93fc8d7ca" - -[[package]] -name = "fake-simd" -version = "0.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e88a8acf291dafb59c2d96e8f59828f3838bb1a70398823ade51a84de6a6deed" - -[[package]] -name = "flate2" -version = "1.0.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6988e897c1c9c485f43b47a529cef42fde0547f9d8d41a7062518f1d8fc53f" -dependencies = [ - "cfg-if", - "crc32fast", - "libc", - "miniz_oxide", -] - -[[package]] -name = "fnv" -version = "1.0.7" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" - [[package]] name = "fs2" version = "0.4.3" @@ -260,15 +112,6 @@ dependencies = [ "byteorder", ] -[[package]] -name = "generic-array" -version = "0.12.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ffdf9f34f1447443d37393cc6c2b8313aebddcd96906caf34e54c68d8e57d7bd" -dependencies = [ - "typenum", -] - [[package]] name = "getrandom" version = "0.2.3" @@ -280,12 +123,6 @@ dependencies = [ "wasi", ] -[[package]] -name = "hashbrown" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e" - [[package]] name = "heck" version = "0.3.3" @@ -304,16 +141,6 @@ dependencies = [ "libc", ] -[[package]] -name = "indexmap" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc633605454125dec4b66843673f01c7df2b89479b32e0ed634e43a91cff62a5" -dependencies = [ - "autocfg", - "hashbrown", -] - [[package]] name = "instant" version = "0.1.12" @@ -323,19 +150,13 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "itoa" -version = "0.4.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b71991ff56294aa922b450139ee08b3bfc70982c6b2c7562771375cf73542dd4" - [[package]] name = "kchan" version = "0.1.0" dependencies = [ - "bytesize", - "comrak", + "lazy_static", "num_cpus", + "rand", "sled", "structopt", "thiserror", @@ -348,38 +169,17 @@ version = "1.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" -[[package]] -name = "lazycell" -version = "1.3.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "830d08ce1d1d941e6b30645f1a0eb5643013d835ce3779a5fc208261dbe10f55" - [[package]] name = "libc" version = "0.2.108" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119" -[[package]] -name = "line-wrap" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f30344350a2a51da54c1d53be93fade8a237e545dbcc4bdbe635413f2117cab9" -dependencies = [ - "safemem", -] - -[[package]] -name = "linked-hash-map" -version = "0.5.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7fb9b38af92608140b86b693604b9ffcc5824240a484d1ecd4795bacb2fe88f3" - [[package]] name = "lock_api" -version = "0.4.5" +version = "0.4.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "712a4d093c9976e24e7dbca41db895dabcbac38eb5f4045393d17a95bdfb1109" +checksum = "88943dd7ef4a2e5a4bfa2753aaab3013e34ce2533d1996fb18ef591e315e2b3b" dependencies = [ "scopeguard", ] @@ -393,34 +193,12 @@ dependencies = [ "cfg-if", ] -[[package]] -name = "maplit" -version = "1.0.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3e2e65a1a2e43cfcb47a895c4c8b10d1f4a61097f9f254f183aee60cad9c651d" - -[[package]] -name = "memchr" -version = "2.4.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a" - [[package]] name = "memoffset" -version = "0.6.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "59accc507f1338036a0477ef61afdae33cde60840f4dfe481319ce3ad116ddf9" -dependencies = [ - "autocfg", -] - -[[package]] -name = "miniz_oxide" -version = "0.4.4" +version = "0.6.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a92518e98c078586bc6c934028adcca4c92a53d6a958196de835170a01d84e4b" +checksum = "5aa361d4faea93603064a027415f07bd8e1d5c88c9fbf68bf56a285428fd79ce" dependencies = [ - "adler", "autocfg", ] @@ -434,34 +212,6 @@ dependencies = [ "libc", ] -[[package]] -name = "onig" -version = "6.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "67ddfe2c93bb389eea6e6d713306880c7f6dcc99a75b659ce145d962c861b225" -dependencies = [ - "bitflags", - "lazy_static", - "libc", - "onig_sys", -] - -[[package]] -name = "onig_sys" -version = "69.7.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5dd3eee045c84695b53b20255bb7317063df090b68e18bfac0abb6c39cf7f33e" -dependencies = [ - "cc", - "pkg-config", -] - -[[package]] -name = "opaque-debug" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2839e79665f131bdb5782e51f2c6c9599c133c6098982a54c794358bf432529c" - [[package]] name = "parking_lot" version = "0.11.2" @@ -488,67 +238,10 @@ dependencies = [ ] [[package]] -name = "pest" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "10f4872ae94d7b90ae48754df22fd42ad52ce740b8f370b03da4835417403e53" -dependencies = [ - "ucd-trie", -] - -[[package]] -name = "pest_derive" -version = "2.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "833d1ae558dc601e9a60366421196a8d94bc0ac980476d0b67e1d0988d72b2d0" -dependencies = [ - "pest", - "pest_generator", -] - -[[package]] -name = "pest_generator" -version = "2.1.3" +name = "ppv-lite86" +version = "0.2.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99b8db626e31e5b81787b9783425769681b347011cc59471e33ea46d2ea0cf55" -dependencies = [ - "pest", - "pest_meta", - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "pest_meta" -version = "2.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "54be6e404f5317079812fc8f9f5279de376d8856929e21c184ecf6bbd692a11d" -dependencies = [ - "maplit", - "pest", - "sha-1", -] - -[[package]] -name = "pkg-config" -version = "0.3.22" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "12295df4f294471248581bc09bef3c38a5e46f1e36d6a37353621a0c6c357e1f" - -[[package]] -name = "plist" -version = "1.3.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bd39bc6cdc9355ad1dc5eeedefee696bb35c34caf21768741e81826c0bbd7225" -dependencies = [ - "base64", - "indexmap", - "line-wrap", - "serde", - "time", - "xml-rs", -] +checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba" [[package]] name = "proc-macro-error" @@ -593,60 +286,52 @@ dependencies = [ ] [[package]] -name = "redox_syscall" -version = "0.2.10" +name = "rand" +version = "0.8.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8383f39639269cde97d255a32bdb68c047337295414940c68bdd30c2e13203ff" +checksum = "2e7573632e6454cf6b99d7aac4ccca54be06da05aca2ef7423d22d27d4d4bcd8" dependencies = [ - "bitflags", + "libc", + "rand_chacha", + "rand_core", + "rand_hc", ] [[package]] -name = "redox_users" -version = "0.4.0" +name = "rand_chacha" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "528532f3d801c87aec9def2add9ca802fe569e44a544afe633765267840abe64" +checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" dependencies = [ - "getrandom", - "redox_syscall", + "ppv-lite86", + "rand_core", ] [[package]] -name = "regex" -version = "1.5.4" +name = "rand_core" +version = "0.6.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d07a8629359eb56f1e2fb1652bb04212c072a87ba68546a04065d525673ac461" +checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7" dependencies = [ - "aho-corasick", - "memchr", - "regex-syntax", + "getrandom", ] [[package]] -name = "regex-syntax" -version = "0.6.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b" - -[[package]] -name = "ryu" -version = "1.0.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "71d301d4193d031abdd79ff7e3dd721168a9572ef3fe51a1517aba235bd8f86e" - -[[package]] -name = "safemem" -version = "0.3.3" +name = "rand_hc" +version = "0.3.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ef703b7cb59335eae2eb93ceb664c0eb7ea6bf567079d843e09420219668e072" +checksum = "d51e9f596de227fda2ea6c84607f5558e196eeaf43c986b724ba4fb8fdf497e7" +dependencies = [ + "rand_core", +] [[package]] -name = "same-file" -version = "1.0.6" +name = "redox_syscall" +version = "0.2.11" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "93fc1dc3aaa9bfed95e02e6eadabb4baf7e3078b0bd1b4d7b6b0b68378900502" +checksum = "8380fe0152551244f0747b1bf41737e0f8a74f97a14ccefd1148187271634f3c" dependencies = [ - "winapi-util", + "bitflags", ] [[package]] @@ -655,52 +340,6 @@ version = "1.1.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d29ab0c6d3fc0ee92fe66e2d99f700eab17a8d57d1c1d3b748380fb20baa78cd" -[[package]] -name = "serde" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f12d06de37cf59146fbdecab66aa99f9fe4f78722e3607577a5375d66bd0c913" - -[[package]] -name = "serde_derive" -version = "1.0.130" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d7bc1a1ab1961464eae040d96713baa5a724a8152c1222492465b54322ec508b" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "serde_json" -version = "1.0.72" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d0ffa0837f2dfa6fb90868c2b5468cad482e175f7dad97e7421951e663f2b527" -dependencies = [ - "itoa", - "ryu", - "serde", -] - -[[package]] -name = "sha-1" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f7d94d0bede923b3cea61f3f1ff57ff8cdfd77b400fb8f9998949e0cf04163df" -dependencies = [ - "block-buffer", - "digest", - "fake-simd", - "opaque-debug", -] - -[[package]] -name = "shell-words" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6fa3938c99da4914afedd13bf3d79bcb6c277d1b2c398d23257a304d9e1b074" - [[package]] name = "sled" version = "0.34.7" @@ -719,9 +358,9 @@ dependencies = [ [[package]] name = "smallvec" -version = "1.7.0" +version = "1.8.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309" +checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83" [[package]] name = "strsim" @@ -764,28 +403,6 @@ dependencies = [ "unicode-xid", ] -[[package]] -name = "syntect" -version = "4.6.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8b20815bbe80ee0be06e6957450a841185fcf690fe0178f14d77a05ce2caa031" -dependencies = [ - "bincode", - "bitflags", - "flate2", - "fnv", - "lazy_static", - "lazycell", - "onig", - "plist", - "regex-syntax", - "serde", - "serde_derive", - "serde_json", - "walkdir", - "yaml-rust", -] - [[package]] name = "textwrap" version = "0.11.0" @@ -824,50 +441,6 @@ dependencies = [ "num_cpus", ] -[[package]] -name = "time" -version = "0.3.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "41effe7cfa8af36f439fac33861b66b049edc6f9a32331e2312660529c1c24ad" -dependencies = [ - "itoa", - "libc", -] - -[[package]] -name = "twoway" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "c57ffb460d7c24cd6eda43694110189030a3d1dfe418416d9468fd1c1d290b47" -dependencies = [ - "memchr", - "unchecked-index", -] - -[[package]] -name = "typed-arena" -version = "1.7.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a9b2228007eba4120145f785df0f6c92ea538f5a3635a612ecf4e334c8c1446d" - -[[package]] -name = "typenum" -version = "1.14.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec" - -[[package]] -name = "ucd-trie" -version = "0.1.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56dee185309b50d1f11bfedef0fe6d036842e3fb77413abef29f8f8d1c5d4c1c" - -[[package]] -name = "unchecked-index" -version = "0.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eeba86d422ce181a719445e51872fa30f1f7413b62becb52e95ec91aa262d85c" - [[package]] name = "unicode-segmentation" version = "1.8.0" @@ -886,12 +459,6 @@ version = "0.2.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3" -[[package]] -name = "unicode_categories" -version = "0.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "39ec24b3121d976906ece63c9daad25b85969647682eee313cb5779fdd69e14e" - [[package]] name = "vec_map" version = "0.8.2" @@ -904,17 +471,6 @@ version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "5fecdca9a5291cc2b8dcf7dc02453fee791a280f3743cb0905f8822ae463b3fe" -[[package]] -name = "walkdir" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "808cf2735cd4b6866113f648b791c6adc5714537bc222d9347bb203386ffda56" -dependencies = [ - "same-file", - "winapi", - "winapi-util", -] - [[package]] name = "wasi" version = "0.10.2+wasi-snapshot-preview1" @@ -937,41 +493,8 @@ version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6" -[[package]] -name = "winapi-util" -version = "0.1.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "70ec6ce85bb158151cae5e5c87f95a8e97d2c0c4b001223f33a334e3ce5de178" -dependencies = [ - "winapi", -] - [[package]] name = "winapi-x86_64-pc-windows-gnu" version = "0.4.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f" - -[[package]] -name = "xdg" -version = "2.4.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a23fe958c70412687039c86f578938b4a0bb50ec788e96bce4d6ab00ddd5803" -dependencies = [ - "dirs", -] - -[[package]] -name = "xml-rs" -version = "0.8.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d2d7d3948613f75c98fd9328cfdcc45acc4d360655289d0a7d4ec931392200a3" - -[[package]] -name = "yaml-rust" -version = "0.4.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "56c1936c4cc7a1c9ab21a1ebb602eb942ba868cbd44a99cb7cdc5892335e1c85" -dependencies = [ - "linked-hash-map", -] diff --git a/Cargo.toml b/Cargo.toml index 50e833d..408cfe1 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -7,9 +7,10 @@ edition = "2021" [dependencies] structopt = "0.3.25" -comrak = "0.12.1" threadpool = "1.8.1" num_cpus = "1.13.0" -sled = "0.34.7" thiserror = "1.0.30" -bytesize = "1.1.0" +rand = "0.8.4" +lazy_static = "1.4.0" +sled = "0.34.7" + diff --git a/README.md b/README.md index d4fbe70..cb49a44 100644 --- a/README.md +++ b/README.md @@ -4,17 +4,7 @@ capacity - the least active thread will then be removed. + id's will be attached to every thread and every response based on the order of creation. -+ specific posts will be searchable under the `::` uri. ++ specific posts will be searchable under the `//` uri. ### POST usage -#### attaching media -+ if the first line starts with a dollar sign (`$`) -then the link after the dollar -sign will be shown next to your post (video, image, gif). - -#### creating a thread -+ click the [post](/post) link to create a thread. -+ the first line or second line of your message -(depending on if you have media attached) -will be used as the title of the thread. diff --git a/src/http.rs b/src/http.rs new file mode 100644 index 0000000..f594419 --- /dev/null +++ b/src/http.rs @@ -0,0 +1,95 @@ +use std::fmt; +use std::str::FromStr; + +const HTTP_VERSION: &str = "HTTP/1.1"; + +// TODO use &str +#[derive(Debug)] +pub struct Request { + pub method: String, + pub uri: String, + pub headers: Vec<(String, String)>, + pub body: String, +} + +#[derive(Debug)] +pub struct Response { + pub status: Status, + pub headers: Vec<(String, String)>, + pub body: String, +} + +#[derive(Debug, Clone, Copy)] +pub enum Status { + OK = 200, + NOTFOUND = 404, +} + +impl Status { + pub fn get_message(&self) -> &'static str { + match self { + Self::OK => "OK", + Self::NOTFOUND => "NOT FOUND", + } + } +} + +// TODO implement this with display and enums +// TODO proper errors +impl FromStr for Request { + type Err = String; + + fn from_str(s: &str) -> Result { + let mut iter = dbg!(s).lines(); + let mut first = iter.nth(0).unwrap().split_whitespace(); + let method = first.next().unwrap().to_string(); + let uri = first.next().unwrap().to_string(); + let mut headers: Vec<(String, String)> = vec![]; + + for line in &mut iter { + if line.is_empty() { + break; + } + let line: Vec<&str> = line.split(":").take(2).collect(); + headers.push((line[0].into(), line[1].into())); + } + let body: String = iter.fold(String::new(), |a, b| format!("{}{}", a, b)); + + Ok(Self { + method, + uri, + headers, + body, + }) + } +} + +impl Response { + pub fn new(status: Status, headers: Vec<(String, String)>, body: String) -> Self { + Self { + status, + headers, + body, + } + } +} + +impl fmt::Display for Response { + fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { + let headers: String = self + .headers + .iter() + .map(|x| format!("{}:{}", x.0, x.1)) + .fold(String::from(""), |a, b| format!("{}\n{}", a, b)); // possibly slow + + write!( + f, + "{} {} {}\n{}\n\n{}", + HTTP_VERSION, + self.status as i32, + self.status.get_message(), + headers, + self.body, + ) + } +} diff --git a/src/main.rs b/src/main.rs index 06d4458..9f52d39 100644 --- a/src/main.rs +++ b/src/main.rs @@ -1,69 +1,93 @@ -mod routes; -mod models; +mod http; +mod post; -use crate::models::Request; +use crate::http::{Request, Response, Status}; -use std::io::Read; +use std::io::{Read, Write}; use std::net::{TcpListener, TcpStream}; use std::path::PathBuf; use std::str; -use std::sync::mpsc::channel; +use std::sync::{Arc, Mutex}; +use lazy_static::lazy_static; use structopt::StructOpt; use threadpool::ThreadPool; -static INDEX: &str = include_str!("www/index.html"); -static FAVICON: &'static [u8] = include_bytes!("www/favicon.ico"); +// TODO minify html +const INDEX: &'static str = include_str!("www/index.html"); +const FAVICON: &'static [u8] = include_bytes!("www/favicon.ico"); #[derive(StructOpt, Debug)] struct Opt { #[structopt(short, long, default_value = "8000")] port: u16, - #[structopt(long, default_value = "posts")] - data_directory: PathBuf, + #[structopt(short, long)] + admin_hash: Option, - #[structopt(short, long, default_value = "100mb")] - max_storage: String, - - #[structopt(short, long, default_value = "posts.sled")] + #[structopt(short, long, default_value = "data.sled")] database: PathBuf, + + #[structopt(short, long, default_value = "10000")] + max_posts: usize, +} + +lazy_static! { + // first parse command line arguments + static ref OPT: Opt = Opt::from_args(); } +#[derive(Debug)] +struct Cache<'a>(&'a str); -fn handle(request: Request) { - // check admin priviledges +fn handle(request: Request) -> &'static str { match request.method.as_str() { - "GET" => "", - "POST" => "", - "DELETE" => "", + "GET" => get(&request.uri), + "POST" => "HTTP/1.1 200 OK", + // check admin hash + "DELETE" => "HTTP/1.1 200 OK", _ => "", - }; + } } -fn main() { - let opt = Opt::from_args(); - let max_storage = opt.max_storage.parse::().unwrap(); +fn get(path: &str) -> &'static str { + match path { + // list threads in this case + "/" => dbg!(INDEX), + // list posts here + s => "", + } +} - let listener = TcpListener::bind(format!("127.0.0.1:{}", opt.port)).unwrap(); +fn main() { + // TODO do this without unwrap + // bind listener to local adress and port + let listener = TcpListener::bind(("127.0.0.1", OPT.port)).unwrap(); + // create threadpool for incoming requests let pool = ThreadPool::new(num_cpus::get()); + // open database + let db = sled::open(&OPT.database).unwrap(); + // setup cache + let cache = Arc::new(Cache("")); - // maybe send back here? + // wait for requests for stream in listener.incoming() { let mut stream = stream.unwrap(); pool.execute(move || { - let ip = stream.peer_addr(); + // TODO check if valid ip before reading request let mut buffer = [0; 1 << 10]; // 2 to the power of 10 + // how do I implement images with this? + stream.read(&mut buffer).unwrap(); - let text = str::from_utf8(&buffer) - .unwrap() - .trim_matches(0 as char); // gets rid of null at the end of buffer + let text = str::from_utf8(&buffer).unwrap().trim_matches(0 as char); // gets rid of null at the end of buffer let request: Request = text.parse().unwrap(); - handle(request) + // handle request + // add database and cache here + stream.write(handle(request).as_bytes()).unwrap(); }); } } diff --git a/src/models.rs b/src/models.rs deleted file mode 100644 index 277ade3..0000000 --- a/src/models.rs +++ /dev/null @@ -1,36 +0,0 @@ -use std::str::FromStr; - -pub struct Request { - pub method: String, - pub uri: String, - pub headers: Vec<(String, String)>, - pub body: String, -} - -// TODO implement this with display and enums -impl FromStr for Request { - type Err = String; - fn from_str(s: &str) -> Result { - let mut iter = s.lines(); - let mut first = iter.nth(0).unwrap().split_whitespace(); - let method = first.next().unwrap().to_string(); - let uri = first.next().unwrap().to_string(); - let mut headers: Vec<(String, String)> = vec![]; - - for line in &mut iter { - if line.is_empty() { - break; - } - let line: Vec<&str> = line.split(":").take(2).collect(); - headers.push((line[0].into(), line[1].into())); - } - let body: String = iter.fold(String::new(), |a, b| format!("{}{}", a, b)); - - Ok(Self { - method, - uri, - headers, - body, - }) - } -} diff --git a/src/post.rs b/src/post.rs new file mode 100644 index 0000000..75d0b07 --- /dev/null +++ b/src/post.rs @@ -0,0 +1,6 @@ +struct Post { + ip: [u8; 4], + code: u64, + date: String, + body: String, +} diff --git a/src/routes.rs b/src/routes.rs deleted file mode 100644 index 8b13789..0000000 --- a/src/routes.rs +++ /dev/null @@ -1 +0,0 @@ - diff --git a/src/www/index.html b/src/www/index.html index 9e3d3d2..d7320be 100644 --- a/src/www/index.html +++ b/src/www/index.html @@ -16,3 +16,191 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +