AWS SDK

AWS SDK

rev. aafb73ae63ee685f219d283684174c02ffcec088 (ignoring whitespace)

Files changed:

tmp-codegen-diff/aws-sdk/Cargo.lock

@@ -311,311 +405,405 @@
  331    331   
checksum = "1505bd5d3d116872e7271a6d4e16d81d0c8570876c8de68093a09ac269d8aac0"
  332    332   
  333    333   
[[package]]
  334    334   
name = "autocfg"
  335    335   
version = "1.5.0"
  336    336   
source = "registry+https://github.com/rust-lang/crates.io-index"
  337    337   
checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
  338    338   
  339    339   
[[package]]
  340    340   
name = "aws-config"
  341         -
version = "1.8.5"
         341  +
version = "1.8.6"
  342    342   
dependencies = [
  343    343   
 "aws-credential-types",
  344    344   
 "aws-runtime",
  345    345   
 "aws-sdk-sso",
  346    346   
 "aws-sdk-ssooidc",
  347    347   
 "aws-sdk-sts",
  348    348   
 "aws-smithy-async",
  349    349   
 "aws-smithy-http",
  350    350   
 "aws-smithy-http-client",
  351    351   
 "aws-smithy-json",
  352    352   
 "aws-smithy-runtime",
  353    353   
 "aws-smithy-runtime-api",
  354    354   
 "aws-smithy-types",
  355    355   
 "aws-types",
  356    356   
 "bytes",
  357    357   
 "fastrand 2.3.0",
  358    358   
 "futures-util",
  359    359   
 "hex",
  360    360   
 "http 1.3.1",
  361    361   
 "ring",
  362    362   
 "serde",
  363    363   
 "serde_json",
  364    364   
 "time",
  365    365   
 "tokio",
  366    366   
 "tracing",
  367    367   
 "tracing-subscriber",
  368    368   
 "tracing-test",
  369    369   
 "url",
  370    370   
 "zeroize",
  371    371   
]
  372    372   
  373    373   
[[package]]
  374    374   
name = "aws-credential-types"
  375         -
version = "1.2.5"
         375  +
version = "1.2.6"
  376    376   
dependencies = [
  377    377   
 "async-trait",
  378    378   
 "aws-smithy-async",
  379    379   
 "aws-smithy-runtime-api",
  380    380   
 "aws-smithy-types",
  381    381   
 "tokio",
  382    382   
 "zeroize",
  383    383   
]
  384    384   
  385    385   
[[package]]
@@ -1140,1140 +1200,1200 @@
 1160   1160   
name = "aws-smithy-cbor"
 1161   1161   
version = "0.61.1"
 1162   1162   
dependencies = [
 1163   1163   
 "aws-smithy-types",
 1164   1164   
 "criterion",
 1165   1165   
 "minicbor",
 1166   1166   
]
 1167   1167   
 1168   1168   
[[package]]
 1169   1169   
name = "aws-smithy-checksums"
 1170         -
version = "0.63.7"
        1170  +
version = "0.63.8"
 1171   1171   
dependencies = [
 1172   1172   
 "aws-smithy-http",
 1173   1173   
 "aws-smithy-types",
 1174   1174   
 "bytes",
 1175   1175   
 "bytes-utils",
 1176   1176   
 "crc-fast",
 1177   1177   
 "hex",
 1178   1178   
 "http 0.2.12",
 1179   1179   
 "http-body 0.4.6",
 1180   1180   
 "md-5",
@@ -1279,1279 +1339,1339 @@
 1299   1299   
 "tower",
 1300   1300   
 "tracing",
 1301   1301   
]
 1302   1302   
 1303   1303   
[[package]]
 1304   1304   
name = "aws-smithy-http-tower"
 1305   1305   
version = "0.60.3"
 1306   1306   
 1307   1307   
[[package]]
 1308   1308   
name = "aws-smithy-json"
 1309         -
version = "0.61.4"
        1309  +
version = "0.61.5"
 1310   1310   
dependencies = [
 1311   1311   
 "aws-smithy-types",
 1312   1312   
 "proptest",
 1313   1313   
 "serde_json",
 1314   1314   
]
 1315   1315   
 1316   1316   
[[package]]
 1317   1317   
name = "aws-smithy-mocks"
 1318   1318   
version = "0.1.1"
 1319   1319   
dependencies = [
@@ -1345,1345 +1429,1430 @@
 1365   1365   
 "assert-json-diff",
 1366   1366   
 "aws-smithy-runtime-api",
 1367   1367   
 "base64-simd",
 1368   1368   
 "cbor-diag",
 1369   1369   
 "ciborium",
 1370   1370   
 "http 0.2.12",
 1371   1371   
 "pretty_assertions",
 1372   1372   
 "regex-lite",
 1373   1373   
 "roxmltree",
 1374   1374   
 "serde_json",
 1375         -
 "thiserror 2.0.15",
        1375  +
 "thiserror 2.0.16",
 1376   1376   
]
 1377   1377   
 1378   1378   
[[package]]
 1379   1379   
name = "aws-smithy-query"
 1380   1380   
version = "0.60.7"
 1381   1381   
dependencies = [
 1382   1382   
 "aws-smithy-types",
 1383   1383   
 "urlencoding",
 1384   1384   
]
 1385   1385   
 1386   1386   
[[package]]
 1387   1387   
name = "aws-smithy-runtime"
 1388         -
version = "1.9.0"
        1388  +
version = "1.9.1"
 1389   1389   
dependencies = [
 1390   1390   
 "approx",
 1391   1391   
 "aws-smithy-async",
 1392   1392   
 "aws-smithy-http",
 1393   1393   
 "aws-smithy-http-client",
 1394   1394   
 "aws-smithy-observability",
 1395   1395   
 "aws-smithy-runtime-api",
 1396   1396   
 "aws-smithy-types",
 1397   1397   
 "bytes",
 1398   1398   
 "fastrand 2.3.0",
 1399   1399   
 "futures-util",
        1400  +
 "hickory-resolver",
 1400   1401   
 "http 0.2.12",
 1401   1402   
 "http 1.3.1",
 1402   1403   
 "http-body 0.4.6",
 1403   1404   
 "http-body 1.0.1",
 1404   1405   
 "hyper 0.14.32",
 1405   1406   
 "pin-project-lite",
 1406   1407   
 "pin-utils",
 1407   1408   
 "pretty_assertions",
 1408   1409   
 "tokio",
 1409   1410   
 "tracing",
@@ -1916,1917 +1975,1982 @@
 1936   1937   
[[package]]
 1937   1938   
name = "criterion-plot"
 1938   1939   
version = "0.5.0"
 1939   1940   
source = "registry+https://github.com/rust-lang/crates.io-index"
 1940   1941   
checksum = "6b50826342786a51a89e2da3a28f1c32b06e387201bc2d19791f622c673706b1"
 1941   1942   
dependencies = [
 1942   1943   
 "cast",
 1943   1944   
 "itertools 0.10.5",
 1944   1945   
]
 1945   1946   
        1947  +
[[package]]
        1948  +
name = "critical-section"
        1949  +
version = "1.2.0"
        1950  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        1951  +
checksum = "790eea4361631c5e7d22598ecd5723ff611904e3344ce8720784c93e3d83d40b"
        1952  +
 1946   1953   
[[package]]
 1947   1954   
name = "crossbeam-channel"
 1948   1955   
version = "0.5.15"
 1949   1956   
source = "registry+https://github.com/rust-lang/crates.io-index"
 1950   1957   
checksum = "82b8f8f868b36967f9606790d1903570de9ceaf870a7bf9fbbd3016d636a2cb2"
 1951   1958   
dependencies = [
 1952   1959   
 "crossbeam-utils",
 1953   1960   
]
 1954   1961   
 1955   1962   
[[package]]
@@ -2096,2103 +2155,2174 @@
 2116   2123   
 "ff",
 2117   2124   
 "generic-array",
 2118   2125   
 "group",
 2119   2126   
 "pkcs8",
 2120   2127   
 "rand_core 0.6.4",
 2121   2128   
 "sec1",
 2122   2129   
 "subtle",
 2123   2130   
 "zeroize",
 2124   2131   
]
 2125   2132   
        2133  +
[[package]]
        2134  +
name = "enum-as-inner"
        2135  +
version = "0.6.1"
        2136  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        2137  +
checksum = "a1e6a265c649f3f5979b601d26f1d05ada116434c87741c9493cb56218f76cbc"
        2138  +
dependencies = [
        2139  +
 "heck",
        2140  +
 "proc-macro2",
        2141  +
 "quote",
        2142  +
 "syn",
        2143  +
]
        2144  +
 2126   2145   
[[package]]
 2127   2146   
name = "equivalent"
 2128   2147   
version = "1.0.2"
 2129   2148   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2130   2149   
checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f"
 2131   2150   
 2132   2151   
[[package]]
 2133   2152   
name = "errno"
 2134   2153   
