Browse Source

[xitca-web]Update to Rust 2021 edition. (#6853)

* update deps. update compiler.

* fix CI

* reduce cost of rng

* update deps

* update dep

* use http1 only service and proc macro.

* update dep

* use typed checked http method match
fakeshadow 3 years ago
parent
commit
1b4d515aea

+ 105 - 110
frameworks/Rust/xitca-web/Cargo.lock

@@ -4,15 +4,9 @@ version = 3
 
 
 [[package]]
 [[package]]
 name = "ahash"
 name = "ahash"
-version = "0.3.8"
+version = "0.7.6"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e8fd72866655d1904d6b0997d0b07ba561047d070fbe29de039031c641b61217"
-
-[[package]]
-name = "ahash"
-version = "0.7.4"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "43bb833f0bf979d8475d38fbf09ed3b8a55e1885fe93ad3f93239fc6a4f17b98"
+checksum = "fcb51a0695d8f838b1ee009b3fbf66bda078cd64590202a864a8f3e8c4315c47"
 dependencies = [
 dependencies = [
  "const-random",
  "const-random",
  "getrandom",
  "getrandom",
@@ -81,9 +75,9 @@ checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
 
 
 [[package]]
 [[package]]
 name = "cc"
 name = "cc"
-version = "1.0.70"
+version = "1.0.72"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d26a6ce4b6a484fa3edb70f7efa6fc430fd2b87285fe8b84304fd0936faa0dc0"
+checksum = "22a9137b95ea06864e018375b72adfb7db6e6f68cfc8df5a04d00288050485ee"
 
 
 [[package]]
 [[package]]
 name = "cfg-if"
 name = "cfg-if"
@@ -142,9 +136,9 @@ checksum = "7a81dae078cea95a014a339291cec439d2f232ebe854a9d672b796c6afafa9b7"
 
 
 [[package]]
 [[package]]
 name = "crypto-mac"
 name = "crypto-mac"
-version = "0.10.1"
+version = "0.11.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bff07008ec701e8028e2ceb8f83f0e4274ee62bd2dbdc4fefff2e9a91824081a"
+checksum = "b1d1a86f49236c215f271d40892d5fc950490551400b02ef360692c29815c714"
 dependencies = [
 dependencies = [
  "generic-array",
  "generic-array",
  "subtle",
  "subtle",
@@ -160,7 +154,6 @@ dependencies = [
  "byteorder",
  "byteorder",
  "diesel_derives",
  "diesel_derives",
  "pq-sys",
  "pq-sys",
- "r2d2",
 ]
 ]
 
 
 [[package]]
 [[package]]
@@ -203,9 +196,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "float-cmp"
 name = "float-cmp"
-version = "0.8.0"
+version = "0.9.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e1267f4ac4f343772758f7b1bdcbe767c218bbab93bb432acbf5162bbf85a6c4"
+checksum = "98de4bbd547a563b716d8dfa9aad1cb19bfab00f4fa09a6a4ed21dbcf44ce9c4"
 dependencies = [
 dependencies = [
  "num-traits",
  "num-traits",
 ]
 ]
@@ -333,9 +326,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "halfbrown"
 name = "halfbrown"
-version = "0.1.11"
+version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c12499524b5585419ab2f51545a19b842263a373580a83c0eb98a0142a260a10"
+checksum = "3ed39577259d319b81a15176a32673271be2786cb463889703c58c90fe83c825"
 dependencies = [
 dependencies = [
  "hashbrown",
  "hashbrown",
  "serde",
  "serde",
@@ -343,12 +336,11 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "hashbrown"
 name = "hashbrown"
-version = "0.7.2"
+version = "0.11.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "96282e96bfcd3da0d3aa9938bedf1e50df3269b6db08b4876d2da0bb1a0841cf"
+checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
 dependencies = [
 dependencies = [
- "ahash 0.3.8",
- "autocfg",
+ "ahash",
 ]
 ]
 
 
 [[package]]
 [[package]]
@@ -362,9 +354,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "hmac"
 name = "hmac"
-version = "0.10.1"
+version = "0.11.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c1441c6b1e930e2817404b5046f1f989899143a12bf92de603b69f4e0aee1e15"
+checksum = "2a2a2320eb7ec0ebe8da8f744d7812d9fc4cb4d09344ac01898dbcb6a20ae69b"
 dependencies = [
 dependencies = [
  "crypto-mac",
  "crypto-mac",
  "digest",
  "digest",
@@ -398,15 +390,15 @@ checksum = "acd94fdbe1d4ff688b67b04eee2e17bd50995534a61539e45adfefb45e5e5503"
 
 
 [[package]]
 [[package]]
 name = "httpdate"
 name = "httpdate"
-version = "1.0.1"
+version = "1.0.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "6456b8a6c8f33fee7d958fcd1b60d55b11940a79e63ae87013e6d22e26034440"
+checksum = "c4a1e36c821dbe04574f602848a19f742f4fb3c98d40449f11bcad18d6b17421"
 
 
 [[package]]
 [[package]]
 name = "instant"
 name = "instant"
-version = "0.1.11"
+version = "0.1.12"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "716d3d89f35ac6a34fd0eed635395f4c3b76fa889338a4632e5231a8684216bd"
+checksum = "7a5bbe824c507c5da5956355e86a746d82e0e1464f65d862cc5e71da70e94b2c"
 dependencies = [
 dependencies = [
  "cfg-if",
  "cfg-if",
 ]
 ]
@@ -441,15 +433,15 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
 
 
 [[package]]
 [[package]]
 name = "libc"
 name = "libc"
-version = "0.2.102"
+version = "0.2.108"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a2a5ac8f984bfcf3a823267e5fde638acc3325f6496633a5da6bb6eb2171e103"
+checksum = "8521a1b57e76b1ec69af7599e75e38e7b7fad6610f037db8c79b127201b5d119"
 
 
 [[package]]
 [[package]]
 name = "libmimalloc-sys"
 name = "libmimalloc-sys"
-version = "0.1.22"
+version = "0.1.23"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1d1b8479c593dba88c2741fc50b92e13dbabbbe0bd504d979f244ccc1a5b1c01"
+checksum = "9636c194f9db483f4d0adf2f99a65011a99f904bd222bbd67fb4df4f37863c30"
 dependencies = [
 dependencies = [
  "cc",
  "cc",
 ]
 ]
@@ -497,18 +489,18 @@ checksum = "308cc39be01b73d0d18f82a0e7b2a3df85245f84af96fdddc5d202d27e47b86a"
 
 
 [[package]]
 [[package]]
 name = "mimalloc"
 name = "mimalloc"
-version = "0.1.26"
+version = "0.1.27"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fb74897ce508e6c49156fd1476fc5922cbc6e75183c65e399c765a09122e5130"
+checksum = "cf5f78c1d9892fb5677a8b2f543f967ab891ac0f71feecd961435b74f877283a"
 dependencies = [
 dependencies = [
  "libmimalloc-sys",
  "libmimalloc-sys",
 ]
 ]
 
 
 [[package]]
 [[package]]
 name = "mio"
 name = "mio"
-version = "0.7.13"
+version = "0.7.14"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8c2bdb6314ec10835cd3293dd268473a835c02b7b352e788be788b3c6ca6bb16"
+checksum = "8067b404fe97c70829f082dec8bcf4f71225d7eaea1d8645349cb76fa06205cc"
 dependencies = [
 dependencies = [
  "libc",
  "libc",
  "log",
  "log",
@@ -599,18 +591,18 @@ checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
 
 
 [[package]]
 [[package]]
 name = "phf"
 name = "phf"
-version = "0.8.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3dfb61232e34fcb633f43d12c58f83c1df82962dcdfa565a4e866ffc17dafe12"
+checksum = "b9fc3db1018c4b59d7d582a739436478b6035138b6aecbce989fc91c3e98409f"
 dependencies = [
 dependencies = [
  "phf_shared",
  "phf_shared",
 ]
 ]
 
 
 [[package]]
 [[package]]
 name = "phf_shared"
 name = "phf_shared"
-version = "0.8.0"
+version = "0.10.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c00cf8b9eafe68dde5e9eaa2cef8ee84a9336a47d566ec55ca16589633b65af7"
+checksum = "b6796ad771acdc0123d2a88dc428b5e38ef24456743ddb1744ed628f9815c096"
 dependencies = [
 dependencies = [
  "siphasher",
  "siphasher",
 ]
 ]
@@ -629,9 +621,9 @@ checksum = "8b870d8c151b6f2fb93e84a13146138f05d02ed11c7e7c54f8826aaaf7c9f184"
 
 
 [[package]]
 [[package]]
 name = "postgres-protocol"
 name = "postgres-protocol"
-version = "0.6.1"
+version = "0.6.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ff3e0f70d32e20923cabf2df02913be7c1842d4c772db8065c00fcfdd1d1bff3"
+checksum = "b145e6a4ed52cb316a27787fc20fe8a25221cb476479f61e4e0327c15b98d91a"
 dependencies = [
 dependencies = [
  "base64",
  "base64",
  "byteorder",
  "byteorder",
@@ -647,9 +639,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "postgres-types"
 name = "postgres-types"
-version = "0.2.1"
+version = "0.2.2"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "430f4131e1b7657b0cd9a2b0c3408d77c9a43a042d300b8c77f981dffcc43a2f"
+checksum = "04619f94ba0cc80999f4fc7073607cb825bc739a883cb6d20900fc5e009d6b0d"
 dependencies = [
 dependencies = [
  "bytes",
  "bytes",
  "fallible-iterator",
  "fallible-iterator",
@@ -658,9 +650,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "ppv-lite86"
 name = "ppv-lite86"
-version = "0.2.10"
+version = "0.2.15"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "ac74c624d6b2d21f425f752262f42188365d7b8ff1aff74c82e45136510a4857"
+checksum = "ed0cfbc8191465bed66e1718596ee0b0b35d5ee1f41c5df2189d0fe8bde535ba"
 
 
 [[package]]
 [[package]]
 name = "pq-sys"
 name = "pq-sys"
@@ -694,24 +686,13 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "quote"
 name = "quote"
-version = "1.0.9"
+version = "1.0.10"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c3d0b9745dc2debf507c8422de05d7226cc1f0644216dfdfead988f9b1ab32a7"
+checksum = "38bc8cc6a5f2e3655e0899c1b848643b2562f853f114bfec7be120678e3ace05"
 dependencies = [
 dependencies = [
  "proc-macro2",
  "proc-macro2",
 ]
 ]
 
 
-[[package]]
-name = "r2d2"
-version = "0.8.9"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "545c5bc2b880973c9c10e4067418407a0ccaa3091781d1671d46eb35107cb26f"
-dependencies = [
- "log",
- "parking_lot",
- "scheduled-thread-pool",
-]
-
 [[package]]
 [[package]]
 name = "rand"
 name = "rand"
 version = "0.8.4"
 version = "0.8.4"
@@ -804,15 +785,6 @@ dependencies = [
  "sailfish-compiler",
  "sailfish-compiler",
 ]
 ]
 
 
-[[package]]
-name = "scheduled-thread-pool"
-version = "0.2.5"
-source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dc6f74fd1204073fa02d5d5d68bec8021be4c38690b61264b2fdb48083d0e7d7"
-dependencies = [
- "parking_lot",
-]
-
 [[package]]
 [[package]]
 name = "scopeguard"
 name = "scopeguard"
 version = "1.1.0"
 version = "1.1.0"
@@ -841,9 +813,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "serde_json"
 name = "serde_json"
-version = "1.0.68"
+version = "1.0.71"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "0f690853975602e1bfe1ccbf50504d67174e3bcf340f23b5ea9992e0587a52d8"
+checksum = "063bf466a64011ac24040a49009724ee60a57da1b437617ceb32e53ad61bfb19"
 dependencies = [
 dependencies = [
  "itoa",
  "itoa",
  "ryu",
  "ryu",
@@ -874,9 +846,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "simd-json"
 name = "simd-json"
-version = "0.4.7"
+version = "0.4.8"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "529edb21cdc2629d7214de58672ec9fe5678b623e8fffb03327f77d7291d8865"
+checksum = "e67eb096671712144fb1357787c4312720c99444f52900ca2a20bee57a02cc64"
 dependencies = [
 dependencies = [
  "halfbrown",
  "halfbrown",
  "serde",
  "serde",
@@ -899,15 +871,15 @@ checksum = "533494a8f9b724d33625ab53c6c4800f7cc445895924a8ef649222dcb76e938b"
 
 
 [[package]]
 [[package]]
 name = "slab"
 name = "slab"
-version = "0.4.4"
+version = "0.4.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c307a32c1c5c437f38c7fd45d753050587732ba8628319fbdf12a7e289ccc590"
+checksum = "9def91fd1e018fe007022791f865d0ccc9b3a0d5001e01aabb8b40e46000afb5"
 
 
 [[package]]
 [[package]]
 name = "smallvec"
 name = "smallvec"
-version = "1.6.1"
+version = "1.7.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "fe0f37c9e8f3c5a4a66ad655a93c74daac4ad00c441533bf5c6e7990bb42604e"
+checksum = "1ecab6c735a6bb4139c0caafd0cc3635748bbb3acf4550e8138122099251f309"
 
 
 [[package]]
 [[package]]
 name = "socket2"
 name = "socket2"
@@ -937,15 +909,21 @@ checksum = "6bdef32e8150c2a081110b42772ffe7d7c9032b606bc226c8260fd97e0976601"
 
 
 [[package]]
 [[package]]
 name = "syn"
 name = "syn"
-version = "1.0.76"
+version = "1.0.80"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c6f107db402c2c2055242dbf4d2af0e69197202e9faacbef9571bbe47f5a1b84"
+checksum = "d010a1623fbd906d51d650a9916aaefc05ffa0e4053ff7fe601167f3e715d194"
 dependencies = [
 dependencies = [
  "proc-macro2",
  "proc-macro2",
  "quote",
  "quote",
  "unicode-xid",
  "unicode-xid",
 ]
 ]
 
 
+[[package]]
+name = "tang-rs"
+version = "0.2.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "b625cb7d76f7bb1887a11d2e7b97677539924010773844ed17252c6ec7877595"
+
 [[package]]
 [[package]]
 name = "tiny-keccak"
 name = "tiny-keccak"
 version = "2.0.2"
 version = "2.0.2"
@@ -957,9 +935,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tinyvec"
 name = "tinyvec"
-version = "1.4.0"
+version = "1.5.1"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5241dd6f21443a3606b432718b166d3cedc962fd4b8bea54a8bc7f514ebda986"
+checksum = "2c1c1d5a42b6245520c249549ec267180beaffcc0615401ac8e31853d4b6d8d2"
 dependencies = [
 dependencies = [
  "tinyvec_macros",
  "tinyvec_macros",
 ]
 ]
@@ -972,9 +950,9 @@ checksum = "cda74da7e1a664f795bb1f8a87ec406fb89a02522cf6e50620d016add6dbbf5c"
 
 
 [[package]]
 [[package]]
 name = "tokio"
 name = "tokio"
-version = "1.12.0"
+version = "1.14.0"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c2c2416fdedca8443ae44b4527de1ea633af61d8f7169ffa6e72c5b53d24efcc"
+checksum = "70e992e41e0d2fb9f755b37446f20900f64446ef54874f40a60c78f021ac6144"
 dependencies = [
 dependencies = [
  "autocfg",
  "autocfg",
  "bytes",
  "bytes",
@@ -992,9 +970,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tokio-macros"
 name = "tokio-macros"
-version = "1.3.0"
+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 = "54473be61f4ebe4efd09cec9bd5d16fa51d70ea0192213d754d2d500457db110"
+checksum = "c9efc1aba077437943f7515666aa2b882dfabfbfdf89c819ea75a8d6e9eaba5e"
 dependencies = [
 dependencies = [
  "proc-macro2",
  "proc-macro2",
  "quote",
  "quote",
@@ -1003,9 +981,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tokio-postgres"
 name = "tokio-postgres"
-version = "0.7.2"
+version = "0.7.5"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2d2b1383c7e4fb9a09e292c7c6afb7da54418d53b045f1c1fac7a911411a2b8b"
+checksum = "4b6c8b33df661b548dcd8f9bf87debb8c56c05657ed291122e1188698c2ece95"
 dependencies = [
 dependencies = [
  "async-trait",
  "async-trait",
  "byteorder",
  "byteorder",
@@ -1026,9 +1004,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tokio-util"
 name = "tokio-util"
-version = "0.6.8"
+version = "0.6.9"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "08d3725d3efa29485e87311c5b699de63cde14b00ed4d256b8318aa30ca452cd"
+checksum = "9e99e1983e5d376cd8eb4b66604d2e99e79f5bd988c3055891dcd8c9e2604cc0"
 dependencies = [
 dependencies = [
  "bytes",
  "bytes",
  "futures-core",
  "futures-core",
@@ -1040,9 +1018,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tracing"
 name = "tracing"
-version = "0.1.28"
+version = "0.1.29"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "84f96e095c0c82419687c20ddf5cb3eadb61f4e1405923c9dc8e53a1adacbda8"
+checksum = "375a639232caf30edfc78e8d89b2d4c375515393e7af7e16f01cd96917fb2105"
 dependencies = [
 dependencies = [
  "cfg-if",
  "cfg-if",
  "pin-project-lite",
  "pin-project-lite",
@@ -1051,12 +1029,9 @@ dependencies = [
 
 
 [[package]]
 [[package]]
 name = "tracing-core"
 name = "tracing-core"
-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 = "46125608c26121c81b0c6d693eab5a420e416da7e43c426d2e8f7df8da8a3acf"
-dependencies = [
- "lazy_static",
-]
+checksum = "1f4ed65637b8390770814083d20756f87bfa2c21bf2f110babdc5438351746e4"
 
 
 [[package]]
 [[package]]
 name = "typenum"
 name = "typenum"
@@ -1066,9 +1041,9 @@ checksum = "b63708a265f51345575b27fe43f9500ad611579e764c79edbc2037b1121959ec"
 
 
 [[package]]
 [[package]]
 name = "unicode-bidi"
 name = "unicode-bidi"
-version = "0.3.6"
+version = "0.3.7"
 source = "registry+https://github.com/rust-lang/crates.io-index"
 source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "246f4c42e67e7a4e3c6106ff716a5d067d4132a642840b242e357e468a2a0085"
+checksum = "1a01404663e3db436ed2746d9fefef640d868edae3cceb81c3b8d5732fda678f"
 
 
 [[package]]
 [[package]]
 name = "unicode-normalization"
 name = "unicode-normalization"
@@ -1087,9 +1062,9 @@ checksum = "8ccb82d61f80a663efe1f787a51b16b5a51e3314d6ac365b08639f52387b33f3"
 
 
 [[package]]
 [[package]]
 name = "value-trait"
 name = "value-trait"
-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 = "4b637f98040dfa411b01a85b238a8cadbd797b303c23007157dee4bbbd3a72af"
+checksum = "0393efdd7d82f856a927b0fcafa80bca45911f5c89ef6b9d80197bebc284f72e"
 dependencies = [
 dependencies = [
  "float-cmp",
  "float-cmp",
  "halfbrown",
  "halfbrown",
@@ -1152,47 +1127,63 @@ checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 [[package]]
 [[package]]
 name = "xitca-http"
 name = "xitca-http"
 version = "0.1.0"
 version = "0.1.0"
-source = "git+https://github.com/fakeshadow/xitca-web.git?rev=7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149#7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149"
+source = "git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3#cce3eee576a9b303a71d4654a6c922402b5fd4f3"
 dependencies = [
 dependencies = [
- "bytes",
  "futures-core",
  "futures-core",
  "http",
  "http",
  "httparse",
  "httparse",
  "httpdate",
  "httpdate",
  "itoa",
  "itoa",
  "pin-project-lite",
  "pin-project-lite",
+ "socket2",
  "tokio",
  "tokio",
  "tracing",
  "tracing",
- "xitca-server",
+ "xitca-io",
  "xitca-service",
  "xitca-service",
 ]
 ]
 
 
 [[package]]
 [[package]]
-name = "xitca-server"
+name = "xitca-http-codegen"
+version = "0.1.0"
+source = "git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3#cce3eee576a9b303a71d4654a6c922402b5fd4f3"
+dependencies = [
+ "quote",
+ "syn",
+]
+
+[[package]]
+name = "xitca-io"
 version = "0.1.0"
 version = "0.1.0"
-source = "git+https://github.com/fakeshadow/xitca-web.git?rev=7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149#7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149"
+source = "git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3#cce3eee576a9b303a71d4654a6c922402b5fd4f3"
 dependencies = [
 dependencies = [
  "bytes",
  "bytes",
+ "tokio",
+]
+
+[[package]]
+name = "xitca-server"
+version = "0.1.0"
+source = "git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3#cce3eee576a9b303a71d4654a6c922402b5fd4f3"
+dependencies = [
  "futures-core",
  "futures-core",
  "num_cpus",
  "num_cpus",
- "pin-project-lite",
  "tokio",
  "tokio",
  "tracing",
  "tracing",
+ "xitca-io",
  "xitca-service",
  "xitca-service",
 ]
 ]
 
 
 [[package]]
 [[package]]
 name = "xitca-service"
 name = "xitca-service"
 version = "0.1.0"
 version = "0.1.0"
-source = "git+https://github.com/fakeshadow/xitca-web.git?rev=7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149#7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149"
+source = "git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3#cce3eee576a9b303a71d4654a6c922402b5fd4f3"
 
 
 [[package]]
 [[package]]
 name = "xitca-web"
 name = "xitca-web"
 version = "0.1.0"
 version = "0.1.0"
 dependencies = [
 dependencies = [
- "ahash 0.7.4",
+ "ahash",
  "atoi",
  "atoi",
- "bytes",
  "core_affinity",
  "core_affinity",
  "diesel",
  "diesel",
  "futures-util",
  "futures-util",
@@ -1201,20 +1192,24 @@ dependencies = [
  "sailfish",
  "sailfish",
  "serde",
  "serde",
  "simd-json",
  "simd-json",
+ "tang-rs",
  "tokio",
  "tokio",
  "tokio-postgres",
  "tokio-postgres",
  "xitca-http",
  "xitca-http",
- "xitca-web 0.1.0 (git+https://github.com/fakeshadow/xitca-web.git?rev=7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149)",
+ "xitca-http-codegen",
+ "xitca-server",
+ "xitca-service",
+ "xitca-web 0.1.0 (git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3)",
 ]
 ]
 
 
 [[package]]
 [[package]]
 name = "xitca-web"
 name = "xitca-web"
 version = "0.1.0"
 version = "0.1.0"
-source = "git+https://github.com/fakeshadow/xitca-web.git?rev=7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149#7499e8a5aa4f7e1f17bbf6b6ee0816828dff3149"
+source = "git+https://github.com/fakeshadow/xitca-web.git?rev=cce3eee576a9b303a71d4654a6c922402b5fd4f3#cce3eee576a9b303a71d4654a6c922402b5fd4f3"
 dependencies = [
 dependencies = [
- "bytes",
  "futures-core",
  "futures-core",
  "xitca-http",
  "xitca-http",
+ "xitca-io",
  "xitca-server",
  "xitca-server",
  "xitca-service",
  "xitca-service",
 ]
 ]

+ 19 - 14
frameworks/Rust/xitca-web/Cargo.toml

@@ -1,7 +1,7 @@
 [package]
 [package]
 name = "xitca-web"
 name = "xitca-web"
 version = "0.1.0"
 version = "0.1.0"
-edition = "2018"
+edition = "2021"
 
 
 [[bin]]
 [[bin]]
 name = "xitca-web"
 name = "xitca-web"
@@ -12,23 +12,25 @@ name = "xitca-web-diesel"
 path = "./src/main_diesel.rs"
 path = "./src/main_diesel.rs"
 
 
 [dependencies]
 [dependencies]
-xitca-http = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "a470092d8f1e1c3bb7a9831c175bf112b70f81e7" }
-xitca-web = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "a470092d8f1e1c3bb7a9831c175bf112b70f81e7" }
+xitca-http = "0.1"
+xitca-http-codegen = "0.1"
+xitca-server = "0.1"
+xitca-service = "0.1"
+xitca-web = "0.1"
 
 
-ahash = { version = "0.7.4", features = ["compile-time-rng"] }
+ahash = { version = "0.7.6", features = ["compile-time-rng"] }
 atoi = "0.4.0"
 atoi = "0.4.0"
-bytes = "1"
 core_affinity = "0.5.10"
 core_affinity = "0.5.10"
-diesel = { version = "1.4.7", features = ["postgres"] }
-futures-util = { version = "0.3", default-features = false, features = ["alloc"] }
-mimalloc = { version = "0.1.25", default-features = false }
+diesel = { version = "1.4.8", features = ["postgres"] }
+futures-util = { version = "0.3.18", default-features = false, features = ["alloc"] }
+mimalloc = { version = "0.1.27", default-features = false }
 rand = { version = "0.8", default-features = false, features = ["min_const_gen", "small_rng"] }
 rand = { version = "0.8", default-features = false, features = ["min_const_gen", "small_rng"] }
 sailfish = "0.3.3"
 sailfish = "0.3.3"
 serde = "1"
 serde = "1"
-simd-json = "0.4.6"
+simd-json = "0.4.8"
 tang-rs = "0.2"
 tang-rs = "0.2"
-tokio = { version = "1.7", features = ["macros", "rt"] }
-tokio-postgres = "0.7.2"
+tokio = { version = "1.14", features = ["macros", "rt"] }
+tokio-postgres = "0.7.5"
 
 
 [profile.release]
 [profile.release]
 lto = true
 lto = true
@@ -37,6 +39,9 @@ codegen-units = 1
 panic = "abort"
 panic = "abort"
 
 
 [patch.crates-io]
 [patch.crates-io]
-xitca-http = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "a470092d8f1e1c3bb7a9831c175bf112b70f81e7" }
-xitca-server = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "a470092d8f1e1c3bb7a9831c175bf112b70f81e7" }
-xitca-service = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "a470092d8f1e1c3bb7a9831c175bf112b70f81e7" }
+xitca-http = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "958e3c2205e6036c7e0cbf4813d08ddf6029fd1d" }
+xitca-http-codegen = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "958e3c2205e6036c7e0cbf4813d08ddf6029fd1d" }
+xitca-io = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "958e3c2205e6036c7e0cbf4813d08ddf6029fd1d" }
+xitca-server = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "958e3c2205e6036c7e0cbf4813d08ddf6029fd1d" }
+xitca-service = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "958e3c2205e6036c7e0cbf4813d08ddf6029fd1d" }
+xitca-web = { git = "https://github.com/fakeshadow/xitca-web.git", rev = "958e3c2205e6036c7e0cbf4813d08ddf6029fd1d" }

+ 22 - 31
frameworks/Rust/xitca-web/src/db_diesel.rs

@@ -15,14 +15,14 @@ type DbResult<T> = Result<T, Box<dyn Error + Send + Sync + 'static>>;
 pub struct DieselPoolManager(String);
 pub struct DieselPoolManager(String);
 
 
 impl Manager for DieselPoolManager {
 impl Manager for DieselPoolManager {
-    type Connection = PgConnection;
+    type Connection = (PgConnection, SmallRng);
     type Error = DieselPoolError;
     type Error = DieselPoolError;
     type Timeout = Sleep;
     type Timeout = Sleep;
     type TimeoutError = ();
     type TimeoutError = ();
 
 
     fn connect(&self) -> ManagerFuture<Result<Self::Connection, Self::Error>> {
     fn connect(&self) -> ManagerFuture<Result<Self::Connection, Self::Error>> {
         let conn = PgConnection::establish(self.0.as_str());
         let conn = PgConnection::establish(self.0.as_str());
-        Box::pin(async move { Ok(conn?) })
+        Box::pin(async move { Ok((conn?, SmallRng::from_entropy())) })
     }
     }
 
 
     fn is_valid<'a>(
     fn is_valid<'a>(
@@ -86,10 +86,7 @@ impl From<()> for DieselPoolError {
 }
 }
 
 
 #[derive(Clone)]
 #[derive(Clone)]
-pub struct DieselPool {
-    pool: Pool<DieselPoolManager>,
-    rng: SmallRng,
-}
+pub struct DieselPool(Pool<DieselPoolManager>);
 
 
 pub async fn create(config: &str) -> io::Result<DieselPool> {
 pub async fn create(config: &str) -> io::Result<DieselPool> {
     let pool = tang_rs::Builder::new()
     let pool = tang_rs::Builder::new()
@@ -102,24 +99,22 @@ pub async fn create(config: &str) -> io::Result<DieselPool> {
         .await
         .await
         .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
         .map_err(|e| io::Error::new(io::ErrorKind::Other, e))?;
 
 
-    Ok(DieselPool {
-        pool,
-        rng: SmallRng::from_entropy(),
-    })
+    Ok(DieselPool(pool))
 }
 }
 
 
 impl DieselPool {
 impl DieselPool {
     pub async fn get_world(&self) -> DbResult<World> {
     pub async fn get_world(&self) -> DbResult<World> {
-        let mut rng = self.rng.clone();
-        let conn = self.pool.get_owned().await?;
+        let mut conn = self.0.get_owned().await?;
 
 
         spawn_blocking(move || {
         spawn_blocking(move || {
             use crate::schema::world::dsl::*;
             use crate::schema::world::dsl::*;
 
 
+            let (c, rng) = &mut *conn;
+
             let random_id = rng.gen_range(1..10_001);
             let random_id = rng.gen_range(1..10_001);
             let w = world
             let w = world
                 .filter(id.eq(random_id))
                 .filter(id.eq(random_id))
-                .load::<World>(&*conn)?
+                .load::<World>(c)?
                 .pop()
                 .pop()
                 .unwrap();
                 .unwrap();
 
 
@@ -129,20 +124,17 @@ impl DieselPool {
     }
     }
 
 
     pub async fn get_worlds(&self, num: u16) -> DbResult<Vec<World>> {
     pub async fn get_worlds(&self, num: u16) -> DbResult<Vec<World>> {
-        let mut rng = self.rng.clone();
-        let conn = self.pool.get_owned().await?;
+        let mut conn = self.0.get_owned().await?;
 
 
         spawn_blocking(move || {
         spawn_blocking(move || {
             use crate::schema::world::dsl::*;
             use crate::schema::world::dsl::*;
 
 
+            let (c, rng) = &mut *conn;
+
             (0..num)
             (0..num)
                 .map(|_| {
                 .map(|_| {
                     let w_id = rng.gen_range(1..10_001);
                     let w_id = rng.gen_range(1..10_001);
-                    let w = world
-                        .filter(id.eq(w_id))
-                        .load::<World>(&*conn)?
-                        .pop()
-                        .unwrap();
+                    let w = world.filter(id.eq(w_id)).load::<World>(c)?.pop().unwrap();
                     Ok(w)
                     Ok(w)
                 })
                 })
                 .collect()
                 .collect()
@@ -151,20 +143,17 @@ impl DieselPool {
     }
     }
 
 
     pub async fn update(&self, num: u16) -> DbResult<Vec<World>> {
     pub async fn update(&self, num: u16) -> DbResult<Vec<World>> {
-        let mut rng = self.rng.clone();
-        let conn = self.pool.get_owned().await?;
+        let mut conn = self.0.get_owned().await?;
 
 
         spawn_blocking(move || {
         spawn_blocking(move || {
             use crate::schema::world::dsl::*;
             use crate::schema::world::dsl::*;
 
 
+            let (c, rng) = &mut *conn;
+
             let mut worlds = (0..num)
             let mut worlds = (0..num)
                 .map(|_| {
                 .map(|_| {
                     let w_id: i32 = rng.gen_range(1..10_001);
                     let w_id: i32 = rng.gen_range(1..10_001);
-                    let mut w = world
-                        .filter(id.eq(w_id))
-                        .load::<World>(&*conn)?
-                        .pop()
-                        .unwrap();
+                    let mut w = world.filter(id.eq(w_id)).load::<World>(c)?.pop().unwrap();
                     w.randomnumber = rng.gen_range(1..10_001);
                     w.randomnumber = rng.gen_range(1..10_001);
                     Ok(w)
                     Ok(w)
                 })
                 })
@@ -172,12 +161,12 @@ impl DieselPool {
 
 
             worlds.sort_by_key(|w| w.id);
             worlds.sort_by_key(|w| w.id);
 
 
-            conn.transaction::<_, diesel::result::Error, _>(|| {
+            c.transaction::<_, diesel::result::Error, _>(|| {
                 for w in &worlds {
                 for w in &worlds {
                     diesel::update(world)
                     diesel::update(world)
                         .filter(id.eq(w.id))
                         .filter(id.eq(w.id))
                         .set(randomnumber.eq(w.randomnumber))
                         .set(randomnumber.eq(w.randomnumber))
-                        .execute(&*conn)?;
+                        .execute(c)?;
                 }
                 }
                 Ok(())
                 Ok(())
             })?;
             })?;
@@ -188,12 +177,14 @@ impl DieselPool {
     }
     }
 
 
     pub async fn tell_fortune(&self) -> DbResult<Fortunes> {
     pub async fn tell_fortune(&self) -> DbResult<Fortunes> {
-        let conn = self.pool.get_owned().await?;
+        let mut conn = self.0.get_owned().await?;
 
 
         spawn_blocking(move || {
         spawn_blocking(move || {
             use crate::schema::fortune::dsl::*;
             use crate::schema::fortune::dsl::*;
 
 
-            let mut items = fortune.load::<Fortune>(&*conn)?;
+            let (c, _) = &mut *conn;
+
+            let mut items = fortune.load::<Fortune>(c)?;
 
 
             items.push(Fortune::new(0, "Additional fortune added at request time."));
             items.push(Fortune::new(0, "Additional fortune added at request time."));
             items.sort_by(|it, next| it.message.cmp(&next.message));
             items.sort_by(|it, next| it.message.cmp(&next.message));

+ 139 - 69
frameworks/Rust/xitca-web/src/main.rs

@@ -1,3 +1,5 @@
+#![feature(generic_associated_types, type_alias_impl_trait)]
+
 #[global_allocator]
 #[global_allocator]
 static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
 static GLOBAL: mimalloc::MiMalloc = mimalloc::MiMalloc;
 
 
@@ -6,110 +8,178 @@ mod ser;
 mod util;
 mod util;
 
 
 use std::{
 use std::{
+    convert::Infallible,
     error::Error,
     error::Error,
     future::ready,
     future::ready,
     io,
     io,
     sync::{Arc, Mutex},
     sync::{Arc, Mutex},
 };
 };
 
 
-use bytes::Bytes;
-use xitca_http::http::{
-    header::{CONTENT_TYPE, SERVER},
-    Method,
+use serde::Serialize;
+use xitca_http::{
+    body::ResponseBody,
+    bytes::Bytes,
+    config::HttpServiceConfig,
+    h1::RequestBody,
+    http::{
+        self,
+        header::{CONTENT_TYPE, SERVER},
+        IntoResponse,
+    },
+    util::service::get,
+    HttpServiceBuilder,
 };
 };
-use xitca_web::{dev::fn_service, request::WebRequest, App, HttpServer};
+use xitca_server::Builder;
 
 
 use self::db::Client;
 use self::db::Client;
+use self::ser::Message;
 use self::util::{
 use self::util::{
-    internal, json, json_response, not_found, plain_text, AppState, HandleResult, QueryParse,
+    internal, not_found, AppState, QueryParse, JSON_HEADER_VALUE, SERVER_HEADER_VALUE,
+    TEXT_HEADER_VALUE,
 };
 };
 
 
-type State = AppState<Client>;
+type Request = http::Request<RequestBody>;
+
+type Response = http::Response<ResponseBody>;
 
 
 #[tokio::main(flavor = "current_thread")]
 #[tokio::main(flavor = "current_thread")]
 async fn main() -> io::Result<()> {
 async fn main() -> io::Result<()> {
-    let config = "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world";
-
     let cores = core_affinity::get_core_ids().unwrap_or_else(Vec::new);
     let cores = core_affinity::get_core_ids().unwrap_or_else(Vec::new);
     let cores = Arc::new(Mutex::new(cores));
     let cores = Arc::new(Mutex::new(cores));
 
 
-    HttpServer::new(move || {
-        App::with_async_state(move || async move {
-            let client = db::create(config).await;
-            AppState::new(client)
+    let factory = || {
+        let http = Http {
+            config: "postgres://benchmarkdbuser:benchmarkdbpass@tfb-database/hello_world",
+        };
+
+        let config = HttpServiceConfig::new()
+            .disable_vectored_write()
+            .max_request_headers::<8>();
+
+        HttpServiceBuilder::h1(get(http)).config(config)
+    };
+
+    Builder::new()
+        .on_worker_start(move || {
+            if let Some(core) = cores.lock().unwrap().pop() {
+                core_affinity::set_for_current(core);
+            }
+            ready(())
         })
         })
-        .service(fn_service(handle))
-    })
-    .force_flat_buf()
-    .max_request_headers::<8>()
-    .on_worker_start(move || {
-        if let Some(core) = cores.lock().unwrap().pop() {
-            core_affinity::set_for_current(core);
-        }
-        ready(())
-    })
-    .bind("0.0.0.0:8080")?
-    .run()
-    .await
+        .bind("xitca-web", "0.0.0.0:8080", factory)?
+        .build()
+        .await
 }
 }
 
 
-async fn handle(req: &mut WebRequest<'_, State>) -> HandleResult {
-    let inner = req.request_mut();
-
-    match (inner.method(), inner.uri().path()) {
-        (&Method::GET, "/plaintext") => plain_text(req),
-        (&Method::GET, "/json") => json(req),
-        (&Method::GET, "/db") => db(req).await,
-        (&Method::GET, "/fortunes") => fortunes(req).await,
-        (&Method::GET, "/queries") => queries(req).await,
-        (&Method::GET, "/updates") => updates(req).await,
-        _ => not_found(),
-    }
+#[derive(Clone)]
+struct Http {
+    config: &'static str,
 }
 }
 
 
-async fn db(req: &mut WebRequest<'_, State>) -> HandleResult {
-    match req.state().client().get_world().await {
-        Ok(ref world) => json_response(req, world),
-        Err(_) => internal(),
-    }
+struct HttpService {
+    state: AppState<Client>,
 }
 }
 
 
-async fn fortunes(req: &mut WebRequest<'_, State>) -> HandleResult {
-    match _fortunes(req.state().client()).await {
-        Ok(body) => {
-            let mut res = req.as_response(body);
+#[xitca_http_codegen::service_impl]
+impl HttpService {
+    async fn new_service(http: &Http, _: ()) -> Result<Self, ()> {
+        let client = db::create(http.config).await;
 
 
-            res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE);
-            res.headers_mut()
-                .append(CONTENT_TYPE, util::HTML_HEADER_VALUE);
+        Ok(HttpService {
+            state: AppState::new(client),
+        })
+    }
+
+    async fn ready(&self) -> Result<(), Infallible> {
+        Ok(())
+    }
 
 
-            Ok(res)
+    async fn call(&self, req: Request) -> Result<Response, Infallible> {
+        match req.uri().path() {
+            "/plaintext" => self.plain_text(req),
+            "/json" => self.json(req),
+            "/db" => self.db(req).await,
+            "/fortunes" => self.fortunes(req).await,
+            "/queries" => self.queries(req).await,
+            "/updates" => self.updates(req).await,
+            _ => not_found(),
         }
         }
-        Err(_) => internal(),
     }
     }
 }
 }
 
 
-async fn queries(req: &mut WebRequest<'_, State>) -> HandleResult {
-    let num = req.request_mut().uri().query().parse_query();
+impl HttpService {
+    fn plain_text(&self, req: Request) -> Result<Response, Infallible> {
+        let mut res = req.into_response("Hello, World!");
 
 
-    match req.state().client().get_worlds(num).await {
-        Ok(worlds) => json_response(req, worlds.as_slice()),
-        Err(_) => internal(),
+        res.headers_mut().append(SERVER, SERVER_HEADER_VALUE);
+        res.headers_mut().append(CONTENT_TYPE, TEXT_HEADER_VALUE);
+
+        Ok(res)
+    }
+
+    #[inline]
+    fn json(&self, req: Request) -> Result<Response, Infallible> {
+        self._json(req, &Message::new())
     }
     }
-}
 
 
-async fn updates(req: &mut WebRequest<'_, State>) -> HandleResult {
-    let num = req.request_mut().uri().query().parse_query();
+    async fn db(&self, req: Request) -> Result<Response, Infallible> {
+        match self.state.client().get_world().await {
+            Ok(ref world) => self._json(req, world),
+            Err(_) => internal(),
+        }
+    }
+
+    async fn fortunes(&self, req: Request) -> Result<Response, Infallible> {
+        match self._fortunes().await {
+            Ok(body) => {
+                let mut res = req.into_response(body);
 
 
-    match req.state().client().update(num).await {
-        Ok(worlds) => json_response(req, worlds.as_slice()),
-        Err(_) => internal(),
+                res.headers_mut().append(SERVER, util::SERVER_HEADER_VALUE);
+                res.headers_mut()
+                    .append(CONTENT_TYPE, util::HTML_HEADER_VALUE);
+
+                Ok(res)
+            }
+            Err(_) => internal(),
+        }
+    }
+
+    async fn queries(&self, req: Request) -> Result<Response, Infallible> {
+        let num = req.uri().query().parse_query();
+        match self.state.client().get_worlds(num).await {
+            Ok(worlds) => self._json(req, worlds.as_slice()),
+            Err(_) => internal(),
+        }
     }
     }
-}
 
 
-#[inline]
-async fn _fortunes(client: &Client) -> Result<Bytes, Box<dyn Error>> {
-    use sailfish::TemplateOnce;
-    let fortunes = client.tell_fortune().await?.render_once()?;
-    Ok(fortunes.into())
+    async fn updates(&self, req: Request) -> Result<Response, Infallible> {
+        let num = req.uri().query().parse_query();
+        match self.state.client().update(num).await {
+            Ok(worlds) => self._json(req, worlds.as_slice()),
+            Err(_) => internal(),
+        }
+    }
+
+    #[inline]
+    async fn _fortunes(&self) -> Result<Bytes, Box<dyn Error>> {
+        use sailfish::TemplateOnce;
+        let fortunes = self.state.client().tell_fortune().await?.render_once()?;
+        Ok(fortunes.into())
+    }
+
+    #[inline]
+    fn _json<S>(&self, req: Request, value: &S) -> Result<Response, Infallible>
+    where
+        S: ?Sized + Serialize,
+    {
+        let mut writer = self.state.writer();
+        simd_json::to_writer(&mut writer, value).unwrap();
+        let body = writer.take();
+
+        let mut res = req.into_response(body);
+        res.headers_mut().append(SERVER, SERVER_HEADER_VALUE);
+        res.headers_mut().append(CONTENT_TYPE, JSON_HEADER_VALUE);
+
+        Ok(res)
+    }
 }
 }

+ 46 - 10
frameworks/Rust/xitca-web/src/main_diesel.rs

@@ -11,16 +11,22 @@ mod util;
 
 
 use std::{error::Error, io};
 use std::{error::Error, io};
 
 
-use bytes::Bytes;
-use xitca_http::http::{
-    header::{CONTENT_TYPE, SERVER},
-    Method,
+use serde::Serialize;
+use xitca_web::{
+    dev::{bytes::Bytes, fn_service},
+    http::{
+        header::{CONTENT_TYPE, SERVER},
+        Method,
+    },
+    request::WebRequest,
+    App, HttpServer,
 };
 };
-use xitca_web::{dev::fn_service, request::WebRequest, App, HttpServer};
 
 
 use self::db_diesel::{create, DieselPool};
 use self::db_diesel::{create, DieselPool};
+use self::ser::Message;
 use self::util::{
 use self::util::{
-    internal, json, json_response, not_found, plain_text, AppState, HandleResult, QueryParse,
+    internal, not_found, AppState, HandleResult, QueryParse, JSON_HEADER_VALUE,
+    SERVER_HEADER_VALUE, TEXT_HEADER_VALUE,
 };
 };
 
 
 type State = AppState<DieselPool>;
 type State = AppState<DieselPool>;
@@ -36,7 +42,7 @@ async fn main() -> io::Result<()> {
         })
         })
         .service(fn_service(handle))
         .service(fn_service(handle))
     })
     })
-    .force_flat_buf()
+    .disable_vectored_write()
     .max_request_headers::<8>()
     .max_request_headers::<8>()
     .bind("0.0.0.0:8080")?
     .bind("0.0.0.0:8080")?
     .run()
     .run()
@@ -59,7 +65,7 @@ async fn handle(req: &mut WebRequest<'_, State>) -> HandleResult {
 
 
 async fn db(req: &mut WebRequest<'_, State>) -> HandleResult {
 async fn db(req: &mut WebRequest<'_, State>) -> HandleResult {
     match req.state().client().get_world().await {
     match req.state().client().get_world().await {
-        Ok(world) => json_response(req, &world),
+        Ok(world) => _json(req, &world),
         Err(_) => internal(),
         Err(_) => internal(),
     }
     }
 }
 }
@@ -83,7 +89,7 @@ async fn queries(req: &mut WebRequest<'_, State>) -> HandleResult {
     let num = req.request_mut().uri().query().parse_query();
     let num = req.request_mut().uri().query().parse_query();
 
 
     match req.state().client().get_worlds(num).await {
     match req.state().client().get_worlds(num).await {
-        Ok(worlds) => json_response(req, worlds.as_slice()),
+        Ok(worlds) => _json(req, worlds.as_slice()),
         Err(_) => internal(),
         Err(_) => internal(),
     }
     }
 }
 }
@@ -92,7 +98,7 @@ async fn updates(req: &mut WebRequest<'_, State>) -> HandleResult {
     let num = req.request_mut().uri().query().parse_query();
     let num = req.request_mut().uri().query().parse_query();
 
 
     match req.state().client().update(num).await {
     match req.state().client().update(num).await {
-        Ok(worlds) => json_response(req, worlds.as_slice()),
+        Ok(worlds) => _json(req, worlds.as_slice()),
         Err(_) => internal(),
         Err(_) => internal(),
     }
     }
 }
 }
@@ -103,3 +109,33 @@ async fn _fortunes(pool: &DieselPool) -> Result<Bytes, Box<dyn Error + Send + Sy
     let fortunes = pool.tell_fortune().await?.render_once()?;
     let fortunes = pool.tell_fortune().await?.render_once()?;
     Ok(fortunes.into())
     Ok(fortunes.into())
 }
 }
+
+fn plain_text<D>(req: &mut WebRequest<'_, D>) -> HandleResult {
+    let mut res = req.as_response(Bytes::from_static(b"Hello, World!"));
+
+    res.headers_mut().append(SERVER, SERVER_HEADER_VALUE);
+    res.headers_mut().append(CONTENT_TYPE, TEXT_HEADER_VALUE);
+
+    Ok(res)
+}
+
+#[inline(always)]
+fn json<D>(req: &mut WebRequest<'_, AppState<D>>) -> HandleResult {
+    _json(req, &Message::new())
+}
+
+#[inline]
+fn _json<S, D>(req: &mut WebRequest<'_, AppState<D>>, value: &S) -> HandleResult
+where
+    S: ?Sized + Serialize,
+{
+    let mut writer = req.state().writer();
+    simd_json::to_writer(&mut writer, value).unwrap();
+    let body = writer.take();
+
+    let mut res = req.as_response(body);
+    res.headers_mut().append(SERVER, SERVER_HEADER_VALUE);
+    res.headers_mut().append(CONTENT_TYPE, JSON_HEADER_VALUE);
+
+    Ok(res)
+}

+ 9 - 41
frameworks/Rust/xitca-web/src/util.rs

@@ -1,3 +1,5 @@
+#![allow(clippy::declare_interior_mutable_const)]
+
 use std::{
 use std::{
     cell::{RefCell, RefMut},
     cell::{RefCell, RefMut},
     cmp,
     cmp,
@@ -5,19 +7,15 @@ use std::{
     io,
     io,
 };
 };
 
 
-use bytes::{Bytes, BytesMut};
-use serde::Serialize;
-use xitca_http::http::{
-    header::{HeaderValue, CONTENT_TYPE, SERVER},
-    StatusCode,
-};
 use xitca_web::{
 use xitca_web::{
-    request::WebRequest,
+    dev::bytes::{Bytes, BytesMut},
+    http::{
+        header::{HeaderValue, SERVER},
+        StatusCode,
+    },
     response::{WebResponse, WebResponseBuilder},
     response::{WebResponse, WebResponseBuilder},
 };
 };
 
 
-use super::ser::Message;
-
 pub(super) type HandleResult = Result<WebResponse, Infallible>;
 pub(super) type HandleResult = Result<WebResponse, Infallible>;
 
 
 pub(super) struct Writer<'a>(RefMut<'a, BytesMut>);
 pub(super) struct Writer<'a>(RefMut<'a, BytesMut>);
@@ -87,39 +85,9 @@ pub const SERVER_HEADER_VALUE: HeaderValue = HeaderValue::from_static("TFB");
 
 
 pub const HTML_HEADER_VALUE: HeaderValue = HeaderValue::from_static("text/html; charset=utf-8");
 pub const HTML_HEADER_VALUE: HeaderValue = HeaderValue::from_static("text/html; charset=utf-8");
 
 
-const TEXT_HEADER_VALUE: HeaderValue = HeaderValue::from_static("text/plain");
-
-const JSON_HEADER_VALUE: HeaderValue = HeaderValue::from_static("application/json");
+pub const TEXT_HEADER_VALUE: HeaderValue = HeaderValue::from_static("text/plain");
 
 
-pub(super) fn plain_text<D>(req: &mut WebRequest<'_, D>) -> HandleResult {
-    let mut res = req.as_response(Bytes::from_static(b"Hello, World!"));
-
-    res.headers_mut().append(SERVER, SERVER_HEADER_VALUE);
-    res.headers_mut().append(CONTENT_TYPE, TEXT_HEADER_VALUE);
-
-    Ok(res)
-}
-
-#[inline(always)]
-pub(super) fn json<D>(req: &mut WebRequest<'_, AppState<D>>) -> HandleResult {
-    json_response(req, &Message::new())
-}
-
-#[inline]
-pub(super) fn json_response<S, D>(req: &mut WebRequest<'_, AppState<D>>, value: &S) -> HandleResult
-where
-    S: ?Sized + Serialize,
-{
-    let mut writer = req.state().writer();
-    simd_json::to_writer(&mut writer, value).unwrap();
-    let body = writer.take();
-
-    let mut res = req.as_response(body);
-    res.headers_mut().append(SERVER, SERVER_HEADER_VALUE);
-    res.headers_mut().append(CONTENT_TYPE, JSON_HEADER_VALUE);
-
-    Ok(res)
-}
+pub const JSON_HEADER_VALUE: HeaderValue = HeaderValue::from_static("application/json");
 
 
 macro_rules! error {
 macro_rules! error {
     ($error: ident, $code: path) => {
     ($error: ident, $code: path) => {

+ 2 - 2
frameworks/Rust/xitca-web/xitca-web-diesel.dockerfile

@@ -1,10 +1,10 @@
-FROM rust:1.53
+FROM rust:1.56
 
 
 ADD ./ /xitca-web
 ADD ./ /xitca-web
 WORKDIR /xitca-web
 WORKDIR /xitca-web
 
 
+RUN rustup default nightly-2021-11-27
 RUN cargo clean
 RUN cargo clean
-RUN rustup default nightly-2021-08-03
 RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin xitca-web-diesel
 RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin xitca-web-diesel
 
 
 EXPOSE 8080
 EXPOSE 8080

+ 2 - 2
frameworks/Rust/xitca-web/xitca-web.dockerfile

@@ -1,10 +1,10 @@
-FROM rust:1.53
+FROM rust:1.56
 
 
 ADD ./ /xitca-web
 ADD ./ /xitca-web
 WORKDIR /xitca-web
 WORKDIR /xitca-web
 
 
+RUN rustup default nightly-2021-11-27
 RUN cargo clean
 RUN cargo clean
-RUN rustup default nightly-2021-08-03
 RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin xitca-web
 RUN RUSTFLAGS="-C target-cpu=native" cargo build --release --bin xitca-web
 
 
 EXPOSE 8080
 EXPOSE 8080