summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Cargo.lock235
-rw-r--r--cloudmqtt-bin/src/bin/client.rs6
-rw-r--r--mqtt-format/Cargo.toml15
-rw-r--r--mqtt-format/src/lib.rs2
-rw-r--r--mqtt-format/src/v5/packets/disconnect.rs69
-rw-r--r--src/client/builder.rs6
-rw-r--r--src/client/receive.rs16
-rw-r--r--src/client/send.rs19
-rw-r--r--src/packets/mod.rs2
-rw-r--r--src/packets/puback.rs29
10 files changed, 256 insertions, 143 deletions
diff --git a/Cargo.lock b/Cargo.lock
index d063591..33819b5 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -43,38 +43,39 @@ dependencies = [
[[package]]
name = "anstream"
-version = "0.6.13"
+version = "0.6.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d96bd03f33fe50a863e394ee9718a706f988b9079b20c3784fb726e7678b62fb"
+checksum = "418c75fa768af9c03be99d17643f93f79bbba589895012a80e3452a19ddda15b"
dependencies = [
"anstyle",
"anstyle-parse",
"anstyle-query",
- "anstyle-wincon 3.0.2",
+ "anstyle-wincon 3.0.3",
"colorchoice",
+ "is_terminal_polyfill",
"utf8parse",
]
[[package]]
name = "anstyle"
-version = "1.0.6"
+version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
+checksum = "038dfcf04a5feb68e9c60b21c9625a54c2c0616e79b72b0fd87075a056ae1d1b"
[[package]]
name = "anstyle-parse"
-version = "0.2.3"
+version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c75ac65da39e5fe5ab759307499ddad880d724eed2f6ce5b5e8a26f4f387928c"
+checksum = "c03a11a9034d92058ceb6ee011ce58af4a9bf61491aa7e1e59ecd24bd40d22d4"
dependencies = [
"utf8parse",
]
[[package]]
name = "anstyle-query"
-version = "1.0.2"
+version = "1.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e28923312444cdd728e4738b3f9c9cac739500909bb3d3c94b43551b16517648"
+checksum = "a64c907d4e79225ac72e2a354c9ce84d50ebb4586dee56c82b3ee73004f537f5"
dependencies = [
"windows-sys 0.52.0",
]
@@ -91,9 +92,9 @@ dependencies = [
[[package]]
name = "anstyle-wincon"
-version = "3.0.2"
+version = "3.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1cd54b81ec8d6180e24654d0b371ad22fc3dd083b6ff8ba325b72e00c87660a7"
+checksum = "61a38449feb7068f52bb06c12759005cf459ee52bb4adc1d5a7c4322d716fb19"
dependencies = [
"anstyle",
"windows-sys 0.52.0",
@@ -107,15 +108,15 @@ checksum = "96d30a06541fbafbc7f82ed10c06164cfbd2c401138f6addd8404629c4b16711"
[[package]]
name = "autocfg"
-version = "1.1.0"
+version = "1.3.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d468802bab17cbc0cc575e9b053f41e72aa36bfa6b7f55e3529ffa43161b97fa"
+checksum = "0c4b4d0bd25bd0b74681c0ad21497610ce1b7c91b1022cd21c80c6fbdd9476b0"
[[package]]
name = "backtrace"
-version = "0.3.69"
+version = "0.3.71"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "2089b7e3f35b9dd2d0ed921ead4f6d318c27680d4a5bd167b3ee120edb105837"
+checksum = "26b05800d2e817c8b3b4b54abd461726265fa9789ae34330622f2db9ee696f9d"
dependencies = [
"addr2line",
"cc",
@@ -133,6 +134,12 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bef38d45163c2f1dde094a7dfd33ccf595c92905c8f8f4fdc18d06fb1037718a"
[[package]]
+name = "bitflags"
+version = "2.5.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "cf4b9d6a944f767f8e5e0db018570623c85f3d925ac718db4e06d0187adb21c1"
+
+[[package]]
name = "brownstone"
version = "3.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -149,9 +156,9 @@ checksum = "514de17de45fdb8dc022b1a7975556c53c86f9f0aa5f534b98977b171857c2c9"
[[package]]
name = "cc"
-version = "1.0.90"
+version = "1.0.98"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8cd6604a82acf3039f1144f54b8eb34e91ffba622051189e71b781822d5ee1f5"
+checksum = "41c270e7540d725e65ac7f1b212ac8ce349719624d7bcff99f8e2e488e8cf03f"
[[package]]
name = "cfg-if"
@@ -175,7 +182,7 @@ version = "4.5.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae129e2e766ae0ec03484e609954119f123cc1fe650337e155d03b022f24f7b4"
dependencies = [
- "anstream 0.6.13",
+ "anstream 0.6.14",
"anstyle",
"clap_lex",
"strsim",
@@ -214,7 +221,7 @@ dependencies = [
"tokio-util",
"tracing",
"typed-builder",
- "winnow 0.6.5",
+ "winnow 0.6.8",
"yoke",
]
@@ -232,9 +239,9 @@ dependencies = [
[[package]]
name = "colorchoice"
-version = "1.0.0"
+version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "acbf1af155f9b9ef647e42cdc158db4b64a1b61f743629225fde6f3e0be2a7c7"
+checksum = "0b6a852b24ab71dffc585bcb46eaf7959d175cb865a7152e35b348d1b2960422"
[[package]]
name = "diff"
@@ -250,9 +257,9 @@ checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
-version = "0.3.8"
+version = "0.3.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
+checksum = "534c5cf6194dfab3db3242765c03bbe257cf92f22b38f6bc0c58d59108a820ba"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -361,9 +368,9 @@ checksum = "4271d37baee1b8c7e4b708028c57d816cf9d2434acb33a549475f78c181f6253"
[[package]]
name = "hashbrown"
-version = "0.14.3"
+version = "0.14.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "290f1a1d9242c78d09ce40a5e87e7554ee637af1351968159f4952f028f75604"
+checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1"
[[package]]
name = "heck"
@@ -385,9 +392,9 @@ checksum = "0cfe9645a18782869361d9c8732246be7b410ad4e919d3609ebabdac00ba12c3"
[[package]]
name = "indexmap"
-version = "2.2.5"
+version = "2.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7b0b929d511467233429c45a44ac1dcaa21ba0f5ba11e4879e6ed28ddb4f9df4"
+checksum = "168fb715dda47215e360912c096649d23d58bf392ac62f73919e831745e40f26"
dependencies = [
"equivalent",
"hashbrown",
@@ -416,6 +423,12 @@ dependencies = [
]
[[package]]
+name = "is_terminal_polyfill"
+version = "1.70.0"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "f8478577c03552c21db0e2724ffb8986a5ce7af88107e6be5d2ee6e158c12800"
+
+[[package]]
name = "joinery"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -429,9 +442,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]]
name = "libc"
-version = "0.2.153"
+version = "0.2.155"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
+checksum = "97b3888a4aecf77e811145cadf6eef5901f4782c53886191b2f693f24761847c"
[[package]]
name = "linux-raw-sys"
@@ -441,9 +454,9 @@ checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "lock_api"
-version = "0.4.11"
+version = "0.4.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3c168f8615b12bc01f9c17e2eb0cc07dcae1940121185446edc3744920e8ef45"
+checksum = "07af8b9cdd281b7915f413fa73f29ebd5d55d0d3f0155584dade1ff18cea1b17"
dependencies = [
"autocfg",
"scopeguard",
@@ -466,9 +479,9 @@ dependencies = [
[[package]]
name = "memchr"
-version = "2.7.1"
+version = "2.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
+checksum = "6c8640c5d730cb13ebd907d8d04b52f55ac9a2eec55b440c8892f40d56c76c1d"
[[package]]
name = "minimal-lexical"
@@ -478,9 +491,9 @@ checksum = "68354c5c6bd36d73ff3feceb05efa59b6acb7626617f4962be322a825e61f79a"
[[package]]
name = "miniz_oxide"
-version = "0.7.2"
+version = "0.7.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
+checksum = "87dfd01fe195c66b572b37921ad8803d010623c0aca821bea2302239d155cdae"
dependencies = [
"adler",
]
@@ -508,7 +521,7 @@ dependencies = [
"pretty_assertions",
"thiserror",
"tokio",
- "winnow 0.6.5",
+ "winnow 0.6.8",
"yoke",
]
@@ -599,9 +612,9 @@ checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39"
[[package]]
name = "parking_lot"
-version = "0.12.1"
+version = "0.12.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
+checksum = "7e4af0ca4f6caed20e900d564c242b8e5d4903fdacf31d3daf527b66fe6f42fb"
dependencies = [
"lock_api",
"parking_lot_core",
@@ -609,28 +622,28 @@ dependencies = [
[[package]]
name = "parking_lot_core"
-version = "0.9.9"
+version = "0.9.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4c42a9226546d68acdd9c0a280d17ce19bfe27a46bf68784e4066115788d008e"
+checksum = "1e401f977ab385c9e4e3ab30627d6f26d00e2c73eef317493c4ec6d468726cf8"
dependencies = [
"cfg-if",
"libc",
"redox_syscall",
"smallvec",
- "windows-targets 0.48.5",
+ "windows-targets 0.52.5",
]
[[package]]
name = "paste"
-version = "1.0.14"
+version = "1.0.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "de3145af08024dea9fa9914f381a17b8fc6034dfb00f3a84013f7ff43f29ed4c"
+checksum = "57c0d7b74b563b49d38dae00a0c37d4d6de9b432382b2892f0574ddcae73fd0a"
[[package]]
name = "pin-project-lite"
-version = "0.2.13"
+version = "0.2.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "8afb450f006bf6385ca15ef45d71d2288452bc3683ce2e2cacc0d18e4be60b58"
+checksum = "bda66fc9667c18cb2758a2ac84d1167245054bcf85d5d1aaa6923f45801bdd02"
[[package]]
name = "pin-utils"
@@ -659,29 +672,29 @@ dependencies = [
[[package]]
name = "proc-macro2"
-version = "1.0.79"
+version = "1.0.83"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e835ff2298f5721608eb1a980ecaee1aef2c132bf95ecc026a11b7bf3c01c02e"
+checksum = "0b33eb56c327dec362a9e55b3ad14f9d2f0904fb5a5b03b513ab5465399e9f43"
dependencies = [
"unicode-ident",
]
[[package]]
name = "quote"
-version = "1.0.35"
+version = "1.0.36"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
+checksum = "0fa76aaf39101c457836aec0ce2316dbdc3ab723cdda1c6bd4e6ad4208acaca7"
dependencies = [
"proc-macro2",
]
[[package]]
name = "redox_syscall"
-version = "0.4.1"
+version = "0.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "4722d768eff46b75989dd134e5c353f0d6296e5aaa3132e776cbdb56be7731aa"
+checksum = "469052894dcb553421e483e4209ee581a45100d31b4018de03e5a7ad86374a7e"
dependencies = [
- "bitflags",
+ "bitflags 2.5.0",
]
[[package]]
@@ -730,9 +743,9 @@ checksum = "adad44e29e4c806119491a7f06f03de4d1af22c3a680dd47f1e6e179439d1f56"
[[package]]
name = "rustc-demangle"
-version = "0.1.23"
+version = "0.1.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
+checksum = "719b953e2095829ee67db738b3bfa9fa368c94900df327b3f07fe6e794d2fe1f"
[[package]]
name = "rustix"
@@ -740,7 +753,7 @@ version = "0.37.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fea8ca367a3a01fe35e6943c400addf443c0f57670e6ec51196f71a4b8762dd2"
dependencies = [
- "bitflags",
+ "bitflags 1.3.2",
"errno",
"io-lifetimes",
"libc",
@@ -756,18 +769,18 @@ checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "serde"
-version = "1.0.197"
+version = "1.0.202"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2"
+checksum = "226b61a0d411b2ba5ff6d7f73a476ac4f8bb900373459cd00fab8512828ba395"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
-version = "1.0.197"
+version = "1.0.202"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b"
+checksum = "6048858004bcff69094cd972ed40a32500f153bd3be9f716b2eed2e8217c4838"
dependencies = [
"proc-macro2",
"quote",
@@ -785,9 +798,9 @@ dependencies = [
[[package]]
name = "signal-hook-registry"
-version = "1.4.1"
+version = "1.4.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "d8229b473baa5980ac72ef434c4415e70c4b5e71b423043adb4ba059f89c99a1"
+checksum = "a9e9e0b4211b72e7b8b6e85c807d36c212bdb33ea8587f7569562a84df5465b1"
dependencies = [
"libc",
]
@@ -803,15 +816,15 @@ dependencies = [
[[package]]
name = "smallvec"
-version = "1.13.1"
+version = "1.13.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "e6ecd384b10a64542d77071bd64bd7b231f4ed5940fba55e98c3de13824cf3d7"
+checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67"
[[package]]
name = "socket2"
-version = "0.5.6"
+version = "0.5.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "05ffd9c0a93b7543e062e759284fcf5f5e3b098501104bfbdde4d404db792871"
+checksum = "ce305eb0b4296696835b71df73eb912e0f1ffd2556a501fcede6e0c50349191c"
dependencies = [
"libc",
"windows-sys 0.52.0",
@@ -831,15 +844,15 @@ checksum = "a2eb9349b6444b326872e140eb1cf5e7c522154d69e7a0ffb0fb81c06b37543f"
[[package]]
name = "strsim"
-version = "0.11.0"
+version = "0.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
+checksum = "7da8b5736845d9f2fcb837ea5d9e2628564b3b043a70948a3f0b778838c5fb4f"
[[package]]
name = "syn"
-version = "2.0.53"
+version = "2.0.65"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7383cd0e49fff4b6b90ca5670bfd3e9d6a733b3f90c686605aa7eec8c4996032"
+checksum = "d2863d96a84c6439701d7a38f9de935ec562c8832cc55d1dde0f513b52fad106"
dependencies = [
"proc-macro2",
"quote",
@@ -869,18 +882,18 @@ dependencies = [
[[package]]
name = "thiserror"
-version = "1.0.58"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "03468839009160513471e86a034bb2c5c0e4baae3b43f79ffc55c4a5427b3297"
+checksum = "c546c80d6be4bc6a00c0f01730c08df82eaa7a7a61f11d656526506112cc1709"
dependencies = [
"thiserror-impl",
]
[[package]]
name = "thiserror-impl"
-version = "1.0.58"
+version = "1.0.61"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "c61f3ba182994efc43764a46c018c347bc492c79f024e705f46567b418f6d4f7"
+checksum = "46c3384250002a6d5af4d114f2845d37b57521033f30d5c3f46c4d70e1197533"
dependencies = [
"proc-macro2",
"quote",
@@ -929,9 +942,9 @@ dependencies = [
[[package]]
name = "tokio-util"
-version = "0.7.10"
+version = "0.7.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5419f34732d9eb6ee4c3578b7989078579b7f039cbbb9ca2c4da015749371e15"
+checksum = "9cf6b47b3771c49ac75ad09a6162f53ad4b8088b76ac60e8ec1455b31a189fe1"
dependencies = [
"bytes",
"futures-core",
@@ -939,14 +952,13 @@ dependencies = [
"futures-sink",
"pin-project-lite",
"tokio",
- "tracing",
]
[[package]]
name = "toml_datetime"
-version = "0.6.5"
+version = "0.6.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "3550f4e9685620ac18a50ed434eb3aec30db8ba93b0287467bca5826ea25baf1"
+checksum = "4badfd56924ae69bcc9039335b2e017639ce3f9b001c393c1b2d1ef846ce2cbf"
[[package]]
name = "toml_edit"
@@ -1022,18 +1034,18 @@ dependencies = [
[[package]]
name = "typed-builder"
-version = "0.18.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "444d8748011b93cb168770e8092458cb0f8854f931ff82fdf6ddfbd72a9c933e"
+checksum = "77739c880e00693faef3d65ea3aad725f196da38b22fdc7ea6ded6e1ce4d3add"
dependencies = [
"typed-builder-macro",
]
[[package]]
name = "typed-builder-macro"
-version = "0.18.1"
+version = "0.18.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "563b3b88238ec95680aef36bdece66896eaa7ce3c0f1b4f39d38fb2435261352"
+checksum = "1f718dfaf347dcb5b983bfc87608144b0bad87970aebcbea5ce44d2a30c08e63"
dependencies = [
"proc-macro2",
"quote",
@@ -1101,7 +1113,7 @@ version = "0.52.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "282be5f36a8ce781fad8c8ae18fa3f9beff57ec1b52cb3de0789201425d9a33d"
dependencies = [
- "windows-targets 0.52.4",
+ "windows-targets 0.52.5",
]
[[package]]
@@ -1121,17 +1133,18 @@ dependencies = [
[[package]]
name = "windows-targets"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "7dd37b7e5ab9018759f893a1952c9420d060016fc19a472b4bb20d1bdd694d1b"
+checksum = "6f0713a46559409d202e70e28227288446bf7841d3211583a4b53e3f6d96e7eb"
dependencies = [
- "windows_aarch64_gnullvm 0.52.4",
- "windows_aarch64_msvc 0.52.4",
- "windows_i686_gnu 0.52.4",
- "windows_i686_msvc 0.52.4",
- "windows_x86_64_gnu 0.52.4",
- "windows_x86_64_gnullvm 0.52.4",
- "windows_x86_64_msvc 0.52.4",
+ "windows_aarch64_gnullvm 0.52.5",
+ "windows_aarch64_msvc 0.52.5",
+ "windows_i686_gnu 0.52.5",
+ "windows_i686_gnullvm",
+ "windows_i686_msvc 0.52.5",
+ "windows_x86_64_gnu 0.52.5",
+ "windows_x86_64_gnullvm 0.52.5",
+ "windows_x86_64_msvc 0.52.5",
]
[[package]]
@@ -1142,9 +1155,9 @@ checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
[[package]]
name = "windows_aarch64_gnullvm"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "bcf46cf4c365c6f2d1cc93ce535f2c8b244591df96ceee75d8e83deb70a9cac9"
+checksum = "7088eed71e8b8dda258ecc8bac5fb1153c5cffaf2578fc8ff5d61e23578d3263"
[[package]]
name = "windows_aarch64_msvc"
@@ -1154,9 +1167,9 @@ checksum = "dc35310971f3b2dbbf3f0690a219f40e2d9afcf64f9ab7cc1be722937c26b4bc"
[[package]]
name = "windows_aarch64_msvc"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "da9f259dd3bcf6990b55bffd094c4f7235817ba4ceebde8e6d11cd0c5633b675"
+checksum = "9985fd1504e250c615ca5f281c3f7a6da76213ebd5ccc9561496568a2752afb6"
[[package]]
name = "windows_i686_gnu"
@@ -1166,9 +1179,15 @@ checksum = "a75915e7def60c94dcef72200b9a8e58e5091744960da64ec734a6c6e9b3743e"
[[package]]
name = "windows_i686_gnu"
-version = "0.52.4"
+version = "0.52.5"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "88ba073cf16d5372720ec942a8ccbf61626074c6d4dd2e745299726ce8b89670"
+
+[[package]]
+name = "windows_i686_gnullvm"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "b474d8268f99e0995f25b9f095bc7434632601028cf86590aea5c8a5cb7801d3"
+checksum = "87f4261229030a858f36b459e748ae97545d6f1ec60e5e0d6a3d32e0dc232ee9"
[[package]]
name = "windows_i686_msvc"
@@ -1178,9 +1197,9 @@ checksum = "8f55c233f70c4b27f66c523580f78f1004e8b5a8b659e05a4eb49d4166cca406"
[[package]]
name = "windows_i686_msvc"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "1515e9a29e5bed743cb4415a9ecf5dfca648ce85ee42e15873c3cd8610ff8e02"
+checksum = "db3c2bf3d13d5b658be73463284eaf12830ac9a26a90c717b7f771dfe97487bf"
[[package]]
name = "windows_x86_64_gnu"
@@ -1190,9 +1209,9 @@ checksum = "53d40abd2583d23e4718fddf1ebec84dbff8381c07cae67ff7768bbf19c6718e"
[[package]]
name = "windows_x86_64_gnu"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "5eee091590e89cc02ad514ffe3ead9eb6b660aedca2183455434b93546371a03"
+checksum = "4e4246f76bdeff09eb48875a0fd3e2af6aada79d409d33011886d3e1581517d9"
[[package]]
name = "windows_x86_64_gnullvm"
@@ -1202,9 +1221,9 @@ checksum = "0b7b52767868a23d5bab768e390dc5f5c55825b6d30b86c844ff2dc7414044cc"
[[package]]
name = "windows_x86_64_gnullvm"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "77ca79f2451b49fa9e2af39f0747fe999fcda4f5e241b2898624dca97a1f2177"
+checksum = "852298e482cd67c356ddd9570386e2862b5673c85bd5f88df9ab6802b334c596"
[[package]]
name = "windows_x86_64_msvc"
@@ -1214,9 +1233,9 @@ checksum = "ed94fce61571a4006852b7389a063ab983c02eb1bb37b47f8272ce92d06d9538"
[[package]]
name = "windows_x86_64_msvc"
-version = "0.52.4"
+version = "0.52.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "32b752e52a2da0ddfbdbcc6fceadfeede4c939ed16d13e648833a61dfb611ed8"
+checksum = "bec47e5bfd1bff0eeaf6d8b485cc1074891a197ab4225d504cb7a1ab88b02bf0"
[[package]]
name = "winnow"
@@ -1229,9 +1248,9 @@ dependencies = [
[[package]]
name = "winnow"
-version = "0.6.5"
+version = "0.6.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
-checksum = "dffa400e67ed5a4dd237983829e66475f0a4a26938c4b04c21baede6262215b8"
+checksum = "c3c52e9c97a68071b23e836c9380edae937f17b9c4667bd021973efc689f618d"
dependencies = [
"anstream 0.3.2",
"anstyle",
diff --git a/cloudmqtt-bin/src/bin/client.rs b/cloudmqtt-bin/src/bin/client.rs
index 8b044fe..e5f89f2 100644
--- a/cloudmqtt-bin/src/bin/client.rs
+++ b/cloudmqtt-bin/src/bin/client.rs
@@ -58,11 +58,7 @@ async fn main() {
tracing::trace!(?packet, "Received packet")
}))
.with_handle_qos1_acknowledge(Box::new(|packet| {
- async move {
- tracing::trace!(?packet, "Acknowledging packet");
- cloudmqtt::client::send::Acknowledge::Yes
- }
- .boxed()
+ tracing::trace!(?packet, "Acknowledging packet");
}))
.build()
.await
diff --git a/mqtt-format/Cargo.toml b/mqtt-format/Cargo.toml
index 4bdb5cd..172bdc1 100644
--- a/mqtt-format/Cargo.toml
+++ b/mqtt-format/Cargo.toml
@@ -12,20 +12,23 @@ categories = ["embedded", "parsing"]
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
-default = ["mqttv5"]
+default = ["mqttv5", "mqttv3"]
+std = ["num_enum/std"]
yoke = ["dep:yoke"]
-mqttv3 = ["dep:futures", "dep:nom", "dep:nom-supreme"]
+mqttv3 = ["std", "dep:futures", "dep:nom", "dep:nom-supreme", "dep:thiserror"]
mqttv5 = ["dep:winnow"]
[dependencies]
futures = { version = "0.3.28", optional = true }
nom = { version = "7.1.3", optional = true }
nom-supreme = { version = "0.8.0", optional = true }
-num_enum = "0.7.2"
+num_enum = { version = "0.7.2", default-features = false }
paste = "1.0.14"
-thiserror = "1.0.40"
-winnow = { version = "0.6.5", optional = true }
-yoke = { version = "0.7.0", features = ["derive"], optional = true }
+winnow = { version = "0.6.5", optional = true, default-features = false }
+thiserror = { version = "1.0.40", optional = true }
+yoke = { version = "0.7.0", features = [
+ "derive",
+], optional = true, default-features = false }
[dev-dependencies]
pretty_assertions = "1.3.0"
diff --git a/mqtt-format/src/lib.rs b/mqtt-format/src/lib.rs
index 960ab54..da20baa 100644
--- a/mqtt-format/src/lib.rs
+++ b/mqtt-format/src/lib.rs
@@ -3,7 +3,7 @@
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
//
-#![cfg_attr(all(feature = "mqttv5", not(feature = "mqttv3"), not(test)), no_std)]
+#![cfg_attr(all(not(feature = "std"), not(test)), no_std)]
#![deny(clippy::disallowed_methods)]
#![deny(clippy::disallowed_types)]
diff --git a/mqtt-format/src/v5/packets/disconnect.rs b/mqtt-format/src/v5/packets/disconnect.rs
index 46283cf..0f2bfe8 100644
--- a/mqtt-format/src/v5/packets/disconnect.rs
+++ b/mqtt-format/src/v5/packets/disconnect.rs
@@ -19,7 +19,6 @@ use crate::v5::MResult;
crate::v5::reason_code::make_combined_reason_code! {
pub enum DisconnectReasonCode {
AdministrativeAction = crate::v5::reason_code::AdministrativeAction,
- BadAuthenticationMethod = crate::v5::reason_code::BadAuthenticationMethod,
ConnectionRateExceeded = crate::v5::reason_code::ConnectionRateExceeded,
DisconnectWithWillMessage = crate::v5::reason_code::DisconnectWithWillMessage,
ImplementationSpecificError = crate::v5::reason_code::ImplementationSpecificError,
@@ -80,8 +79,18 @@ pub struct MDisconnect<'i> {
impl<'i> MDisconnect<'i> {
pub fn parse(input: &mut &'i Bytes) -> MResult<MDisconnect<'i>> {
winnow::combinator::trace("MDisconnect", |input: &mut &'i Bytes| {
- let (reason_code, properties) =
- (DisconnectReasonCode::parse, DisconnectProperties::parse).parse_next(input)?;
+ // The Reason Code and Property Length can be omitted if the Reason Code is 0x00 (Normal disconnecton)
+ // and there are no Properties. In this case the DISCONNECT has a Remaining Length of 0.
+ let reason_code = if input.is_empty() {
+ DisconnectReasonCode::NormalDisconnection
+ } else {
+ DisconnectReasonCode::parse(input)?
+ };
+ let properties = if input.is_empty() {
+ DisconnectProperties::new()
+ } else {
+ DisconnectProperties::parse(input)?
+ };
Ok(MDisconnect {
reason_code,
@@ -92,10 +101,21 @@ impl<'i> MDisconnect<'i> {
}
pub fn binary_size(&self) -> u32 {
+ if self.is_short_packet() {
+ return 0;
+ }
self.reason_code.binary_size() + self.properties.binary_size()
}
-
+ #[inline]
+ fn is_short_packet(&self) -> bool {
+ // if reason code is NormalDisconnection AND properties are empty, we can skip writing the payload
+ self.reason_code == DisconnectReasonCode::NormalDisconnection
+ && self.properties == DisconnectProperties::new()
+ }
pub fn write<W: WriteMqttPacket>(&self, buffer: &mut W) -> WResult<W> {
+ if self.is_short_packet() {
+ return Ok(());
+ }
self.reason_code.write(buffer)?;
self.properties.write(buffer)
}
@@ -106,6 +126,7 @@ mod test {
use super::DisconnectProperties;
use super::MDisconnect;
use crate::v5::packets::disconnect::DisconnectReasonCode;
+ use crate::v5::packets::MqttPacket;
use crate::v5::variable_header::ReasonString;
use crate::v5::variable_header::ServerReference;
use crate::v5::variable_header::SessionExpiryInterval;
@@ -136,4 +157,44 @@ mod test {
},
});
}
+
+ #[test]
+ fn test_short_disconnect_packet() {
+ // handle special case https://github.com/TheNeikos/cloudmqtt/issues/291
+ let buf = [0xe0, 0x00];
+ let parsed = MqttPacket::parse_complete(&buf).unwrap();
+ let reference = MqttPacket::Disconnect(MDisconnect {
+ reason_code: DisconnectReasonCode::NormalDisconnection,
+ properties: DisconnectProperties::new(),
+ });
+ assert_eq!(parsed, reference);
+ }
+
+ #[test]
+ fn test_short_disconnect_encoding() {
+ let reference = MqttPacket::Disconnect(MDisconnect {
+ reason_code: DisconnectReasonCode::NormalDisconnection,
+ properties: DisconnectProperties::new(),
+ });
+ let mut writer = crate::v5::test::TestWriter { buffer: Vec::new() };
+ reference.write(&mut writer).unwrap();
+ let buf = [0xe0, 0x00];
+ assert_eq!(writer.buffer, buf);
+ }
+
+ #[test]
+ fn test_short_disconnect_long_encoding() {
+ let reference = MqttPacket::Disconnect(MDisconnect {
+ reason_code: DisconnectReasonCode::NormalDisconnection,
+ properties: DisconnectProperties {
+ session_expiry_interval: Some(SessionExpiryInterval(123)),
+ reason_string: None,
+ user_properties: None,
+ server_reference: None,
+ },
+ });
+ let mut writer = crate::v5::test::TestWriter { buffer: Vec::new() };
+ reference.write(&mut writer).unwrap();
+ assert!(writer.buffer.len() > 2, "the extra rule for short NormalDisconnect should not influence more complex disconnects");
+ }
}
diff --git a/src/client/builder.rs b/src/client/builder.rs
index e8629eb..038cdbd 100644
--- a/src/client/builder.rs
+++ b/src/client/builder.rs
@@ -10,8 +10,8 @@ use futures::lock::Mutex;
use super::send::Callbacks;
use super::send::ClientHandlers;
-use super::send::HandleQos1AcknowledgeFn;
use super::send::OnPacketRecvFn;
+use super::send::OnQos1AcknowledgeFn;
use super::InnerClient;
use super::MqttClient;
@@ -31,8 +31,8 @@ impl MqttClientBuilder {
self
}
- pub fn with_handle_qos1_acknowledge(mut self, f: HandleQos1AcknowledgeFn) -> Self {
- self.handlers.handle_qos1_acknowledge = f;
+ pub fn with_handle_qos1_acknowledge(mut self, f: OnQos1AcknowledgeFn) -> Self {
+ self.handlers.on_qos1_acknowledge = f;
self
}
diff --git a/src/client/receive.rs b/src/client/receive.rs
index 3312b1a..e08a3e9 100644
--- a/src/client/receive.rs
+++ b/src/client/receive.rs
@@ -46,6 +46,9 @@ pub(super) async fn handle_background_receiving(
tracing::field::debug(packet.get().get_kind()),
);
+ tracing::trace!("Calling on_packet_recv() handler");
+ (inner.lock().await.default_handlers.on_packet_recv)(packet.clone());
+
match packet.get() {
mqtt_format::v5::packets::MqttPacket::Auth(_) => todo!(),
mqtt_format::v5::packets::MqttPacket::Disconnect(_) => todo!(),
@@ -57,8 +60,8 @@ pub(super) async fn handle_background_receiving(
.instrument(process_span)
.await?
}
- mqtt_format::v5::packets::MqttPacket::Puback(mpuback) => {
- handle_puback(mpuback, &inner, &packet)
+ mqtt_format::v5::packets::MqttPacket::Puback(_mpuback) => {
+ handle_puback(&packet.try_into().unwrap(), &inner)
.instrument(process_span)
.await?
}
@@ -158,10 +161,13 @@ async fn handle_pubcomp(
}
async fn handle_puback(
- mpuback: &mqtt_format::v5::packets::puback::MPuback<'_>,
+ puback: &crate::packets::Puback,
inner: &Arc<Mutex<InnerClient>>,
- packet: &MqttPacket,
) -> Result<(), ()> {
+ tracing::trace!("Calling on_qos1_acknowledge handler");
+ (inner.lock().await.default_handlers.on_qos1_acknowledge)(puback.clone());
+ let mpuback = puback.get();
+
match mpuback.reason {
mqtt_format::v5::packets::puback::PubackReasonCode::Success
| mqtt_format::v5::packets::puback::PubackReasonCode::NoMatchingSubscribers => {
@@ -184,7 +190,7 @@ async fn handle_puback(
tracing::trace!("Removed packet id from outstanding packets");
if let Some(callback) = inner.outstanding_callbacks.take_qos1(pident) {
- if let Err(_) = callback.on_acknowledge.send(packet.clone()) {
+ if let Err(_) = callback.on_acknowledge.send(puback.clone()) {
tracing::trace!("Could not send ack, receiver was dropped.")
}
}
diff --git a/src/client/send.rs b/src/client/send.rs
index 161e130..204b77e 100644
--- a/src/client/send.rs
+++ b/src/client/send.rs
@@ -215,22 +215,19 @@ pub struct PacketIdentifierExhausted;
pub(crate) struct ClientHandlers {
pub(crate) on_packet_recv: OnPacketRecvFn,
- pub(crate) handle_qos1_acknowledge: HandleQos1AcknowledgeFn,
- // handle_qos2_receive: Box<dyn Fn(&crate::packets::MqttPacket) + Send>,
- // handle_qos2_complete: Box<dyn Fn(&crate::packets::MqttPacket) + Send>,
+ pub(crate) on_qos1_acknowledge: OnQos1AcknowledgeFn,
+ // on_qos2_receive: Box<dyn Fn(crate::packets::MqttPacket) + Send>,
+ // on_qos2_complete: Box<dyn Fn(crate::packets::MqttPacket) + Send>,
}
-pub type OnPacketRecvFn = Box<dyn Fn(&crate::packets::MqttPacket) + Send>;
-pub type HandleQos1AcknowledgeFn = Box<
- dyn for<'p> Fn(&'p crate::packets::MqttPacket) -> futures::future::BoxFuture<'p, Acknowledge>
- + Send,
->;
+pub type OnPacketRecvFn = Box<dyn Fn(crate::packets::MqttPacket) + Send>;
+pub type OnQos1AcknowledgeFn = Box<dyn Fn(crate::packets::Puback) + Send>;
impl Default for ClientHandlers {
fn default() -> Self {
Self {
on_packet_recv: Box::new(|_| ()),
- handle_qos1_acknowledge: Box::new(|_| async move { Acknowledge::Yes }.boxed()),
+ on_qos1_acknowledge: Box::new(|_| ()),
}
}
}
@@ -301,7 +298,7 @@ impl Callbacks {
}
pub(crate) struct Qos1Callbacks {
- pub(crate) on_acknowledge: futures::channel::oneshot::Sender<crate::packets::MqttPacket>,
+ pub(crate) on_acknowledge: futures::channel::oneshot::Sender<crate::packets::Puback>,
}
pub(crate) struct Qos2ReceiveCallback {
@@ -344,7 +341,7 @@ enum PublishedReceiver {
}
pub struct PublishedQos1 {
- recv: futures::channel::oneshot::Receiver<MqttPacket>,
+ recv: futures::channel::oneshot::Receiver<crate::packets::Puback>,
}
impl PublishedQos1 {
diff --git a/src/packets/mod.rs b/src/packets/mod.rs
index 3b25e66..8e9e417 100644
--- a/src/packets/mod.rs
+++ b/src/packets/mod.rs
@@ -32,6 +32,8 @@ pub mod subscribe;
pub mod unsuback;
pub mod unsub