version = "0.3.13"
 2135   2154   
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -2199,2218 +2261,2280 @@
 2219   2238   
checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1"
 2220   2239   
 2221   2240   
[[package]]
 2222   2241   
name = "foldhash"
 2223   2242   
version = "0.1.5"
 2224   2243   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2225   2244   
checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2"
 2226   2245   
 2227   2246   
[[package]]
 2228   2247   
name = "form_urlencoded"
 2229         -
version = "1.2.1"
        2248  +
version = "1.2.2"
 2230   2249   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2231         -
checksum = "e13624c2627564efccf4934284bdd98cbaa14e79b0b5a141218e507b3a823456"
        2250  +
checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf"
 2232   2251   
dependencies = [
 2233   2252   
 "percent-encoding",
 2234   2253   
]
 2235   2254   
 2236   2255   
[[package]]
 2237   2256   
name = "fs_extra"
 2238   2257   
version = "1.3.0"
 2239   2258   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2240   2259   
checksum = "42703706b716c37f96a77aea830392ad231f44c9e9a67872fa5548707e11b11c"
 2241   2260   
@@ -2329,2348 +2388,2421 @@
 2349   2368   
 "futures-io",
 2350   2369   
 "futures-macro",
 2351   2370   
 "futures-sink",
 2352   2371   
 "futures-task",
 2353   2372   
 "memchr",
 2354   2373   
 "pin-project-lite",
 2355   2374   
 "pin-utils",
 2356   2375   
 "slab",
 2357   2376   
]
 2358   2377   
        2378  +
[[package]]
        2379  +
name = "generator"
        2380  +
version = "0.8.7"
        2381  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        2382  +
checksum = "605183a538e3e2a9c1038635cc5c2d194e2ee8fd0d1b66b8349fad7dbacce5a2"
        2383  +
dependencies = [
        2384  +
 "cc",
        2385  +
 "cfg-if",
        2386  +
 "libc",
        2387  +
 "log",
        2388  +
 "rustversion",
        2389  +
 "windows",
        2390  +
]
        2391  +
 2359   2392   
[[package]]
 2360   2393   
name = "generic-array"
 2361   2394   
version = "0.14.7"
 2362   2395   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2363   2396   
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
 2364   2397   
dependencies = [
 2365   2398   
 "typenum",
 2366   2399   
 "version_check",
 2367   2400   
]
 2368   2401   
@@ -2470,2503 +2553,2638 @@
 2490   2523   
checksum = "765c9198f173dd59ce26ff9f95ef0aafd0a0fe01fb9d72841bc5066a4c06511d"
 2491   2524   
dependencies = [
 2492   2525   
 "base64 0.21.7",
 2493   2526   
 "byteorder",
 2494   2527   
 "crossbeam-channel",
 2495   2528   
 "flate2",
 2496   2529   
 "nom",
 2497   2530   
 "num-traits",
 2498   2531   
]
 2499   2532   
        2533  +
[[package]]
        2534  +
name = "heck"
        2535  +
version = "0.5.0"
        2536  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        2537  +
checksum = "2304e00983f87ffb38b55b444b5e3b60a884b5d30c0fca7d82fe33449bbe55ea"
        2538  +
 2500   2539   
[[package]]
 2501   2540   
name = "hermit-abi"
 2502   2541   
version = "0.3.9"
 2503   2542   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2504   2543   
checksum = "d231dfb89cfffdbc30e7fc41579ed6066ad03abda9e567ccafae602b97ec5024"
 2505   2544   
 2506   2545   
[[package]]
 2507   2546   
name = "hermit-abi"
 2508   2547   
version = "0.5.2"
 2509   2548   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2510   2549   
checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c"
 2511   2550   
 2512   2551   
[[package]]
 2513   2552   
name = "hex"
 2514   2553   
version = "0.4.3"
 2515   2554   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2516   2555   
checksum = "7f24254aa9a54b5c858eaee2f5bccdb46aaf0e486a595ed5fd8f86ba55232a70"
 2517   2556   
 2518   2557   
[[package]]
 2519   2558   
name = "hex-literal"
 2520   2559   
version = "0.4.1"
 2521   2560   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2522   2561   
checksum = "6fe2267d4ed49bc07b63801559be28c718ea06c4738b7a03c94df7386d2cde46"
 2523   2562   
        2563  +
[[package]]
        2564  +
name = "hickory-proto"
        2565  +
version = "0.25.2"
        2566  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        2567  +
checksum = "f8a6fe56c0038198998a6f217ca4e7ef3a5e51f46163bd6dd60b5c71ca6c6502"
        2568  +
dependencies = [
        2569  +
 "async-trait",
        2570  +
 "cfg-if",
        2571  +
 "data-encoding",
        2572  +
 "enum-as-inner",
        2573  +
 "futures-channel",
        2574  +
 "futures-io",
        2575  +
 "futures-util",
        2576  +
 "idna",
        2577  +
 "ipnet",
        2578  +
 "once_cell",
        2579  +
 "rand 0.9.2",
        2580  +
 "ring",
        2581  +
 "thiserror 2.0.16",
        2582  +
 "tinyvec",
        2583  +
 "tokio",
        2584  +
 "tracing",
        2585  +
 "url",
        2586  +
]
        2587  +
        2588  +
[[package]]
        2589  +
name = "hickory-resolver"
        2590  +
version = "0.25.2"
        2591  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        2592  +
checksum = "dc62a9a99b0bfb44d2ab95a7208ac952d31060efc16241c87eaf36406fecf87a"
        2593  +
dependencies = [
        2594  +
 "cfg-if",
        2595  +
 "futures-util",
        2596  +
 "hickory-proto",
        2597  +
 "ipconfig",
        2598  +
 "moka",
        2599  +
 "once_cell",
        2600  +
 "parking_lot",
        2601  +
 "rand 0.9.2",
        2602  +
 "resolv-conf",
        2603  +
 "smallvec",
        2604  +
 "thiserror 2.0.16",
        2605  +
 "tokio",
        2606  +
 "tracing",
        2607  +
]
        2608  +
 2524   2609   
[[package]]
 2525   2610   
name = "hmac"
 2526   2611   
version = "0.12.1"
 2527   2612   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2528   2613   
checksum = "6c49c37c09c17a53d937dfbb742eb3a961d65a994e6bcdcf37e7399d0cc8ab5e"
 2529   2614   
dependencies = [
 2530   2615   
 "digest",
 2531   2616   
]
 2532   2617   
 2533   2618   
[[package]]
@@ -2781,2866 +2901,2998 @@
 2801   2886   
 "tinystr",
 2802   2887   
 "writeable",
 2803   2888   
 "yoke",
 2804   2889   
 "zerofrom",
 2805   2890   
 "zerotrie",
 2806   2891   
 "zerovec",
 2807   2892   
]
 2808   2893   
 2809   2894   
[[package]]
 2810   2895   
name = "idna"
 2811         -
version = "1.0.3"
        2896  +
version = "1.1.0"
 2812   2897   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2813         -
checksum = "686f825264d630750a544639377bae737628043f20d38bbc029e8f29ea968a7e"
        2898  +
checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de"
 2814   2899   
dependencies = [
 2815   2900   
 "idna_adapter",
 2816   2901   
 "smallvec",
 2817   2902   
 "utf8_iter",
 2818   2903   
]
 2819   2904   
 2820   2905   
[[package]]
 2821   2906   
name = "idna_adapter"
 2822   2907   
version = "1.2.1"
 2823   2908   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2824   2909   
checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344"
 2825   2910   
dependencies = [
 2826   2911   
 "icu_normalizer",
 2827   2912   
 "icu_properties",
 2828   2913   
]
 2829   2914   
 2830   2915   
[[package]]
 2831   2916   
name = "indexmap"
 2832   2917   
version = "2.10.0"
 2833   2918   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2834   2919   
checksum = "fe4cd85333e22411419a0bcae1297d25e58c9443848b11dc6a86fefe8c78a661"
 2835   2920   
dependencies = [
 2836   2921   
 "equivalent",
 2837   2922   
 "hashbrown",
 2838   2923   
 "serde",
 2839   2924   
]
 2840   2925   
 2841   2926   
[[package]]
 2842   2927   
name = "instant"
 2843   2928   
version = "0.1.13"
 2844   2929   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2845   2930   
checksum = "e0242819d153cba4b4b05a5a8f2a7e9bbf97b6055b2a002b395c96b5ff3c0222"
 2846   2931   
dependencies = [
 2847   2932   
 "cfg-if",
 2848   2933   
]
 2849   2934   
 2850   2935   
[[package]]
 2851   2936   
name = "io-lifetimes"
 2852   2937   
version = "1.0.11"
 2853   2938   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2854   2939   
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
 2855   2940   
dependencies = [
 2856   2941   
 "hermit-abi 0.3.9",
 2857   2942   
 "libc",
 2858   2943   
 "windows-sys 0.48.0",
 2859   2944   
]
 2860   2945   
 2861   2946   
[[package]]
 2862   2947   
name = "io-uring"
 2863   2948   
version = "0.7.9"
 2864   2949   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2865   2950   
checksum = "d93587f37623a1a17d94ef2bc9ada592f5465fe7732084ab7beefabe5c77c0c4"
 2866   2951   
dependencies = [
 2867   2952   
 "bitflags 2.9.2",
 2868   2953   
 "cfg-if",
 2869   2954   
 "libc",
 2870   2955   
]
 2871   2956   
        2957  +
[[package]]
        2958  +
name = "ipconfig"
        2959  +
version = "0.3.2"
        2960  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        2961  +
checksum = "b58db92f96b720de98181bbbe63c831e87005ab460c1bf306eb2622b4707997f"
        2962  +
dependencies = [
        2963  +
 "socket2 0.5.10",
        2964  +
 "widestring",
        2965  +
 "windows-sys 0.48.0",
        2966  +
 "winreg",
        2967  +
]
        2968  +
 2872   2969   
[[package]]
 2873   2970   
name = "ipnet"
 2874   2971   
version = "2.11.0"
 2875   2972   
source = "registry+https://github.com/rust-lang/crates.io-index"
 2876   2973   
checksum = "469fb0b9cefa57e3ef31275ee7cacb78f2fdca44e4765491884a2b119d4eb130"
 2877   2974   
 2878   2975   
[[package]]
 2879   2976   
name = "is-terminal"
 2880   2977   
version = "0.4.16"
 2881   2978   
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -3013,3110 +3072,3182 @@
 3033   3130   
 3034   3131   
[[package]]
 3035   3132   
name = "log"
 3036   3133   
version = "0.4.27"
 3037   3134   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3038   3135   
checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94"
 3039   3136   
dependencies = [
 3040   3137   
 "value-bag",
 3041   3138   
]
 3042   3139   
        3140  +
[[package]]
        3141  +
name = "loom"
        3142  +
version = "0.7.2"
        3143  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        3144  +
checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca"
        3145  +
dependencies = [
        3146  +
 "cfg-if",
        3147  +
 "generator",
        3148  +
 "scoped-tls",
        3149  +
 "tracing",
        3150  +
 "tracing-subscriber",
        3151  +
]
        3152  +
 3043   3153   
[[package]]
 3044   3154   
name = "lru"
 3045   3155   
version = "0.12.5"
 3046   3156   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3047   3157   
checksum = "234cf4f4a04dc1f57e24b96cc0cd600cf2af460d4161ac5ecdd0af8e1f3b2a38"
 3048   3158   
dependencies = [
 3049   3159   
 "hashbrown",
 3050   3160   
]
 3051   3161   
 3052   3162   
[[package]]
@@ -3103,3213 +3162,3291 @@
 3123   3233   
name = "mio"
 3124   3234   
version = "1.0.4"
 3125   3235   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3126   3236   
checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c"
 3127   3237   
dependencies = [
 3128   3238   
 "libc",
 3129   3239   
 "wasi 0.11.1+wasi-snapshot-preview1",
 3130   3240   
 "windows-sys 0.59.0",
 3131   3241   
]
 3132   3242   
        3243  +
[[package]]
        3244  +
name = "moka"
        3245  +
version = "0.12.10"
        3246  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        3247  +
checksum = "a9321642ca94a4282428e6ea4af8cc2ca4eac48ac7a6a4ea8f33f76d0ce70926"
        3248  +
dependencies = [
        3249  +
 "crossbeam-channel",
        3250  +
 "crossbeam-epoch",
        3251  +
 "crossbeam-utils",
        3252  +
 "loom",
        3253  +
 "parking_lot",
        3254  +
 "portable-atomic",
        3255  +
 "rustc_version",
        3256  +
 "smallvec",
        3257  +
 "tagptr",
        3258  +
 "thiserror 1.0.69",
        3259  +
 "uuid",
        3260  +
]
        3261  +
 3133   3262   
[[package]]
 3134   3263   
name = "nom"
 3135   3264   
version = "7.1.3"
 3136   3265   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3137   3266   
checksum = "d273983c5a657a70a3e8f2a01329822f3b8c8172b73826411a55751e404a0a4a"
 3138   3267   
dependencies = [
 3139   3268   
 "memchr",
 3140   3269   
 "minimal-lexical",
 3141   3270   
]
 3142   3271   
@@ -3182,3311 +3241,3374 @@
 3202   3331   
checksum = "62948e14d923ea95ea2c7c86c71013138b66525b86bdc08d2dcc262bdb497b87"
 3203   3332   
dependencies = [
 3204   3333   
 "memchr",
 3205   3334   
]
 3206   3335   
 3207   3336   
[[package]]
 3208   3337   
name = "once_cell"
 3209   3338   
version = "1.21.3"
 3210   3339   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3211   3340   
checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d"
        3341  +
dependencies = [
        3342  +
 "critical-section",
        3343  +
 "portable-atomic",
        3344  +
]
 3212   3345   
 3213   3346   
[[package]]
 3214   3347   
name = "oorandom"
 3215   3348   
version = "11.1.5"
 3216   3349   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3217   3350   
checksum = "d6790f58c7ff633d8771f42965289203411a5e5c68388703c06e14f24770b41e"
 3218   3351   
 3219   3352   
[[package]]
 3220   3353   
name = "openssl-probe"
 3221   3354   
version = "0.1.6"
@@ -3285,3418 +3347,3480 @@
 3305   3438   
dependencies = [
 3306   3439   
 "cfg-if",
 3307   3440   
 "libc",
 3308   3441   
 "redox_syscall",
 3309   3442   
 "smallvec",
 3310   3443   
 "windows-targets 0.52.6",
 3311   3444   
]
 3312   3445   
 3313   3446   
[[package]]
 3314   3447   
name = "percent-encoding"
 3315         -
version = "2.3.1"
        3448  +
version = "2.3.2"
 3316   3449   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3317         -
checksum = "e3148f5046208a5d56bcfc03053e3ca6334e51da8dfb19b6cdc8b306fae3283e"
        3450  +
checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220"
 3318   3451   
 3319   3452   
[[package]]
 3320   3453   
name = "pin-project-lite"
 3321   3454   
version = "0.2.16"
 3322   3455   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3323   3456   
checksum = "3b3cff922bd51709b605d9ead9aa71031d81447142d828eb4a6eba76fe619f9b"
 3324   3457   
 3325   3458   
[[package]]
 3326   3459   
name = "pin-utils"
 3327   3460   
version = "0.1.0"
@@ -3380,3513 +3439,3578 @@
 3400   3533   
checksum = "b5bd19146350fe804f7cb2669c851c03d69da628803dab0d98018142aaa5d829"
 3401   3534   
dependencies = [
 3402   3535   
 "cfg-if",
 3403   3536   
 "concurrent-queue",
 3404   3537   
 "hermit-abi 0.5.2",
 3405   3538   
 "pin-project-lite",
 3406   3539   
 "rustix 1.0.8",
 3407   3540   
 "windows-sys 0.60.2",
 3408   3541   
]
 3409   3542   
        3543  +
[[package]]
        3544  +
name = "portable-atomic"
        3545  +
version = "1.11.1"
        3546  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        3547  +
checksum = "f84267b20a16ea918e43c6a88433c2d54fa145c92a811b5b047ccbe153674483"
        3548  +
 3410   3549   
[[package]]
 3411   3550   
name = "potential_utf"
 3412   3551   
version = "0.1.2"
 3413   3552   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3414   3553   
checksum = "e5a7c30837279ca13e7c867e9e40053bc68740f988cb07f7ca6df43cc734b585"
 3415   3554   
dependencies = [
 3416   3555   
 "zerovec",
 3417   3556   
]
 3418   3557   
 3419   3558   
[[package]]
@@ -3621,3760 +3680,3825 @@
 3641   3780   
version = "0.6.29"
 3642   3781   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3643   3782   
checksum = "f162c6dd7b008981e4d40210aca20b4bd0f9b60ca9271061b07f78537722f2e1"
 3644   3783   
 3645   3784   
[[package]]
 3646   3785   
name = "regex-syntax"
 3647   3786   
version = "0.8.5"
 3648   3787   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3649   3788   
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
 3650   3789   
        3790  +
[[package]]
        3791  +
name = "resolv-conf"
        3792  +
version = "0.7.4"
        3793  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        3794  +
checksum = "95325155c684b1c89f7765e30bc1c42e4a6da51ca513615660cb8a62ef9a88e3"
        3795  +
 3651   3796   
[[package]]
 3652   3797   
name = "rfc6979"
 3653   3798   
version = "0.3.1"
 3654   3799   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3655   3800   
checksum = "7743f17af12fa0b03b803ba12cd6a8d9483a587e89c69445e3909655c0b9fabb"
 3656   3801   
dependencies = [
 3657   3802   
 "crypto-bigint 0.4.9",
 3658   3803   
 "hmac",
 3659   3804   
 "zeroize",
 3660   3805   
]
@@ -3919,4064 +3978,4129 @@
 3939   4084   
 3940   4085   
[[package]]
 3941   4086   
name = "schannel"
 3942   4087   
version = "0.1.27"
 3943   4088   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3944   4089   
checksum = "1f29ebaa345f945cec9fbbc532eb307f0fdad8161f281b6369539c8d84876b3d"
 3945   4090   
dependencies = [
 3946   4091   
 "windows-sys 0.59.0",
 3947   4092   
]
 3948   4093   
        4094  +
[[package]]
        4095  +
name = "scoped-tls"
        4096  +
version = "1.0.1"
        4097  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        4098  +
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
        4099  +
 3949   4100   
[[package]]
 3950   4101   
name = "scopeguard"
 3951   4102   
version = "1.2.0"
 3952   4103   
source = "registry+https://github.com/rust-lang/crates.io-index"
 3953   4104   
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
 3954   4105   
 3955   4106   
[[package]]
 3956   4107   
name = "sct"
 3957   4108   
version = "0.7.1"
 3958   4109   
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4247,4398 +4353,4510 @@
 4267   4418   
[[package]]
 4268   4419   
name = "system-configuration-sys"
 4269   4420   
version = "0.6.0"
 4270   4421   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4271   4422   
checksum = "8e1d1b10ced5ca923a1fcb8d03e96b8d3268065d724548c0211415ff6ac6bac4"
 4272   4423   
dependencies = [
 4273   4424   
 "core-foundation-sys",
 4274   4425   
 "libc",
 4275   4426   
]
 4276   4427   
        4428  +
[[package]]
        4429  +
name = "tagptr"
        4430  +
version = "0.2.0"
        4431  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        4432  +
checksum = "7b2093cf4c8eb1e67749a6762251bc9cd836b6fc171623bd0a9d324d37af2417"
        4433  +
 4277   4434   
[[package]]
 4278   4435   
name = "tempfile"
 4279         -
version = "3.20.0"
        4436  +
version = "3.21.0"
 4280   4437   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4281         -
checksum = "e8a64e3985349f2441a1a9ef0b853f869006c3855f2cda6862a94d26ebb9d6a1"
        4438  +
checksum = "15b61f8f20e3a6f7e0649d825294eaf317edce30f82cf6026e7e4cb9222a7d1e"
 4282   4439   
dependencies = [
 4283   4440   
 "fastrand 2.3.0",
 4284   4441   
 "getrandom 0.3.3",
 4285   4442   
 "once_cell",
 4286   4443   
 "rustix 1.0.8",
 4287         -
 "windows-sys 0.59.0",
        4444  +
 "windows-sys 0.60.2",
 4288   4445   
]
 4289   4446   
 4290   4447   
[[package]]
 4291   4448   
name = "thiserror"
 4292   4449   
version = "1.0.69"
 4293   4450   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4294   4451   
checksum = "b6aaf5339b578ea85b50e080feb250a3e8ae8cfcdff9a461c9ec2904bc923f52"
 4295   4452   
dependencies = [
 4296   4453   
 "thiserror-impl 1.0.69",
 4297   4454   
]
 4298   4455   
 4299   4456   
[[package]]
 4300   4457   
name = "thiserror"
 4301         -
version = "2.0.15"
        4458  +
version = "2.0.16"
 4302   4459   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4303         -
checksum = "80d76d3f064b981389ecb4b6b7f45a0bf9fdac1d5b9204c7bd6714fecc302850"
        4460  +
checksum = "3467d614147380f2e4e374161426ff399c91084acd2363eaf549172b3d5e60c0"
 4304   4461   
dependencies = [
 4305         -
 "thiserror-impl 2.0.15",
        4462  +
 "thiserror-impl 2.0.16",
 4306   4463   
]
 4307   4464   
 4308   4465   
[[package]]
 4309   4466   
name = "thiserror-impl"
 4310   4467   
version = "1.0.69"
 4311   4468   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4312   4469   
checksum = "4fee6c4efc90059e10f81e6d42c60a18f76588c3d74cb83a0b242a2b6c7504c1"
 4313   4470   
dependencies = [
 4314   4471   
 "proc-macro2",
 4315   4472   
 "quote",
 4316   4473   
 "syn",
 4317   4474   
]
 4318   4475   
 4319   4476   
[[package]]
 4320   4477   
name = "thiserror-impl"
 4321         -
version = "2.0.15"
        4478  +
version = "2.0.16"
 4322   4479   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4323         -
checksum = "44d29feb33e986b6ea906bd9c3559a856983f92371b3eaa5e83782a351623de0"
        4480  +
checksum = "6c5e1be1c48b9172ee610da68fd9cd2770e7a4056cb3fc98710ee6906f0c7960"
 4324   4481   
dependencies = [
 4325   4482   
 "proc-macro2",
 4326   4483   
 "quote",
 4327   4484   
 "syn",
 4328   4485   
]
 4329   4486   
 4330   4487   
[[package]]
 4331   4488   
name = "thread_local"
 4332   4489   
version = "1.1.9"
 4333   4490   
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -4636,4793 +4722,4880 @@
 4656   4813   
checksum = "a156c684c91ea7d62626509bce3cb4e1d9ed5c4d978f7b4352658f96a4c26b4a"
 4657   4814   
 4658   4815   
[[package]]
 4659   4816   
name = "untrusted"
 4660   4817   
version = "0.9.0"
 4661   4818   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4662   4819   
checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1"
 4663   4820   
 4664   4821   
[[package]]
 4665   4822   
name = "url"
 4666         -
version = "2.5.4"
        4823  +
version = "2.5.6"
 4667   4824   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4668         -
checksum = "32f8b686cadd1473f4bd0117a5d28d36b1ade384ea9b5069a1c40aefed7fda60"
        4825  +
checksum = "137a3c834eaf7139b73688502f3f1141a0337c5d8e4d9b536f9b8c796e26a7c4"
 4669   4826   
dependencies = [
 4670   4827   
 "form_urlencoded",
 4671   4828   
 "idna",
 4672   4829   
 "percent-encoding",
 4673   4830   
]
 4674   4831   
 4675   4832   
[[package]]
 4676   4833   
name = "urlencoding"
 4677   4834   
version = "2.1.3"
 4678   4835   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4679   4836   
checksum = "daf8dba3b7eb870caf1ddeed7bc9d2a049f3cfdfae7cb521b087cc33ae4c49da"
 4680   4837   
 4681   4838   
[[package]]
 4682   4839   
name = "utf8_iter"
 4683   4840   
version = "1.0.4"
 4684   4841   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4685   4842   
checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be"
 4686   4843   
 4687   4844   
[[package]]
 4688   4845   
name = "uuid"
 4689   4846   
version = "1.18.0"
 4690   4847   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4691   4848   
checksum = "f33196643e165781c20a5ead5582283a7dacbb87855d867fbc2df3f81eddc1be"
 4692   4849   
dependencies = [
        4850  +
 "getrandom 0.3.3",
 4693   4851   
 "js-sys",
 4694   4852   
 "wasm-bindgen",
 4695   4853   
]
 4696   4854   
 4697   4855   
[[package]]
 4698   4856   
name = "valuable"
 4699   4857   
version = "0.1.1"
 4700   4858   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4701   4859   
checksum = "ba73ea9cf16a25df0c8caa16c51acb937d5712a8429db78a3ee29d5dcacd3a65"
 4702   4860   
@@ -4848,5006 +4944,5186 @@
 4868   5026   
version = "4.4.2"
 4869   5027   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4870   5028   
checksum = "87ba24419a2078cd2b0f2ede2691b6c66d8e47836da3b6db8265ebad47afbfc7"
 4871   5029   
dependencies = [
 4872   5030   
 "either",
 4873   5031   
 "home",
 4874   5032   
 "once_cell",
 4875   5033   
 "rustix 0.38.44",
 4876   5034   
]
 4877   5035   
        5036  +
[[package]]
        5037  +
name = "widestring"
        5038  +
version = "1.2.0"
        5039  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5040  +
checksum = "dd7cf3379ca1aac9eea11fba24fd7e315d621f8dfe35c8d7d2be8b793726e07d"
        5041  +
 4878   5042   
[[package]]
 4879   5043   
name = "winapi"
 4880   5044   
version = "0.3.9"
 4881   5045   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4882   5046   
checksum = "5c839a674fcd7a98952e593242ea400abe93992746761e38641405d28b00f419"
 4883   5047   
dependencies = [
 4884   5048   
 "winapi-i686-pc-windows-gnu",
 4885   5049   
 "winapi-x86_64-pc-windows-gnu",
 4886   5050   
]
 4887   5051   
 4888   5052   
[[package]]
 4889   5053   
name = "winapi-i686-pc-windows-gnu"
 4890   5054   
version = "0.4.0"
 4891   5055   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4892   5056   
checksum = "ac3b87c63620426dd9b991e5ce0329eff545bccbbb34f3be09ff6fb6ab51b7b6"
 4893   5057   
 4894   5058   
[[package]]
 4895   5059   
name = "winapi-util"
 4896   5060   
version = "0.1.10"
 4897   5061   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4898   5062   
checksum = "0978bf7171b3d90bac376700cb56d606feb40f251a475a5d6634613564460b22"
 4899   5063   
dependencies = [
 4900   5064   
 "windows-sys 0.60.2",
 4901   5065   
]
 4902   5066   
 4903   5067   
[[package]]
 4904   5068   
name = "winapi-x86_64-pc-windows-gnu"
 4905   5069   
version = "0.4.0"
 4906   5070   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4907   5071   
checksum = "712e227841d057c1ee1cd2fb22fa7e5a5461ae8e48fa2ca79ec42cfc1931183f"
 4908   5072   
        5073  +
[[package]]
        5074  +
name = "windows"
        5075  +
version = "0.61.3"
        5076  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5077  +
checksum = "9babd3a767a4c1aef6900409f85f5d53ce2544ccdfaa86dad48c91782c6d6893"
        5078  +
dependencies = [
        5079  +
 "windows-collections",
        5080  +
 "windows-core",
        5081  +
 "windows-future",
        5082  +
 "windows-link",
        5083  +
 "windows-numerics",
        5084  +
]
        5085  +
        5086  +
[[package]]
        5087  +
name = "windows-collections"
        5088  +
version = "0.2.0"
        5089  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5090  +
checksum = "3beeceb5e5cfd9eb1d76b381630e82c4241ccd0d27f1a39ed41b2760b255c5e8"
        5091  +
dependencies = [
        5092  +
 "windows-core",
        5093  +
]
        5094  +
        5095  +
[[package]]
        5096  +
name = "windows-core"
        5097  +
version = "0.61.2"
        5098  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5099  +
checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3"
        5100  +
dependencies = [
        5101  +
 "windows-implement",
        5102  +
 "windows-interface",
        5103  +
 "windows-link",
        5104  +
 "windows-result",
        5105  +
 "windows-strings",
        5106  +
]
        5107  +
        5108  +
[[package]]
        5109  +
name = "windows-future"
        5110  +
version = "0.2.1"
        5111  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5112  +
checksum = "fc6a41e98427b19fe4b73c550f060b59fa592d7d686537eebf9385621bfbad8e"
        5113  +
dependencies = [
        5114  +
 "windows-core",
        5115  +
 "windows-link",
        5116  +
 "windows-threading",
        5117  +
]
        5118  +
        5119  +
[[package]]
        5120  +
name = "windows-implement"
        5121  +
version = "0.60.0"
        5122  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5123  +
checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836"
        5124  +
dependencies = [
        5125  +
 "proc-macro2",
        5126  +
 "quote",
        5127  +
 "syn",
        5128  +
]
        5129  +
        5130  +
[[package]]
        5131  +
name = "windows-interface"
        5132  +
version = "0.59.1"
        5133  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5134  +
checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8"
        5135  +
dependencies = [
        5136  +
 "proc-macro2",
        5137  +
 "quote",
        5138  +
 "syn",
        5139  +
]
        5140  +
 4909   5141   
[[package]]
 4910   5142   
name = "windows-link"
 4911   5143   
version = "0.1.3"
 4912   5144   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4913   5145   
checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a"
 4914   5146   
        5147  +
[[package]]
        5148  +
name = "windows-numerics"
        5149  +
version = "0.2.0"
        5150  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5151  +
checksum = "9150af68066c4c5c07ddc0ce30421554771e528bde427614c61038bc2c92c2b1"
        5152  +
dependencies = [
        5153  +
 "windows-core",
        5154  +
 "windows-link",
        5155  +
]
        5156  +
 4915   5157   
[[package]]
 4916   5158   
name = "windows-registry"
 4917   5159   
version = "0.5.3"
 4918   5160   
source = "registry+https://github.com/rust-lang/crates.io-index"
 4919   5161   
checksum = "5b8a9ed28765efc97bbc954883f4e6796c33a06546ebafacbabee9696967499e"
 4920   5162   
dependencies = [
 4921   5163   
 "windows-link",
 4922   5164   
 "windows-result",
 4923   5165   
 "windows-strings",
 4924   5166   
]
@@ -4998,5240 +5057,5308 @@
 5018   5260   
 "windows_aarch64_gnullvm 0.53.0",
 5019   5261   
 "windows_aarch64_msvc 0.53.0",
 5020   5262   
 "windows_i686_gnu 0.53.0",
 5021   5263   
 "windows_i686_gnullvm 0.53.0",
 5022   5264   
 "windows_i686_msvc 0.53.0",
 5023   5265   
 "windows_x86_64_gnu 0.53.0",
 5024   5266   
 "windows_x86_64_gnullvm 0.53.0",
 5025   5267   
 "windows_x86_64_msvc 0.53.0",
 5026   5268   
]
 5027   5269   
        5270  +
[[package]]
        5271  +
name = "windows-threading"
        5272  +
version = "0.1.0"
        5273  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5274  +
checksum = "b66463ad2e0ea3bbf808b7f1d371311c80e115c0b71d60efc142cafbcfb057a6"
        5275  +
dependencies = [
        5276  +
 "windows-link",
        5277  +
]
        5278  +
 5028   5279   
[[package]]
 5029   5280   
name = "windows_aarch64_gnullvm"
 5030   5281   
version = "0.48.5"
 5031   5282   
source = "registry+https://github.com/rust-lang/crates.io-index"
 5032   5283   
checksum = "2b38e32f0abccf9987a4e3079dfb67dcd799fb61361e53e2882c3cbaf0d905d8"
 5033   5284   
 5034   5285   
[[package]]
 5035   5286   
name = "windows_aarch64_gnullvm"
 5036   5287   
version = "0.52.6"
 5037   5288   
source = "registry+https://github.com/rust-lang/crates.io-index"
@@ -5136,5387 +5195,5456 @@
 5156   5407   
version = "0.52.6"
 5157   5408   
source = "registry+https://github.com/rust-lang/crates.io-index"
 5158   5409   
checksum = "589f6da84c646204747d1270a2a5661ea66ed1cced2631d546fdfb155959f9ec"
 5159   5410   
 5160   5411   
[[package]]
 5161   5412   
name = "windows_x86_64_msvc"
 5162   5413   
version = "0.53.0"
 5163   5414   
source = "registry+https://github.com/rust-lang/crates.io-index"
 5164   5415   
checksum = "271414315aff87387382ec3d271b52d7ae78726f5d44ac98b4f4030c91880486"
 5165   5416   
        5417  +
[[package]]
        5418  +
name = "winreg"
        5419  +
version = "0.50.0"
        5420  +
source = "registry+https://github.com/rust-lang/crates.io-index"
        5421  +
checksum = "524e57b2c537c0f9b1e69f1965311ec12182b4122e45035b1508cd24d2adadb1"
        5422  +
dependencies = [
        5423  +
 "cfg-if",
        5424  +
 "windows-sys 0.48.0",
        5425  +
]
        5426  +
 5166   5427   
[[package]]
 5167   5428   
name = "wit-bindgen"
 5168   5429   
version = "0.19.2"
 5169   5430   
source = "registry+https://github.com/rust-lang/crates.io-index"
 5170   5431   
checksum = "b37d270da94012e0ac490ac633ad5bdd76a10a3fb15069edb033c1b771ce931f"
 5171   5432   
dependencies = [
 5172   5433   
 "bitflags 2.9.2",
 5173   5434   
]
 5174   5435   
 5175   5436   
[[package]]

tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime/Cargo.toml

@@ -1,1 +57,58 @@
   18     18   
[package.metadata.cargo-udeps.ignore]
   19     19   
normal = ["aws-smithy-http"]
   20     20   
   21     21   
[features]
   22     22   
client = ["aws-smithy-runtime-api/client", "aws-smithy-types/http-body-1-x"]
   23     23   
http-auth = ["aws-smithy-runtime-api/http-auth"]
   24     24   
connector-hyper-0-14-x = ["dep:aws-smithy-http-client", "aws-smithy-http-client?/hyper-014"]
   25     25   
tls-rustls = ["dep:aws-smithy-http-client", "aws-smithy-http-client?/legacy-rustls-ring", "connector-hyper-0-14-x"]
   26     26   
default-https-client = ["dep:aws-smithy-http-client", "aws-smithy-http-client?/rustls-aws-lc"]
   27     27   
rt-tokio = ["tokio/rt"]
          28  +
hickory-dns = ["dep:hickory-resolver", "rt-tokio"]
   28     29   
test-util = ["aws-smithy-runtime-api/test-util", "dep:tracing-subscriber", "aws-smithy-http-client/test-util", "legacy-test-util"]
   29     30   
legacy-test-util = ["aws-smithy-runtime-api/test-util", "dep:tracing-subscriber", "aws-smithy-http-client/test-util", "connector-hyper-0-14-x", "aws-smithy-http-client/legacy-test-util"]
   30     31   
wire-mock = ["legacy-test-util", "aws-smithy-http-client/wire-mock"]
   31     32   
   32     33   
[dependencies]
   33     34   
bytes = "1.10.0"
   34     35   
fastrand = "2.3.0"
   35     36   
pin-project-lite = "0.2.14"
   36     37   
pin-utils = "0.1.0"
   37     38   
tracing = "0.1.40"
@@ -59,60 +118,122 @@
   79     80   
version = "1"
   80     81   
   81     82   
[dependencies.tokio]
   82     83   
version = "1.40.0"
   83     84   
features = []
   84     85   
   85     86   
[dependencies.tracing-subscriber]
   86     87   
version = "0.3.16"
   87     88   
optional = true
   88     89   
features = ["env-filter", "fmt", "json"]
          90  +
[target."cfg(not(target_family = \"wasm\"))".dependencies.hickory-resolver]
          91  +
version = "0.25.2"
          92  +
optional = true
   89     93   
   90     94   
[dev-dependencies]
   91     95   
approx = "0.5.1"
   92     96   
fastrand = "2.3.0"
   93     97   
futures-util = "0.3.29"
   94     98   
pretty_assertions = "1.4.0"
   95     99   
tracing-test = "0.2.1"
   96    100   
   97    101   
[dev-dependencies.aws-smithy-async]
   98    102   
path = "../aws-smithy-async"

tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime/src/client/dns.rs

@@ -1,1 +0,18 @@
    1      1   
/*
    2      2   
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
    3      3   
 * SPDX-License-Identifier: Apache-2.0
    4      4   
 */
    5      5   
    6      6   
//! Built-in DNS resolver implementations.
    7      7   
    8      8   
#[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))]
    9         -
mod tokio {
   10         -
    use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError};
   11         -
    use std::io::{Error as IoError, ErrorKind as IoErrorKind};
   12         -
    use std::net::ToSocketAddrs;
   13         -
   14         -
    /// DNS resolver that uses `tokio::spawn_blocking` to resolve DNS using the standard library.
   15         -
    ///
   16         -
    /// This implementation isn't available for WASM targets.
   17         -
    #[non_exhaustive]
   18         -
    #[derive(Debug, Default)]
   19         -
    pub struct TokioDnsResolver;
   20         -
   21         -
    impl TokioDnsResolver {
   22         -
        /// Creates a new Tokio DNS resolver
   23         -
        pub fn new() -> Self {
   24         -
            Self
   25         -
        }
   26         -
    }
   27         -
   28         -
    impl ResolveDns for TokioDnsResolver {
   29         -
        fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {
   30         -
            let name = name.to_string();
   31         -
            DnsFuture::new(async move {
   32         -
                let result = tokio::task::spawn_blocking(move || (name, 0).to_socket_addrs()).await;
   33         -
                match result {
   34         -
                    Err(join_failure) => Err(ResolveDnsError::new(IoError::new(
   35         -
                        IoErrorKind::Other,
   36         -
                        join_failure,
   37         -
                    ))),
   38         -
                    Ok(Ok(dns_result)) => {
   39         -
                        Ok(dns_result.into_iter().map(|addr| addr.ip()).collect())
   40         -
                    }
   41         -
                    Ok(Err(dns_failure)) => Err(ResolveDnsError::new(dns_failure)),
   42         -
                }
   43         -
            })
   44         -
        }
   45         -
    }
   46         -
}
           9  +
mod tokio;
   47     10   
   48     11   
#[cfg(all(feature = "rt-tokio", not(target_family = "wasm")))]
   49     12   
pub use self::tokio::TokioDnsResolver;
          13  +
          14  +
#[cfg(all(feature = "hickory-dns", not(target_family = "wasm")))]
          15  +
mod caching;
          16  +
          17  +
#[cfg(all(feature = "hickory-dns", not(target_family = "wasm")))]
          18  +
pub use self::caching::CachingDnsResolver;

tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime/src/client/dns/caching.rs

@@ -0,1 +0,157 @@
           1  +
/*
           2  +
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
           3  +
 * SPDX-License-Identifier: Apache-2.0
           4  +
 */
           5  +
           6  +
use std::{
           7  +
    io::{Error as IoError, ErrorKind as IoErrorKind},
           8  +
    net::IpAddr,
           9  +
    time::Duration,
          10  +
};
          11  +
          12  +
use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError};
          13  +
use hickory_resolver::{
          14  +
    config::{NameServerConfigGroup, ResolverConfig},
          15  +
    name_server::TokioConnectionProvider,
          16  +
    Resolver,
          17  +
};
          18  +
          19  +
/// DNS resolver that uses [hickory_resolver] and caches DNS entries in memory.
          20  +
///
          21  +
/// This resolver requires a [tokio] runtime to function and isn't available for WASM targets.
          22  +
#[non_exhaustive]
          23  +
#[derive(Debug)]
          24  +
pub struct CachingDnsResolver {
          25  +
    resolver: Resolver<TokioConnectionProvider>,
          26  +
}
          27  +
          28  +
impl Default for CachingDnsResolver {
          29  +
    /// Constructs a new Tokio based [ResolveDns] with the system configuration.
          30  +
    /// This uses `/etc/resolv.conf` on Unix OSes and registry settings on Windows.
          31  +
    fn default() -> Self {
          32  +
        Self {
          33  +
            resolver: Resolver::builder_tokio().expect("In tokio runtime").build(),
          34  +
        }
          35  +
    }
          36  +
}
          37  +
          38  +
impl CachingDnsResolver {
          39  +
    /// Creates a new DNS resolver that caches IP addresses in memory.
          40  +
    pub fn builder() -> CachingDnsResolverBuilder {
          41  +
        CachingDnsResolverBuilder {
          42  +
            nameservers: None,
          43  +
            timeout: None,
          44  +
            attempts: None,
          45  +
            cache_size: None,
          46  +
            num_concurrent_reqs: None,
          47  +
        }
          48  +
    }
          49  +
          50  +
    /// Flush the cache
          51  +
    pub fn clear_cache(&self) {
          52  +
        self.resolver.clear_cache();
          53  +
    }
          54  +
}
          55  +
          56  +
impl ResolveDns for CachingDnsResolver {
          57  +
    fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {
          58  +
        DnsFuture::new(async move {
          59  +
            let result = self.resolver.lookup_ip(name).await;
          60  +
          61  +
            match result {
          62  +
                Ok(ips) => Ok(ips.into_iter().collect()),
          63  +
                Err(failure) => Err(ResolveDnsError::new(IoError::new(
          64  +
                    IoErrorKind::Other,
          65  +
                    failure,
          66  +
                ))),
          67  +
            }
          68  +
        })
          69  +
    }
          70  +
}
          71  +
          72  +
pub struct CachingDnsResolverBuilder {
          73  +
    nameservers: Option<Nameservers>,
          74  +
    timeout: Option<Duration>,
          75  +
    attempts: Option<usize>,
          76  +
    cache_size: Option<usize>,
          77  +
    num_concurrent_reqs: Option<usize>,
          78  +
}
          79  +
          80  +
struct Nameservers {
          81  +
    ips: Vec<IpAddr>,
          82  +
    port: u16,
          83  +
}
          84  +
          85  +
impl CachingDnsResolverBuilder {
          86  +
    /// Configure upstream nameservers and the port to use for resolution. Defaults to the system
          87  +
    /// configuration.
          88  +
    pub fn nameservers(mut self, ips: &[IpAddr], port: u16) -> Self {
          89  +
        self.nameservers = Some(Nameservers {
          90  +
            ips: ips.to_vec(),
          91  +
            port,
          92  +
        });
          93  +
        self
          94  +
    }
          95  +
          96  +
    /// Specify the timeout for a request. Defaults to 5 seconds.
          97  +
    pub fn timeout(mut self, timeout: Duration) -> Self {
          98  +
        self.timeout = Some(timeout);
          99  +
        self
         100  +
    }
         101  +
         102  +
    /// Number of retries after lookup failure before giving up. Defaults to 2.
         103  +
    pub fn attempts(mut self, attempts: usize) -> Self {
         104  +
        self.attempts = Some(attempts);
         105  +
        self
         106  +
    }
         107  +
         108  +
    /// Cache size is in number of records (some records can be large). Defaults to 32.
         109  +
    pub fn cache_size(mut self, cache_size: usize) -> Self {
         110  +
        self.cache_size = Some(cache_size);
         111  +
        self
         112  +
    }
         113  +
         114  +
    /// Number of concurrent requests per query.
         115  +
    ///
         116  +
    /// Where more than one nameserver is configured, this configures the resolver
         117  +
    /// to send queries to a number of servers in parallel. Defaults to 2. Setting
         118  +
    /// to 0 or 1 will execute requests serially.
         119  +
    pub fn num_concurrent_reqs(mut self, num_concurrent_reqs: usize) -> Self {
         120  +
        self.num_concurrent_reqs = Some(num_concurrent_reqs);
         121  +
        self
         122  +
    }
         123  +
         124  +
    pub fn build(self) -> CachingDnsResolver {
         125  +
        let mut builder = if let Some(nameservers) = self.nameservers {
         126  +
            let nameserver_config =
         127  +
                NameServerConfigGroup::from_ips_clear(&nameservers.ips, nameservers.port, true);
         128  +
            let resolver_config = ResolverConfig::from_parts(None, vec![], nameserver_config);
         129  +
         130  +
            Resolver::builder_with_config(resolver_config, TokioConnectionProvider::default())
         131  +
        } else {
         132  +
            Resolver::builder_tokio().expect("Successfully read system config")
         133  +
        };
         134  +
         135  +
        let opts = builder.options_mut();
         136  +
         137  +
        if let Some(timeout) = self.timeout {
         138  +
            opts.timeout = timeout;
         139  +
        }
         140  +
         141  +
        if let Some(attempts) = self.attempts {
         142  +
            opts.attempts = attempts;
         143  +
        }
         144  +
         145  +
        if let Some(cache_size) = self.cache_size {
         146  +
            opts.cache_size = cache_size;
         147  +
        }
         148  +
         149  +
        if let Some(num_concurrent_reqs) = self.num_concurrent_reqs {
         150  +
            opts.num_concurrent_reqs = num_concurrent_reqs;
         151  +
        }
         152  +
         153  +
        CachingDnsResolver {
         154  +
            resolver: builder.build(),
         155  +
        }
         156  +
    }
         157  +
}

tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime/src/client/dns/tokio.rs

@@ -0,1 +0,39 @@
           1  +
/*
           2  +
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
           3  +
 * SPDX-License-Identifier: Apache-2.0
           4  +
 */
           5  +
           6  +
use aws_smithy_runtime_api::client::dns::{DnsFuture, ResolveDns, ResolveDnsError};
           7  +
use std::io::{Error as IoError, ErrorKind as IoErrorKind};
           8  +
use std::net::ToSocketAddrs;
           9  +
          10  +
/// DNS resolver that uses `tokio::spawn_blocking` to resolve DNS using the standard library.
          11  +
///
          12  +
/// This implementation isn't available for WASM targets.
          13  +
#[non_exhaustive]
          14  +
#[derive(Debug, Default)]
          15  +
pub struct TokioDnsResolver;
          16  +
          17  +
impl TokioDnsResolver {
          18  +
    /// Creates a new Tokio DNS resolver
          19  +
    pub fn new() -> Self {
          20  +
        Self
          21  +
    }
          22  +
}
          23  +
          24  +
impl ResolveDns for TokioDnsResolver {
          25  +
    fn resolve_dns<'a>(&'a self, name: &'a str) -> DnsFuture<'a> {
          26  +
        let name = name.to_string();
          27  +
        DnsFuture::new(async move {
          28  +
            let result = tokio::task::spawn_blocking(move || (name, 0).to_socket_addrs()).await;
          29  +
            match result {
          30  +
                Err(join_failure) => Err(ResolveDnsError::new(IoError::new(
          31  +
                    IoErrorKind::Other,
          32  +
                    join_failure,
          33  +
                ))),
          34  +
                Ok(Ok(dns_result)) => Ok(dns_result.into_iter().map(|addr| addr.ip()).collect()),
          35  +
                Ok(Err(dns_failure)) => Err(ResolveDnsError::new(dns_failure)),
          36  +
            }
          37  +
        })
          38  +
    }
          39  +
}

tmp-codegen-diff/aws-sdk/sdk/aws-smithy-runtime/tests/dns_caching.rs

@@ -0,1 +0,339 @@
           1  +
/*
           2  +
 * Copyright Amazon.com, Inc. or its affiliates. All Rights Reserved.
           3  +
 * SPDX-License-Identifier: Apache-2.0
           4  +
 */
           5  +
           6  +
#![cfg(all(
           7  +
    feature = "client",
           8  +
    feature = "hickory-dns",
           9  +
    not(target_family = "wasm")
          10  +
))]
          11  +
          12  +
use aws_smithy_runtime::client::dns::CachingDnsResolver;
          13  +
use aws_smithy_runtime_api::client::dns::ResolveDns;
          14  +
use std::{
          15  +
    net::{IpAddr, Ipv4Addr},
          16  +
    time::Duration,
          17  +
};
          18  +
use tokio::test;
          19  +
          20  +
#[test]
          21  +
async fn test_dns_caching() {
          22  +
    let dns_server = test_dns_server::setup_dns_server().await;
          23  +
    let (dns_ip, dns_port) = dns_server.addr();
          24  +
          25  +
    let resolver = CachingDnsResolver::builder()
          26  +
        .nameservers(&[dns_ip], dns_port)
          27  +
        .cache_size(1)
          28  +
        .build();
          29  +
          30  +
    let hostname = "example.com";
          31  +
          32  +
    // First resolution should hit the server
          33  +
    let first_result = resolver.resolve_dns(hostname).await;
          34  +
    let first_ips = first_result.unwrap();
          35  +
          36  +
    // Verify correct IP returned and server hit to get it
          37  +
    assert_eq!(vec![IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4))], first_ips);
          38  +
    assert!(dns_server.query_count() == 1);
          39  +
          40  +
    // Second resolution should hit the cache
          41  +
    let second_result = resolver.resolve_dns(hostname).await;
          42  +
    let second_ips = second_result.unwrap();
          43  +
          44  +
    // Verify second resolution hit cache, not server
          45  +
    assert!(dns_server.query_count() == 1);
          46  +
          47  +
    // Verify same IPs returned
          48  +
    assert_eq!(first_ips, second_ips);
          49  +
}
          50  +
          51  +
#[test]
          52  +
async fn test_dns_cache_size_limit() {
          53  +
    let dns_server = test_dns_server::setup_dns_server().await;
          54  +
    let (dns_ip, dns_port) = dns_server.addr();
          55  +
          56  +
    let resolver = CachingDnsResolver::builder()
          57  +
        .nameservers(&[dns_ip], dns_port)
          58  +
        .cache_size(1)
          59  +
        .build();
          60  +
          61  +
    // First resolution should hit the server
          62  +
    let _first_result = resolver.resolve_dns("example.com").await;
          63  +
          64  +
    // Verify server hit
          65  +
    assert!(dns_server.query_count() == 1);
          66  +
          67  +
    // Second resolution should hit the server
          68  +
    let _second_result = resolver.resolve_dns("aws.com").await;
          69  +
          70  +
    // Verify server hit
          71  +
    assert!(dns_server.query_count() == 2);
          72  +
          73  +
    // Third resolution should hit the server
          74  +
    let _third_result = resolver.resolve_dns("foo.com").await;
          75  +
          76  +
    // Verify server hit
          77  +
    assert!(dns_server.query_count() == 3);
          78  +
          79  +
    // Third result should now be in cache
          80  +
    let _third_result = resolver.resolve_dns("foo.com").await;
          81  +
          82  +
    // Verify server not hit in favor of the cache
          83  +
    assert!(dns_server.query_count() == 3);
          84  +
          85  +
    // First result should have been removed from the cache, so querying it again should hit server
          86  +
    let _first_result_again = resolver.resolve_dns("example.com").await;
          87  +
          88  +
    // Verify server hit
          89  +
    assert!(dns_server.query_count() == 4);
          90  +
}
          91  +
          92  +
#[test]
          93  +
async fn test_dns_error_handling() {
          94  +
    let dns_server = test_dns_server::setup_dns_server().await;
          95  +
    let (dns_ip, dns_port) = dns_server.addr();
          96  +
          97  +
    let resolver = CachingDnsResolver::builder()
          98  +
        .nameservers(&[dns_ip], dns_port)
          99  +
        .timeout(Duration::from_millis(100))
         100  +
        .attempts(1)
         101  +
        .build();
         102  +
         103  +
    // Try to resolve an invalid hostname
         104  +
    let result = resolver
         105  +
        .resolve_dns("invalid.nonexistent.domain.test")
         106  +
        .await;
         107  +
    assert!(result.is_err());
         108  +
}
         109  +
         110  +
// Kind of janky minimal test utility for creating a local DNS server
         111  +
#[cfg(test)]
         112  +
mod test_dns_server {
         113  +
    use std::{
         114  +
        collections::HashMap,
         115  +
        net::{IpAddr, Ipv4Addr, SocketAddr},
         116  +
        sync::{atomic::AtomicUsize, Arc},
         117  +
        time::Duration,
         118  +
    };
         119  +
    use tokio::{net::UdpSocket, sync::Notify, task::JoinHandle};
         120  +
         121  +
    pub async fn setup_dns_server() -> TestDnsServer {
         122  +
        let mut records = HashMap::new();
         123  +
        records.insert(
         124  +
            "example.com".to_string(),
         125  +
            IpAddr::V4(Ipv4Addr::new(1, 2, 3, 4)),
         126  +
        );
         127  +
        records.insert("aws.com".to_string(), IpAddr::V4(Ipv4Addr::new(5, 6, 7, 8)));
         128  +
        records.insert(
         129  +
            "foo.com".to_string(),
         130  +
            IpAddr::V4(Ipv4Addr::new(9, 10, 11, 12)),
         131  +
        );
         132  +
         133  +
        TestDnsServer::start(records).await.unwrap()
         134  +
    }
         135  +
         136  +
    pub struct TestDnsServer {
         137  +
        handle: JoinHandle<()>,
         138  +
        addr: SocketAddr,
         139  +
        shutdown: Arc<Notify>,
         140  +
        query_count: Arc<AtomicUsize>,
         141  +
    }
         142  +
         143  +
    impl TestDnsServer {
         144  +
        pub async fn start(
         145  +
            records: HashMap<String, IpAddr>,
         146  +
        ) -> Result<Self, Box<dyn std::error::Error + Send + Sync>> {
         147  +
            // localhost, random port
         148  +
            let socket = UdpSocket::bind("127.0.0.1:0").await?;
         149  +
            let addr = socket.local_addr()?;
         150  +
         151  +
            let shutdown = Arc::new(Notify::new());
         152  +
            let shutdown_clone = shutdown.clone();
         153  +
            let query_count = Arc::new(AtomicUsize::new(0));
         154  +
            let query_count_clone = query_count.clone();
         155  +
         156  +
            let handle = tokio::spawn(async move {
         157  +
                let mut buf = [0; 512];
         158  +
                loop {
         159  +
                    tokio::select! {
         160  +
                        _ = shutdown_clone.notified() => break,
         161  +
                        result = socket.recv_from(&mut buf) => {
         162  +
                            if let Ok((len, src)) = result {
         163  +
                                query_count_clone.fetch_add(1, std::sync::atomic::Ordering::Relaxed);
         164  +
                                // Short sleep before returning DNS response to simulate network latency
         165  +
                                tokio::time::sleep(Duration::from_millis(1000)).await;
         166  +
                                let response = create_dns_response(&buf[..len], &records);
         167  +
                                let _ = socket.send_to(&response, src).await;
         168  +
                            }
         169  +
                        }
         170  +
                    }
         171  +
                }
         172  +
            });
         173  +
         174  +
            Ok(TestDnsServer {
         175  +
                handle,
         176  +
                addr,
         177  +
                shutdown,
         178  +
                query_count,
         179  +
            })
         180  +
        }
         181  +
         182  +
        pub fn addr(&self) -> (IpAddr, u16) {
         183  +
            (self.addr.ip(), self.addr.port())
         184  +
        }
         185  +
         186  +
        pub fn query_count(&self) -> usize {
         187  +
            self.query_count.load(std::sync::atomic::Ordering::Relaxed)
         188  +
        }
         189  +
    }
         190  +
         191  +
    impl Drop for TestDnsServer {
         192  +
        fn drop(&mut self) {
         193  +
            self.shutdown.notify_one();
         194  +
            self.handle.abort();
         195  +
        }
         196  +
    }
         197  +
         198  +
    fn create_dns_response(query: &[u8], records: &HashMap<String, IpAddr>) -> Vec<u8> {
         199  +
        let parsed = DnsQuery::parse(query).unwrap_or_default();
         200  +
        let ip = records.get(&parsed.domain).copied().unwrap();
         201  +
         202  +
        let response = DnsResponse {
         203  +
            id: parsed.id,
         204  +
            flags: 0x8180, // Standard response flags
         205  +
            question: parsed.domain,
         206  +
            answer_ip: ip,
         207  +
            ttl: 300,
         208  +
        };
         209  +
         210  +
        response.to_bytes()
         211  +
    }
         212  +
         213  +
    #[derive(Debug, Default)]
         214  +
    #[allow(dead_code)]
         215  +
    struct DnsQuery {
         216  +
        id: u16,
         217  +
        flags: u16,
         218  +
        question_count: u16,
         219  +
        domain: String,
         220  +
        query_type: u16,
         221  +
        query_class: u16,
         222  +
    }
         223  +
         224  +
    impl DnsQuery {
         225  +
        fn parse(data: &[u8]) -> Option<Self> {
         226  +
            if data.len() < 12 {
         227  +
                return None;
         228  +
            }
         229  +
         230  +
            let id = u16::from_be_bytes([data[0], data[1]]);
         231  +
            let flags = u16::from_be_bytes([data[2], data[3]]);
         232  +
            let question_count = u16::from_be_bytes([data[4], data[5]]);
         233  +
         234  +
            if question_count == 0 {
         235  +
                return None;
         236  +
            }
         237  +
         238  +
            // Parse domain name starting at byte 12
         239  +
            let mut pos = 12;
         240  +
            let mut domain = String::new();
         241  +
         242  +
            while pos < data.len() {
         243  +
                let len = data[pos] as usize;
         244  +
                if len == 0 {
         245  +
                    pos += 1;
         246  +
                    break;
         247  +
                }
         248  +
         249  +
                if !domain.is_empty() {
         250  +
                    domain.push('.');
         251  +
                }
         252  +
         253  +
                pos += 1;
         254  +
                if pos + len > data.len() {
         255  +
                    return None;
         256  +
                }
         257  +
         258  +
                if let Ok(label) = std::str::from_utf8(&data[pos..pos + len]) {
         259  +
                    domain.push_str(label);
         260  +
                }
         261  +
                pos += len;
         262  +
            }
         263  +
         264  +
            if pos + 4 > data.len() {
         265  +
                return None;
         266  +
            }
         267  +
         268  +
            let query_type = u16::from_be_bytes([data[pos], data[pos + 1]]);
         269  +
            let query_class = u16::from_be_bytes([data[pos + 2], data[pos + 3]]);
         270  +
         271  +
            Some(DnsQuery {
         272  +
                id,
         273  +
                flags,
         274  +
                question_count,
         275  +
                domain,
         276  +
                query_type,
         277  +
                query_class,
         278  +
            })
         279  +
        }
         280  +
    }
         281  +
         282  +
    #[derive(Debug)]
         283  +
    #[allow(dead_code)]
         284  +
    struct DnsResponse {
         285  +
        id: u16,
         286  +
        flags: u16,
         287  +
        question: String,
         288  +
        answer_ip: IpAddr,
         289  +
        ttl: u32,
         290  +
    }
         291  +
         292  +
    impl DnsResponse {
         293  +
        fn to_bytes(&self) -> Vec<u8> {
         294  +
            // 30ish required bytes, 11 more added for the question section
         295  +
            // since the longest domain we currently use is 11 bytes long
         296  +
            let mut response = Vec::with_capacity(41);
         297  +
         298  +
            // Header (12 bytes) all values besides id/flags hardcoded
         299  +
            response.extend_from_slice(&self.id.to_be_bytes());
         300  +
            response.extend_from_slice(&self.flags.to_be_bytes());
         301  +
            response.extend_from_slice(&1u16.to_be_bytes()); // Questions: 1
         302  +
            response.extend_from_slice(&1u16.to_be_bytes()); // Answers: 1
         303  +
            response.extend_from_slice(&0u16.to_be_bytes()); // Authority: 0
         304  +
            response.extend_from_slice(&0u16.to_be_bytes()); // Additional: 0
         305  +
         306  +
            // Question section
         307  +
            // In a more ideal world the DnsResponse would contain a ref to the
         308  +
            // DnsQuery that triggered this response and recreate the question section
         309  +
            // from that
         310  +
            for label in self.question.split('.') {
         311  +
                response.push(label.len() as u8);
         312  +
                response.extend_from_slice(label.as_bytes());
         313  +
            }
         314  +
            response.push(0); // End of name
         315  +
            response.extend_from_slice(&1u16.to_be_bytes()); // Type A
         316  +
            response.extend_from_slice(&1u16.to_be_bytes()); // Class IN
         317  +
         318  +
            // Answer section
         319  +
            response.extend_from_slice(&[0xc0, 0x0c]); // Name pointer
         320  +
            response.extend_from_slice(&1u16.to_be_bytes()); // Type A
         321  +
            response.extend_from_slice(&1u16.to_be_bytes()); // Class IN
         322  +
            response.extend_from_slice(&self.ttl.to_be_bytes()); // TTL
         323  +
         324  +
            match self.answer_ip {
         325  +
                IpAddr::V4(ipv4) => {
         326  +
                    response.extend_from_slice(&4u16.to_be_bytes()); // Data length
         327  +
                    response.extend_from_slice(&ipv4.octets());
         328  +
                }
         329  +
                IpAddr::V6(_) => {
         330  +
                    // Unsupported, fallback to IPv4
         331  +
                    response.extend_from_slice(&4u16.to_be_bytes());
         332  +
                    response.extend_from_slice(&[127, 0, 0, 1]);
         333  +
                }
         334  +
            }
         335  +
         336  +
            response
         337  +
        }
         338  +
    }
         339  +
}