Codebase list feroxbuster / e798ac0
New upstream version 2.7.2 Daniel Ruiz de Alegría 1 year, 4 months ago
36 changed file(s) with 993 addition(s) and 807 deletion(s). Raw diff Collapse all Expand all
439439 "contributions": [
440440 "ideas"
441441 ]
442 },
443 {
444 "login": "herrcykel",
445 "name": "O",
446 "avatar_url": "https://avatars.githubusercontent.com/u/1936757?v=4",
447 "profile": "https://github.com/herrcykel",
448 "contributions": [
449 "code"
450 ]
451 },
452 {
453 "login": "udoprog",
454 "name": "John-John Tedro",
455 "avatar_url": "https://avatars.githubusercontent.com/u/111092?v=4",
456 "profile": "http://udoprog.github.io/",
457 "contributions": [
458 "code"
459 ]
442460 }
443461 ],
444462 "contributorsPerLine": 7,
446464 "projectOwner": "epi052",
447465 "repoType": "github",
448466 "repoHost": "https://github.com",
449 "skipCi": true
467 "skipCi": true,
468 "commitConvention": "angular"
450469 }
33
44 [[package]]
55 name = "aho-corasick"
6 version = "0.7.18"
7 source = "registry+https://github.com/rust-lang/crates.io-index"
8 checksum = "1e37cfd5e7657ada45f742d6e99ca5788580b5c529dc78faf11ece6dc702656f"
6 version = "0.7.19"
7 source = "registry+https://github.com/rust-lang/crates.io-index"
8 checksum = "b4f55bd91a0978cbfd91c457a164bab8b4001c833b7f323132c0a4e1922dd44e"
99 dependencies = [
1010 "memchr",
1111 ]
1212
1313 [[package]]
1414 name = "anyhow"
15 version = "1.0.57"
16 source = "registry+https://github.com/rust-lang/crates.io-index"
17 checksum = "08f9b8508dccb7687a1d6c4ce66b2b0ecef467c94667de27d8d7fe1f8d2a9cdc"
15 version = "1.0.66"
16 source = "registry+https://github.com/rust-lang/crates.io-index"
17 checksum = "216261ddc8289130e551ddcd5ce8a064710c0d064a4d2895c67151c92b5443f6"
1818
1919 [[package]]
2020 name = "ascii-canvas"
2727
2828 [[package]]
2929 name = "assert-json-diff"
30 version = "2.0.1"
31 source = "registry+https://github.com/rust-lang/crates.io-index"
32 checksum = "50f1c3703dd33532d7f0ca049168930e9099ecac238e23cf932f3a69c42f06da"
30 version = "2.0.2"
31 source = "registry+https://github.com/rust-lang/crates.io-index"
32 checksum = "47e4f2b81832e72834d7518d8487a0396a28cc408186a2e8854c0f98011faf12"
3333 dependencies = [
3434 "serde",
3535 "serde_json",
3737
3838 [[package]]
3939 name = "assert_cmd"
40 version = "2.0.4"
41 source = "registry+https://github.com/rust-lang/crates.io-index"
42 checksum = "93ae1ddd39efd67689deb1979d80bad3bf7f2b09c6e6117c8d1f2443b5e2f83e"
40 version = "2.0.6"
41 source = "registry+https://github.com/rust-lang/crates.io-index"
42 checksum = "ba45b8163c49ab5f972e59a8a5a03b6d2972619d486e19ec9fe744f7c2753d3c"
4343 dependencies = [
4444 "bstr",
4545 "doc-comment",
5151
5252 [[package]]
5353 name = "async-channel"
54 version = "1.6.1"
55 source = "registry+https://github.com/rust-lang/crates.io-index"
56 checksum = "2114d64672151c0c5eaa5e131ec84a74f06e1e559830dabba01ca30605d66319"
57 dependencies = [
58 "concurrent-queue",
54 version = "1.7.1"
55 source = "registry+https://github.com/rust-lang/crates.io-index"
56 checksum = "e14485364214912d3b19cc3435dde4df66065127f05fa0d75c712f36f12c2f28"
57 dependencies = [
58 "concurrent-queue 1.2.4",
5959 "event-listener",
6060 "futures-core",
6161 ]
6262
6363 [[package]]
6464 name = "async-executor"
65 version = "1.4.1"
66 source = "registry+https://github.com/rust-lang/crates.io-index"
67 checksum = "871f9bb5e0a22eeb7e8cf16641feb87c9dc67032ccf8ff49e772eb9941d3a965"
68 dependencies = [
65 version = "1.5.0"
66 source = "registry+https://github.com/rust-lang/crates.io-index"
67 checksum = "17adb73da160dfb475c183343c8cccd80721ea5a605d3eb57125f0a7b7a92d0b"
68 dependencies = [
69 "async-lock",
6970 "async-task",
70 "concurrent-queue",
71 "concurrent-queue 2.0.0",
7172 "fastrand",
7273 "futures-lite",
73 "once_cell",
7474 "slab",
7575 ]
7676
7777 [[package]]
7878 name = "async-global-executor"
79 version = "2.0.4"
80 source = "registry+https://github.com/rust-lang/crates.io-index"
81 checksum = "c290043c9a95b05d45e952fb6383c67bcb61471f60cfa21e890dba6654234f43"
79 version = "2.3.1"
80 source = "registry+https://github.com/rust-lang/crates.io-index"
81 checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
8282 dependencies = [
8383 "async-channel",
8484 "async-executor",
8585 "async-io",
86 "async-mutex",
86 "async-lock",
8787 "blocking",
8888 "futures-lite",
89 "num_cpus",
9089 "once_cell",
9190 ]
9291
9392 [[package]]
9493 name = "async-io"
95 version = "1.6.0"
96 source = "registry+https://github.com/rust-lang/crates.io-index"
97 checksum = "a811e6a479f2439f0c04038796b5cfb3d2ad56c230e0f2d3f7b04d68cfee607b"
98 dependencies = [
99 "concurrent-queue",
94 version = "1.10.0"
95 source = "registry+https://github.com/rust-lang/crates.io-index"
96 checksum = "e8121296a9f05be7f34aa4196b1747243b3b62e048bb7906f644f3fbfc490cf7"
97 dependencies = [
98 "async-lock",
99 "autocfg",
100 "concurrent-queue 1.2.4",
100101 "futures-lite",
101102 "libc",
102103 "log",
103 "once_cell",
104104 "parking",
105105 "polling",
106106 "slab",
111111
112112 [[package]]
113113 name = "async-lock"
114 version = "2.5.0"
115 source = "registry+https://github.com/rust-lang/crates.io-index"
116 checksum = "e97a171d191782fba31bb902b14ad94e24a68145032b7eedf871ab0bc0d077b6"
114 version = "2.6.0"
115 source = "registry+https://github.com/rust-lang/crates.io-index"
116 checksum = "c8101efe8695a6c17e02911402145357e718ac92d3ff88ae8419e84b1707b685"
117117 dependencies = [
118118 "event-listener",
119 ]
120
121 [[package]]
122 name = "async-mutex"
123 version = "1.4.0"
124 source = "registry+https://github.com/rust-lang/crates.io-index"
125 checksum = "479db852db25d9dbf6204e6cb6253698f175c15726470f78af0d918e99d6156e"
126 dependencies = [
127 "event-listener",
119 "futures-lite",
128120 ]
129121
130122 [[package]]
138130
139131 [[package]]
140132 name = "async-process"
141 version = "1.4.0"
142 source = "registry+https://github.com/rust-lang/crates.io-index"
143 checksum = "cf2c06e30a24e8c78a3987d07f0930edf76ef35e027e7bdb063fccafdad1f60c"
133 version = "1.5.0"
134 source = "registry+https://github.com/rust-lang/crates.io-index"
135 checksum = "02111fd8655a613c25069ea89fc8d9bb89331fa77486eb3bc059ee757cfa481c"
144136 dependencies = [
145137 "async-io",
138 "autocfg",
146139 "blocking",
147140 "cfg-if",
148141 "event-listener",
155148
156149 [[package]]
157150 name = "async-std"
158 version = "1.11.0"
159 source = "registry+https://github.com/rust-lang/crates.io-index"
160 checksum = "52580991739c5cdb36cde8b2a516371c0a3b70dda36d916cc08b82372916808c"
151 version = "1.12.0"
152 source = "registry+https://github.com/rust-lang/crates.io-index"
153 checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
161154 dependencies = [
162155 "async-channel",
163156 "async-global-executor",
173166 "kv-log-macro",
174167 "log",
175168 "memchr",
176 "num_cpus",
177169 "once_cell",
178170 "pin-project-lite",
179171 "pin-utils",
183175
184176 [[package]]
185177 name = "async-task"
186 version = "4.2.0"
187 source = "registry+https://github.com/rust-lang/crates.io-index"
188 checksum = "30696a84d817107fc028e049980e09d5e140e8da8f1caeb17e8e950658a3cea9"
178 version = "4.3.0"
179 source = "registry+https://github.com/rust-lang/crates.io-index"
180 checksum = "7a40729d2133846d9ed0ea60a8b9541bccddab49cd30f0715a1da672fe9a2524"
189181
190182 [[package]]
191183 name = "async-trait"
192 version = "0.1.53"
193 source = "registry+https://github.com/rust-lang/crates.io-index"
194 checksum = "ed6aa3524a2dfcf9fe180c51eae2b58738348d819517ceadf95789c51fff7600"
184 version = "0.1.58"
185 source = "registry+https://github.com/rust-lang/crates.io-index"
186 checksum = "1e805d94e6b5001b651426cf4cd446b1ab5f319d27bab5c644f61de0a804360c"
195187 dependencies = [
196188 "proc-macro2",
197189 "quote",
223215
224216 [[package]]
225217 name = "base64"
226 version = "0.13.0"
227 source = "registry+https://github.com/rust-lang/crates.io-index"
228 checksum = "904dfeac50f3cdaba28fc6f57fdcddb75f49ed61346676a78c4ffe55877802fd"
218 version = "0.13.1"
219 source = "registry+https://github.com/rust-lang/crates.io-index"
220 checksum = "9e1b586273c5702936fe7b7d6896644d8be71e6314cfe09d3167c95f712589e8"
229221
230222 [[package]]
231223 name = "basic-cookies"
240232
241233 [[package]]
242234 name = "bit-set"
243 version = "0.5.2"
244 source = "registry+https://github.com/rust-lang/crates.io-index"
245 checksum = "6e11e16035ea35e4e5997b393eacbf6f63983188f7a2ad25bfb13465f5ad59de"
235 version = "0.5.3"
236 source = "registry+https://github.com/rust-lang/crates.io-index"
237 checksum = "0700ddab506f33b20a03b13996eccd309a48e5ff77d0d95926aa0210fb4e95f1"
246238 dependencies = [
247239 "bit-vec",
248240 ]
275267
276268 [[package]]
277269 name = "bstr"
278 version = "0.2.17"
279 source = "registry+https://github.com/rust-lang/crates.io-index"
280 checksum = "ba3569f383e8f1598449f1a423e72e99569137b47740b1da11ef19af3d5c3223"
281 dependencies = [
282 "lazy_static",
270 version = "1.0.1"
271 source = "registry+https://github.com/rust-lang/crates.io-index"
272 checksum = "fca0852af221f458706eb0725c03e4ed6c46af9ac98e6a689d5e634215d594dd"
273 dependencies = [
283274 "memchr",
275 "once_cell",
284276 "regex-automata",
277 "serde",
285278 ]
286279
287280 [[package]]
288281 name = "bumpalo"
289 version = "3.9.1"
290 source = "registry+https://github.com/rust-lang/crates.io-index"
291 checksum = "a4a45a46ab1f2412e53d3a0ade76ffad2025804294569aae387231a0cd6e0899"
282 version = "3.11.1"
283 source = "registry+https://github.com/rust-lang/crates.io-index"
284 checksum = "572f695136211188308f16ad2ca5c851a712c464060ae6974944458eb83880ba"
292285
293286 [[package]]
294287 name = "byteorder"
298291
299292 [[package]]
300293 name = "bytes"
301 version = "1.1.0"
302 source = "registry+https://github.com/rust-lang/crates.io-index"
303 checksum = "c4872d67bab6358e59559027aa3b9157c53d9358c51423c17554809a8858e0f8"
294 version = "1.2.1"
295 source = "registry+https://github.com/rust-lang/crates.io-index"
296 checksum = "ec8a7b6a70fde80372154c65702f00a0f56f3e1c36abbc6c440484be248856db"
304297
305298 [[package]]
306299 name = "cache-padded"
316309
317310 [[package]]
318311 name = "cc"
319 version = "1.0.73"
320 source = "registry+https://github.com/rust-lang/crates.io-index"
321 checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11"
312 version = "1.0.76"
313 source = "registry+https://github.com/rust-lang/crates.io-index"
314 checksum = "76a284da2e6fe2092f2353e51713435363112dfd60030e22add80be333fb928f"
322315
323316 [[package]]
324317 name = "cfg-if"
328321
329322 [[package]]
330323 name = "clap"
331 version = "3.1.18"
332 source = "registry+https://github.com/rust-lang/crates.io-index"
333 checksum = "d2dbdf4bdacb33466e854ce889eee8dfd5729abf7ccd7664d0a2d60cd384440b"
324 version = "4.0.26"
325 source = "registry+https://github.com/rust-lang/crates.io-index"
326 checksum = "2148adefda54e14492fb9bddcc600b4344c5d1a3123bd666dcb939c6f0e0e57e"
334327 dependencies = [
335328 "atty",
336329 "bitflags",
337330 "clap_lex",
338 "indexmap",
339 "lazy_static",
331 "once_cell",
340332 "strsim",
341333 "termcolor",
342 "terminal_size",
343 "textwrap",
334 "terminal_size 0.2.2",
344335 ]
345336
346337 [[package]]
347338 name = "clap_complete"
348 version = "3.1.4"
349 source = "registry+https://github.com/rust-lang/crates.io-index"
350 checksum = "da92e6facd8d73c22745a5d3cbb59bdf8e46e3235c923e516527d8e81eec14a4"
339 version = "4.0.5"
340 source = "registry+https://github.com/rust-lang/crates.io-index"
341 checksum = "96b0fba905b035a30d25c1b585bf1171690712fbb0ad3ac47214963aa4acc36c"
351342 dependencies = [
352343 "clap",
353344 ]
354345
355346 [[package]]
356347 name = "clap_lex"
357 version = "0.2.0"
358 source = "registry+https://github.com/rust-lang/crates.io-index"
359 checksum = "a37c35f1112dad5e6e0b1adaff798507497a18fceeb30cceb3bae7d1427b9213"
348 version = "0.3.0"
349 source = "registry+https://github.com/rust-lang/crates.io-index"
350 checksum = "0d4198f73e42b4936b35b5bb248d81d2b595ecb170da0bac7655c54eedfa8da8"
360351 dependencies = [
361352 "os_str_bytes",
362353 ]
363354
364355 [[package]]
365356 name = "concurrent-queue"
366 version = "1.2.2"
367 source = "registry+https://github.com/rust-lang/crates.io-index"
368 checksum = "30ed07550be01594c6026cff2a1d7fe9c8f683caa798e12b68694ac9e88286a3"
357 version = "1.2.4"
358 source = "registry+https://github.com/rust-lang/crates.io-index"
359 checksum = "af4780a44ab5696ea9e28294517f1fffb421a83a25af521333c838635509db9c"
369360 dependencies = [
370361 "cache-padded",
371362 ]
372363
373364 [[package]]
365 name = "concurrent-queue"
366 version = "2.0.0"
367 source = "registry+https://github.com/rust-lang/crates.io-index"
368 checksum = "bd7bef69dc86e3c610e4e7aed41035e2a7ed12e72dd7530f61327a6579a4390b"
369 dependencies = [
370 "crossbeam-utils",
371 ]
372
373 [[package]]
374374 name = "console"
375 version = "0.15.0"
376 source = "registry+https://github.com/rust-lang/crates.io-index"
377 checksum = "a28b32d32ca44b70c3e4acd7db1babf555fa026e385fb95f18028f88848b3c31"
375 version = "0.15.2"
376 source = "registry+https://github.com/rust-lang/crates.io-index"
377 checksum = "c050367d967ced717c04b65d8c619d863ef9292ce0c5760028655a2fb298718c"
378378 dependencies = [
379379 "encode_unicode",
380 "libc",
381 "once_cell",
382 "regex",
383 "terminal_size",
380 "lazy_static",
381 "libc",
382 "terminal_size 0.1.17",
384383 "unicode-width",
385384 "winapi",
386385 ]
409408
410409 [[package]]
411410 name = "crossbeam-utils"
412 version = "0.8.8"
413 source = "registry+https://github.com/rust-lang/crates.io-index"
414 checksum = "0bf124c720b7686e3c2663cf54062ab0f68a88af2fb6a030e87e30bf721fcb38"
411 version = "0.8.12"
412 source = "registry+https://github.com/rust-lang/crates.io-index"
413 checksum = "edbafec5fa1f196ca66527c1b12c2ec4745ca14b50f1ad8f9f6f720b55d11fac"
415414 dependencies = [
416415 "cfg-if",
417 "lazy_static",
418416 ]
419417
420418 [[package]]
421419 name = "crossterm"
422 version = "0.23.2"
423 source = "registry+https://github.com/rust-lang/crates.io-index"
424 checksum = "a2102ea4f781910f8a5b98dd061f4c2023f479ce7bb1236330099ceb5a93cf17"
420 version = "0.25.0"
421 source = "registry+https://github.com/rust-lang/crates.io-index"
422 checksum = "e64e6c0fbe2c17357405f7c758c1ef960fce08bdfb2c03d88d2a18d7e09c4b67"
425423 dependencies = [
426424 "bitflags",
427425 "crossterm_winapi",
477475
478476 [[package]]
479477 name = "ctor"
480 version = "0.1.22"
481 source = "registry+https://github.com/rust-lang/crates.io-index"
482 checksum = "f877be4f7c9f246b183111634f75baa039715e3f46ce860677d3b19a69fb229c"
478 version = "0.1.26"
479 source = "registry+https://github.com/rust-lang/crates.io-index"
480 checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
483481 dependencies = [
484482 "quote",
485483 "syn",
487485
488486 [[package]]
489487 name = "ctrlc"
490 version = "3.2.2"
491 source = "registry+https://github.com/rust-lang/crates.io-index"
492 checksum = "b37feaa84e6861e00a1f5e5aa8da3ee56d605c9992d33e082786754828e20865"
488 version = "3.2.3"
489 source = "registry+https://github.com/rust-lang/crates.io-index"
490 checksum = "1d91974fbbe88ec1df0c24a4f00f99583667a7e2e6272b2b92d294d81e462173"
493491 dependencies = [
494492 "nix",
495493 "winapi",
497495
498496 [[package]]
499497 name = "curl"
500 version = "0.4.43"
501 source = "registry+https://github.com/rust-lang/crates.io-index"
502 checksum = "37d855aeef205b43f65a5001e0997d81f8efca7badad4fad7d897aa7f0d0651f"
498 version = "0.4.44"
499 source = "registry+https://github.com/rust-lang/crates.io-index"
500 checksum = "509bd11746c7ac09ebd19f0b17782eae80aadee26237658a6b4808afb5c11a22"
503501 dependencies = [
504502 "curl-sys",
505503 "libc",
512510
513511 [[package]]
514512 name = "curl-sys"
515 version = "0.4.54+curl-7.83.0"
516 source = "registry+https://github.com/rust-lang/crates.io-index"
517 checksum = "25debbc3365c3e7ee79e30918df5759e84dbd4485807a18829188abf1786ec4e"
513 version = "0.4.59+curl-7.86.0"
514 source = "registry+https://github.com/rust-lang/crates.io-index"
515 checksum = "6cfce34829f448b08f55b7db6d0009e23e2e86a34e8c2b366269bf5799b4a407"
518516 dependencies = [
519517 "cc",
520518 "libc",
541539
542540 [[package]]
543541 name = "diff"
544 version = "0.1.12"
545 source = "registry+https://github.com/rust-lang/crates.io-index"
546 checksum = "0e25ea47919b1560c4e3b7fe0aaab9becf5b84a10325ddf7db0f0ba5e1026499"
542 version = "0.1.13"
543 source = "registry+https://github.com/rust-lang/crates.io-index"
544 checksum = "56254986775e3233ffa9c4d7d3faaf6d36a2c09d30b20687e9f88bc8bafc16c8"
547545
548546 [[package]]
549547 name = "difflib"
621619
622620 [[package]]
623621 name = "either"
624 version = "1.6.1"
625 source = "registry+https://github.com/rust-lang/crates.io-index"
626 checksum = "e78d4f1cc4ae33bbfc157ed5d5a5ef3bc29227303d595861deb238fcec4e9457"
622 version = "1.8.0"
623 source = "registry+https://github.com/rust-lang/crates.io-index"
624 checksum = "90e5c1c8368803113bf0c9584fc495a58b86dc8a29edbf8fe877d21d9507e797"
627625
628626 [[package]]
629627 name = "ena"
651649
652650 [[package]]
653651 name = "env_logger"
654 version = "0.9.0"
655 source = "registry+https://github.com/rust-lang/crates.io-index"
656 checksum = "0b2cf0344971ee6c64c31be0d530793fba457d322dfec2810c453d0ef228f9c3"
652 version = "0.9.3"
653 source = "registry+https://github.com/rust-lang/crates.io-index"
654 checksum = "a12e6657c4c97ebab115a42dcee77225f7f482cdd841cf7088c657a42e9e00e7"
657655 dependencies = [
658656 "atty",
659657 "humantime",
663661 ]
664662
665663 [[package]]
664 name = "errno"
665 version = "0.2.8"
666 source = "registry+https://github.com/rust-lang/crates.io-index"
667 checksum = "f639046355ee4f37944e44f60642c6f3a7efa3cf6b78c78a0d989a8ce6c396a1"
668 dependencies = [
669 "errno-dragonfly",
670 "libc",
671 "winapi",
672 ]
673
674 [[package]]
675 name = "errno-dragonfly"
676 version = "0.1.2"
677 source = "registry+https://github.com/rust-lang/crates.io-index"
678 checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
679 dependencies = [
680 "cc",
681 "libc",
682 ]
683
684 [[package]]
666685 name = "event-listener"
667 version = "2.5.2"
668 source = "registry+https://github.com/rust-lang/crates.io-index"
669 checksum = "77f3309417938f28bf8228fcff79a4a37103981e3e186d2ccd19c74b38f4eb71"
686 version = "2.5.3"
687 source = "registry+https://github.com/rust-lang/crates.io-index"
688 checksum = "0206175f82b8d6bf6652ff7d71a1e27fd2e4efde587fd368662814d6ec1d9ce0"
670689
671690 [[package]]
672691 name = "fastrand"
673 version = "1.7.0"
674 source = "registry+https://github.com/rust-lang/crates.io-index"
675 checksum = "c3fcf0cee53519c866c09b5de1f6c56ff9d647101f81c1964fa632e148896cdf"
692 version = "1.8.0"
693 source = "registry+https://github.com/rust-lang/crates.io-index"
694 checksum = "a7a407cfaa3385c4ae6b23e84623d48c2798d06e3e6a1878f7f59f17b3f86499"
676695 dependencies = [
677696 "instant",
678697 ]
716735
717736 [[package]]
718737 name = "fixedbitset"
719 version = "0.4.1"
720 source = "registry+https://github.com/rust-lang/crates.io-index"
721 checksum = "279fb028e20b3c4c320317955b77c5e0c9701f05a1d309905d6fc702cdc5053e"
738 version = "0.4.2"
739 source = "registry+https://github.com/rust-lang/crates.io-index"
740 checksum = "0ce7134b9999ecaf8bcd65542e436736ef32ddca1b3e06094cb6ec5755203b80"
722741
723742 [[package]]
724743 name = "float-cmp"
752771
753772 [[package]]
754773 name = "form_urlencoded"
755 version = "1.0.1"
756 source = "registry+https://github.com/rust-lang/crates.io-index"
757 checksum = "5fc25a87fa4fd2094bffb06925852034d90a17f0d1e05197d4956d3555752191"
758 dependencies = [
759 "matches",
774 version = "1.1.0"
775 source = "registry+https://github.com/rust-lang/crates.io-index"
776 checksum = "a9c384f161156f5260c24a097c56119f9be8c798586aecc13afbcbe7b7e26bf8"
777 dependencies = [
760778 "percent-encoding",
761779 ]
762780
772790
773791 [[package]]
774792 name = "futures"
775 version = "0.3.21"
776 source = "registry+https://github.com/rust-lang/crates.io-index"
777 checksum = "f73fe65f54d1e12b726f517d3e2135ca3125a437b6d998caf1962961f7172d9e"
793 version = "0.3.25"
794 source = "registry+https://github.com/rust-lang/crates.io-index"
795 checksum = "38390104763dc37a5145a53c29c63c1290b5d316d6086ec32c293f6736051bb0"
778796 dependencies = [
779797 "futures-channel",
780798 "futures-core",
787805
788806 [[package]]
789807 name = "futures-channel"
790 version = "0.3.21"
791 source = "registry+https://github.com/rust-lang/crates.io-index"
792 checksum = "c3083ce4b914124575708913bca19bfe887522d6e2e6d0952943f5eac4a74010"
808 version = "0.3.25"
809 source = "registry+https://github.com/rust-lang/crates.io-index"
810 checksum = "52ba265a92256105f45b719605a571ffe2d1f0fea3807304b522c1d778f79eed"
793811 dependencies = [
794812 "futures-core",
795813 "futures-sink",
797815
798816 [[package]]
799817 name = "futures-core"
800 version = "0.3.21"
801 source = "registry+https://github.com/rust-lang/crates.io-index"
802 checksum = "0c09fd04b7e4073ac7156a9539b57a484a8ea920f79c7c675d05d289ab6110d3"
818 version = "0.3.25"
819 source = "registry+https://github.com/rust-lang/crates.io-index"
820 checksum = "04909a7a7e4633ae6c4a9ab280aeb86da1236243a77b694a49eacd659a4bd3ac"
803821
804822 [[package]]
805823 name = "futures-executor"
806 version = "0.3.21"
807 source = "registry+https://github.com/rust-lang/crates.io-index"
808 checksum = "9420b90cfa29e327d0429f19be13e7ddb68fa1cccb09d65e5706b8c7a749b8a6"
824 version = "0.3.25"
825 source = "registry+https://github.com/rust-lang/crates.io-index"
826 checksum = "7acc85df6714c176ab5edf386123fafe217be88c0840ec11f199441134a074e2"
809827 dependencies = [
810828 "futures-core",
811829 "futures-task",
814832
815833 [[package]]
816834 name = "futures-io"
817 version = "0.3.21"
818 source = "registry+https://github.com/rust-lang/crates.io-index"
819 checksum = "fc4045962a5a5e935ee2fdedaa4e08284547402885ab326734432bed5d12966b"
835 version = "0.3.25"
836 source = "registry+https://github.com/rust-lang/crates.io-index"
837 checksum = "00f5fb52a06bdcadeb54e8d3671f8888a39697dcb0b81b23b55174030427f4eb"
820838
821839 [[package]]
822840 name = "futures-lite"
835853
836854 [[package]]
837855 name = "futures-macro"
838 version = "0.3.21"
839 source = "registry+https://github.com/rust-lang/crates.io-index"
840 checksum = "33c1e13800337f4d4d7a316bf45a567dbcb6ffe087f16424852d97e97a91f512"
856 version = "0.3.25"
857 source = "registry+https://github.com/rust-lang/crates.io-index"
858 checksum = "bdfb8ce053d86b91919aad980c220b1fb8401a9394410e1c289ed7e66b61835d"
841859 dependencies = [
842860 "proc-macro2",
843861 "quote",
846864
847865 [[package]]
848866 name = "futures-sink"
849 version = "0.3.21"
850 source = "registry+https://github.com/rust-lang/crates.io-index"
851 checksum = "21163e139fa306126e6eedaf49ecdb4588f939600f0b1e770f4205ee4b7fa868"
867 version = "0.3.25"
868 source = "registry+https://github.com/rust-lang/crates.io-index"
869 checksum = "39c15cf1a4aa79df40f1bb462fb39676d0ad9e366c2a33b590d7c66f4f81fcf9"
852870
853871 [[package]]
854872 name = "futures-task"
855 version = "0.3.21"
856 source = "registry+https://github.com/rust-lang/crates.io-index"
857 checksum = "57c66a976bf5909d801bbef33416c41372779507e7a6b3a5e25e4749c58f776a"
873 version = "0.3.25"
874 source = "registry+https://github.com/rust-lang/crates.io-index"
875 checksum = "2ffb393ac5d9a6eaa9d3fdf37ae2776656b706e200c8e16b1bdb227f5198e6ea"
858876
859877 [[package]]
860878 name = "futures-util"
861 version = "0.3.21"
862 source = "registry+https://github.com/rust-lang/crates.io-index"
863 checksum = "d8b7abd5d659d9b90c8cba917f6ec750a74e2dc23902ef9cd4cc8c8b22e6036a"
879 version = "0.3.25"
880 source = "registry+https://github.com/rust-lang/crates.io-index"
881 checksum = "197676987abd2f9cadff84926f410af1c183608d36641465df73ae8211dc65d6"
864882 dependencies = [
865883 "futures-channel",
866884 "futures-core",
911929
912930 [[package]]
913931 name = "getrandom"
914 version = "0.2.6"
915 source = "registry+https://github.com/rust-lang/crates.io-index"
916 checksum = "9be70c98951c83b8d2f8f60d7065fa6d5146873094452a1008da8c2f1e4205ad"
932 version = "0.2.8"
933 source = "registry+https://github.com/rust-lang/crates.io-index"
934 checksum = "c05aeb6a22b8f62540c194aac980f2115af067bfe15a0734d7277a768d396b31"
917935 dependencies = [
918936 "cfg-if",
919937 "libc",
920 "wasi 0.10.2+wasi-snapshot-preview1",
938 "wasi 0.11.0+wasi-snapshot-preview1",
921939 ]
922940
923941 [[package]]
934952
935953 [[package]]
936954 name = "h2"
937 version = "0.3.13"
938 source = "registry+https://github.com/rust-lang/crates.io-index"
939 checksum = "37a82c6d637fc9515a4694bbf1cb2457b79d81ce52b3108bdeea58b07dd34a57"
955 version = "0.3.15"
956 source = "registry+https://github.com/rust-lang/crates.io-index"
957 checksum = "5f9f29bc9dda355256b2916cf526ab02ce0aeaaaf2bad60d65ef3f12f11dd0f4"
940958 dependencies = [
941959 "bytes",
942960 "fnv",
953971
954972 [[package]]
955973 name = "hashbrown"
956 version = "0.11.2"
957 source = "registry+https://github.com/rust-lang/crates.io-index"
958 checksum = "ab5ef0d4909ef3724cc8cce6ccc8572c5c817592e9285f5464f8e86f8bd3726e"
974 version = "0.12.3"
975 source = "registry+https://github.com/rust-lang/crates.io-index"
976 checksum = "8a9ee70c43aaf417c914396645a0fa852624801b24ebb7ae78fe8272889ac888"
959977
960978 [[package]]
961979 name = "hermit-abi"
9821000
9831001 [[package]]
9841002 name = "http"
985 version = "0.2.7"
986 source = "registry+https://github.com/rust-lang/crates.io-index"
987 checksum = "ff8670570af52249509a86f5e3e18a08c60b177071826898fde8997cf5f6bfbb"
1003 version = "0.2.8"
1004 source = "registry+https://github.com/rust-lang/crates.io-index"
1005 checksum = "75f43d41e26995c17e71ee126451dd3941010b0514a81a9d11f3b341debc2399"
9881006 dependencies = [
9891007 "bytes",
9901008 "fnv",
991 "itoa 1.0.1",
1009 "itoa 1.0.4",
9921010 ]
9931011
9941012 [[package]]
9951013 name = "http-body"
996 version = "0.4.4"
997 source = "registry+https://github.com/rust-lang/crates.io-index"
998 checksum = "1ff4f84919677303da5f147645dbea6b1881f368d03ac84e1dc09031ebd7b2c6"
1014 version = "0.4.5"
1015 source = "registry+https://github.com/rust-lang/crates.io-index"
1016 checksum = "d5f38f16d184e36f2408a55281cd658ecbd3ca05cce6d6510a176eca393e26d1"
9991017 dependencies = [
10001018 "bytes",
10011019 "http",
10041022
10051023 [[package]]
10061024 name = "httparse"
1007 version = "1.7.1"
1008 source = "registry+https://github.com/rust-lang/crates.io-index"
1009 checksum = "496ce29bb5a52785b44e0f7ca2847ae0bb839c9bd28f69acac9b99d461c0c04c"
1025 version = "1.8.0"
1026 source = "registry+https://github.com/rust-lang/crates.io-index"
1027 checksum = "d897f394bad6a705d5f4104762e116a75639e470d80901eed05a860a95cb1904"
10101028
10111029 [[package]]
10121030 name = "httpdate"
10501068
10511069 [[package]]
10521070 name = "hyper"
1053 version = "0.14.18"
1054 source = "registry+https://github.com/rust-lang/crates.io-index"
1055 checksum = "b26ae0a80afebe130861d90abf98e3814a4f28a4c6ffeb5ab8ebb2be311e0ef2"
1071 version = "0.14.23"
1072 source = "registry+https://github.com/rust-lang/crates.io-index"
1073 checksum = "034711faac9d2166cb1baf1a2fb0b60b1f277f8492fd72176c17f3515e1abd3c"
10561074 dependencies = [
10571075 "bytes",
10581076 "futures-channel",
10631081 "http-body",
10641082 "httparse",
10651083 "httpdate",
1066 "itoa 1.0.1",
1084 "itoa 1.0.4",
10671085 "pin-project-lite",
10681086 "socket2",
10691087 "tokio",
10871105
10881106 [[package]]
10891107 name = "idna"
1090 version = "0.2.3"
1091 source = "registry+https://github.com/rust-lang/crates.io-index"
1092 checksum = "418a0a6fab821475f634efe3ccc45c013f742efe03d853e8d3355d5cb850ecf8"
1093 dependencies = [
1094 "matches",
1108 version = "0.3.0"
1109 source = "registry+https://github.com/rust-lang/crates.io-index"
1110 checksum = "e14ddfc70884202db2244c223200c204c2bda1bc6e0998d11b5e024d657209e6"
1111 dependencies = [
10951112 "unicode-bidi",
10961113 "unicode-normalization",
10971114 ]
10981115
10991116 [[package]]
11001117 name = "indexmap"
1101 version = "1.8.1"
1102 source = "registry+https://github.com/rust-lang/crates.io-index"
1103 checksum = "0f647032dfaa1f8b6dc29bd3edb7bbef4861b8b8007ebb118d6db284fd59f6ee"
1118 version = "1.9.1"
1119 source = "registry+https://github.com/rust-lang/crates.io-index"
1120 checksum = "10a35a97730320ffe8e2d410b5d3b69279b98d2c14bdb8b70ea89ecf7888d41e"
11041121 dependencies = [
11051122 "autocfg",
11061123 "hashbrown",
11281145 ]
11291146
11301147 [[package]]
1148 name = "io-lifetimes"
1149 version = "0.7.5"
1150 source = "registry+https://github.com/rust-lang/crates.io-index"
1151 checksum = "59ce5ef949d49ee85593fc4d3f3f95ad61657076395cbbce23e2121fc5542074"
1152
1153 [[package]]
11311154 name = "ipnet"
1132 version = "2.5.0"
1133 source = "registry+https://github.com/rust-lang/crates.io-index"
1134 checksum = "879d54834c8c76457ef4293a689b2a8c59b076067ad77b15efafbb05f92a592b"
1155 version = "2.5.1"
1156 source = "registry+https://github.com/rust-lang/crates.io-index"
1157 checksum = "f88c5561171189e69df9d98bcf18fd5f9558300f7ea7b801eb8a0fd748bd8745"
11351158
11361159 [[package]]
11371160 name = "isahc"
1138 version = "1.7.1"
1139 source = "registry+https://github.com/rust-lang/crates.io-index"
1140 checksum = "480d9158c9977bff0bc024a11dcad04efcd3955c1e55301092b13fc439d41720"
1161 version = "1.7.2"
1162 source = "registry+https://github.com/rust-lang/crates.io-index"
1163 checksum = "334e04b4d781f436dc315cb1e7515bd96826426345d498149e4bde36b67f8ee9"
11411164 dependencies = [
11421165 "async-channel",
11431166 "castaway",
11621185
11631186 [[package]]
11641187 name = "itertools"
1165 version = "0.10.3"
1166 source = "registry+https://github.com/rust-lang/crates.io-index"
1167 checksum = "a9a9d19fa1e79b6215ff29b9d6880b706147f16e9b1dbb1e4e5947b5b02bc5e3"
1188 version = "0.10.5"
1189 source = "registry+https://github.com/rust-lang/crates.io-index"
1190 checksum = "b0fd2260e829bddf4cb6ea802289de2f86d6a7a690192fbe91b3f46e0f2c8473"
11681191 dependencies = [
11691192 "either",
11701193 ]
11771200
11781201 [[package]]
11791202 name = "itoa"
1180 version = "1.0.1"
1181 source = "registry+https://github.com/rust-lang/crates.io-index"
1182 checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35"
1203 version = "1.0.4"
1204 source = "registry+https://github.com/rust-lang/crates.io-index"
1205 checksum = "4217ad341ebadf8d8e724e264f13e593e0648f5b3e94b3896a5df283be015ecc"
11831206
11841207 [[package]]
11851208 name = "js-sys"
1186 version = "0.3.57"
1187 source = "registry+https://github.com/rust-lang/crates.io-index"
1188 checksum = "671a26f820db17c2a2750743f1dd03bafd15b98c9f30c7c2628c024c05d73397"
1209 version = "0.3.60"
1210 source = "registry+https://github.com/rust-lang/crates.io-index"
1211 checksum = "49409df3e3bf0856b916e2ceaca09ee28e6871cf7d9ce97a692cacfdb2a25a47"
11891212 dependencies = [
11901213 "wasm-bindgen",
11911214 ]
12391262
12401263 [[package]]
12411264 name = "leaky-bucket"
1242 version = "0.10.0"
1243 source = "registry+https://github.com/rust-lang/crates.io-index"
1244 checksum = "152656838516227a1aeeafa54e6c5997f5dbeb625d2ed01e0732b97bbca4574e"
1245 dependencies = [
1246 "futures-util",
1247 "lazy_static",
1248 "log",
1249 "thiserror",
1265 version = "0.12.1"
1266 source = "registry+https://github.com/rust-lang/crates.io-index"
1267 checksum = "28d6c39b1cdaa514a898cd9cfcfbdb03a220264fb9ee08931495291cdda3fe7e"
1268 dependencies = [
1269 "parking_lot",
12501270 "tokio",
1251 "tokio-stream",
1271 "tracing",
12521272 ]
12531273
12541274 [[package]]
12591279
12601280 [[package]]
12611281 name = "libc"
1262 version = "0.2.125"
1263 source = "registry+https://github.com/rust-lang/crates.io-index"
1264 checksum = "5916d2ae698f6de9bfb891ad7a8d65c09d232dc58cc4ac433c7da3b2fd84bc2b"
1282 version = "0.2.137"
1283 source = "registry+https://github.com/rust-lang/crates.io-index"
1284 checksum = "fc7fcc620a3bff7cdd7a365be3376c97191aeaccc2a603e600951e452615bf89"
12651285
12661286 [[package]]
12671287 name = "libnghttp2-sys"
12751295
12761296 [[package]]
12771297 name = "libz-sys"
1278 version = "1.1.6"
1279 source = "registry+https://github.com/rust-lang/crates.io-index"
1280 checksum = "92e7e15d7610cce1d9752e137625f14e61a28cd45929b6e12e47b50fe154ee2e"
1298 version = "1.1.8"
1299 source = "registry+https://github.com/rust-lang/crates.io-index"
1300 checksum = "9702761c3935f8cc2f101793272e202c72b99da8f4224a19ddcf1279a6450bbf"
12811301 dependencies = [
12821302 "cc",
12831303 "libc",
12861306 ]
12871307
12881308 [[package]]
1309 name = "linux-raw-sys"
1310 version = "0.0.46"
1311 source = "registry+https://github.com/rust-lang/crates.io-index"
1312 checksum = "d4d2456c373231a208ad294c33dc5bff30051eafd954cd4caae83a712b12854d"
1313
1314 [[package]]
12891315 name = "lock_api"
1290 version = "0.4.7"
1291 source = "registry+https://github.com/rust-lang/crates.io-index"
1292 checksum = "327fa5b6a6940e4699ec49a9beae1ea4845c6bab9314e4f84ac68742139d8c53"
1316 version = "0.4.9"
1317 source = "registry+https://github.com/rust-lang/crates.io-index"
1318 checksum = "435011366fe56583b16cf956f9df0095b405b82d76425bc8981c0e22e60ec4df"
12931319 dependencies = [
12941320 "autocfg",
12951321 "scopeguard",
13451371
13461372 [[package]]
13471373 name = "mio"
1348 version = "0.8.3"
1349 source = "registry+https://github.com/rust-lang/crates.io-index"
1350 checksum = "713d550d9b44d89174e066b7a6217ae06234c10cb47819a88290d2b353c31799"
1374 version = "0.8.5"
1375 source = "registry+https://github.com/rust-lang/crates.io-index"
1376 checksum = "e5d732bc30207a6423068df043e3d02e0735b155ad7ce1a6f76fe2baa5b158de"
13511377 dependencies = [
13521378 "libc",
13531379 "log",
13541380 "wasi 0.11.0+wasi-snapshot-preview1",
1355 "windows-sys",
1381 "windows-sys 0.42.0",
13561382 ]
13571383
13581384 [[package]]
13591385 name = "native-tls"
1360 version = "0.2.10"
1361 source = "registry+https://github.com/rust-lang/crates.io-index"
1362 checksum = "fd7e2f3618557f980e0b17e8856252eee3c97fa12c54dff0ca290fb6266ca4a9"
1386 version = "0.2.11"
1387 source = "registry+https://github.com/rust-lang/crates.io-index"
1388 checksum = "07226173c32f2926027b63cce4bcd8076c3552846cbe7925f3aaffeac0a3b92e"
13631389 dependencies = [
13641390 "lazy_static",
13651391 "libc",
13811407
13821408 [[package]]
13831409 name = "nix"
1384 version = "0.24.1"
1385 source = "registry+https://github.com/rust-lang/crates.io-index"
1386 checksum = "8f17df307904acd05aa8e32e97bb20f2a0df1728bbc2d771ae8f9a90463441e9"
1387 dependencies = [
1410 version = "0.25.0"
1411 source = "registry+https://github.com/rust-lang/crates.io-index"
1412 checksum = "e322c04a9e3440c327fca7b6c8a63e6890a32fa2ad689db972425f07e0d22abb"
1413 dependencies = [
1414 "autocfg",
13881415 "bitflags",
13891416 "cfg-if",
13901417 "libc",
14131440
14141441 [[package]]
14151442 name = "num_cpus"
1416 version = "1.13.1"
1417 source = "registry+https://github.com/rust-lang/crates.io-index"
1418 checksum = "19e64526ebdee182341572e50e9ad03965aa510cd94427a4549448f285e957a1"
1443 version = "1.14.0"
1444 source = "registry+https://github.com/rust-lang/crates.io-index"
1445 checksum = "f6058e64324c71e02bc2b150e4f3bc8286db6c83092132ffa3f6b1eab0f9def5"
14191446 dependencies = [
14201447 "hermit-abi",
14211448 "libc",
14291456
14301457 [[package]]
14311458 name = "once_cell"
1432 version = "1.10.0"
1433 source = "registry+https://github.com/rust-lang/crates.io-index"
1434 checksum = "87f3e037eac156d1775da914196f0f37741a274155e34a0b7e427c35d2a2ecb9"
1459 version = "1.16.0"
1460 source = "registry+https://github.com/rust-lang/crates.io-index"
1461 checksum = "86f0b0d4bf799edbc74508c1e8bf170ff5f41238e5f8225603ca7caaae2b7860"
14351462
14361463 [[package]]
14371464 name = "openssl"
1438 version = "0.10.40"
1439 source = "registry+https://github.com/rust-lang/crates.io-index"
1440 checksum = "fb81a6430ac911acb25fe5ac8f1d2af1b4ea8a4fdfda0f1ee4292af2e2d8eb0e"
1465 version = "0.10.42"
1466 source = "registry+https://github.com/rust-lang/crates.io-index"
1467 checksum = "12fc0523e3bd51a692c8850d075d74dc062ccf251c0110668cbd921917118a13"
14411468 dependencies = [
14421469 "bitflags",
14431470 "cfg-if",
14671494
14681495 [[package]]
14691496 name = "openssl-src"
1470 version = "111.18.0+1.1.1n"
1471 source = "registry+https://github.com/rust-lang/crates.io-index"
1472 checksum = "7897a926e1e8d00219127dc020130eca4292e5ca666dd592480d72c3eca2ff6c"
1497 version = "111.24.0+1.1.1s"
1498 source = "registry+https://github.com/rust-lang/crates.io-index"
1499 checksum = "3498f259dab01178c6228c6b00dcef0ed2a2d5e20d648c017861227773ea4abd"
14731500 dependencies = [
14741501 "cc",
14751502 ]
14761503
14771504 [[package]]
14781505 name = "openssl-sys"
1479 version = "0.9.73"
1480 source = "registry+https://github.com/rust-lang/crates.io-index"
1481 checksum = "9d5fd19fb3e0a8191c1e34935718976a3e70c112ab9a24af6d7cadccd9d90bc0"
1506 version = "0.9.77"
1507 source = "registry+https://github.com/rust-lang/crates.io-index"
1508 checksum = "b03b84c3b2d099b81f0953422b4d4ad58761589d0229b5506356afca05a3670a"
14821509 dependencies = [
14831510 "autocfg",
14841511 "cc",
14901517
14911518 [[package]]
14921519 name = "os_str_bytes"
1493 version = "6.0.0"
1494 source = "registry+https://github.com/rust-lang/crates.io-index"
1495 checksum = "8e22443d1643a904602595ba1cd8f7d896afe56d26712531c5ff73a15b2fbf64"
1520 version = "6.4.0"
1521 source = "registry+https://github.com/rust-lang/crates.io-index"
1522 checksum = "7b5bf27447411e9ee3ff51186bf7a08e16c341efdde93f4d823e8844429bed7e"
14961523
14971524 [[package]]
14981525 name = "parking"
15021529
15031530 [[package]]
15041531 name = "parking_lot"
1505 version = "0.12.0"
1506 source = "registry+https://github.com/rust-lang/crates.io-index"
1507 checksum = "87f5ec2493a61ac0506c0f4199f99070cbe83857b0337006a30f3e6719b8ef58"
1532 version = "0.12.1"
1533 source = "registry+https://github.com/rust-lang/crates.io-index"
1534 checksum = "3742b2c103b9f06bc9fff0a37ff4912935851bee6d36f3c02bcc755bcfec228f"
15081535 dependencies = [
15091536 "lock_api",
15101537 "parking_lot_core",
15121539
15131540 [[package]]
15141541 name = "parking_lot_core"
1515 version = "0.9.3"
1516 source = "registry+https://github.com/rust-lang/crates.io-index"
1517 checksum = "09a279cbf25cb0757810394fbc1e359949b59e348145c643a939a525692e6929"
1542 version = "0.9.4"
1543 source = "registry+https://github.com/rust-lang/crates.io-index"
1544 checksum = "4dc9e0dc2adc1c69d09143aff38d3d30c5c3f0df0dad82e6d25547af174ebec0"
15181545 dependencies = [
15191546 "cfg-if",
15201547 "libc",
15211548 "redox_syscall",
15221549 "smallvec",
1523 "windows-sys",
1550 "windows-sys 0.42.0",
15241551 ]
15251552
15261553 [[package]]
15271554 name = "percent-encoding"
1528 version = "2.1.0"
1529 source = "registry+https://github.com/rust-lang/crates.io-index"
1530 checksum = "d4fd5641d01c8f18a23da7b6fe29298ff4b55afcccdf78973b24cf3175fee32e"
1555 version = "2.2.0"
1556 source = "registry+https://github.com/rust-lang/crates.io-index"
1557 checksum = "478c572c3d73181ff3c2539045f6eb99e5491218eae919370993b890cdbdd98e"
15311558
15321559 [[package]]
15331560 name = "petgraph"
1534 version = "0.6.0"
1535 source = "registry+https://github.com/rust-lang/crates.io-index"
1536 checksum = "4a13a2fa9d0b63e5f22328828741e523766fff0ee9e779316902290dff3f824f"
1561 version = "0.6.2"
1562 source = "registry+https://github.com/rust-lang/crates.io-index"
1563 checksum = "e6d5014253a1331579ce62aa67443b4a658c5e7dd03d4bc6d302b94474888143"
15371564 dependencies = [
15381565 "fixedbitset",
15391566 "indexmap",
16391666
16401667 [[package]]
16411668 name = "pin-project"
1642 version = "1.0.10"
1643 source = "registry+https://github.com/rust-lang/crates.io-index"
1644 checksum = "58ad3879ad3baf4e44784bc6a718a8698867bb991f8ce24d1bcbe2cfb4c3a75e"
1669 version = "1.0.12"
1670 source = "registry+https://github.com/rust-lang/crates.io-index"
1671 checksum = "ad29a609b6bcd67fee905812e544992d216af9d755757c05ed2d0e15a74c6ecc"
16451672 dependencies = [
16461673 "pin-project-internal",
16471674 ]
16481675
16491676 [[package]]
16501677 name = "pin-project-internal"
1651 version = "1.0.10"
1652 source = "registry+https://github.com/rust-lang/crates.io-index"
1653 checksum = "744b6f092ba29c3650faf274db506afd39944f48420f6c86b17cfe0ee1cb36bb"
1678 version = "1.0.12"
1679 source = "registry+https://github.com/rust-lang/crates.io-index"
1680 checksum = "069bdb1e05adc7a8990dce9cc75370895fbe4e3d58b9b73bf1aee56359344a55"
16541681 dependencies = [
16551682 "proc-macro2",
16561683 "quote",
16711698
16721699 [[package]]
16731700 name = "pkg-config"
1674 version = "0.3.25"
1675 source = "registry+https://github.com/rust-lang/crates.io-index"
1676 checksum = "1df8c4ec4b0627e53bdf214615ad287367e482558cf84b109250b37464dc03ae"
1701 version = "0.3.26"
1702 source = "registry+https://github.com/rust-lang/crates.io-index"
1703 checksum = "6ac9a59f73473f1b8d852421e59e64809f025994837ef743615c6d0c5b305160"
16771704
16781705 [[package]]
16791706 name = "polling"
1680 version = "2.2.0"
1681 source = "registry+https://github.com/rust-lang/crates.io-index"
1682 checksum = "685404d509889fade3e86fe3a5803bca2ec09b0c0778d5ada6ec8bf7a8de5259"
1683 dependencies = [
1707 version = "2.4.0"
1708 source = "registry+https://github.com/rust-lang/crates.io-index"
1709 checksum = "ab4609a838d88b73d8238967b60dd115cc08d38e2bbaf51ee1e4b695f89122e2"
1710 dependencies = [
1711 "autocfg",
16841712 "cfg-if",
16851713 "libc",
16861714 "log",
16901718
16911719 [[package]]
16921720 name = "ppv-lite86"
1693 version = "0.2.16"
1694 source = "registry+https://github.com/rust-lang/crates.io-index"
1695 checksum = "eb9f9e6e233e5c4a35559a617bf40a4ec447db2e84c20b55a6f83167b7e57872"
1721 version = "0.2.17"
1722 source = "registry+https://github.com/rust-lang/crates.io-index"
1723 checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
16961724
16971725 [[package]]
16981726 name = "precomputed-hash"
17021730
17031731 [[package]]
17041732 name = "predicates"
1705 version = "2.1.1"
1706 source = "registry+https://github.com/rust-lang/crates.io-index"
1707 checksum = "a5aab5be6e4732b473071984b3164dbbfb7a3674d30ea5ff44410b6bcd960c3c"
1733 version = "2.1.3"
1734 source = "registry+https://github.com/rust-lang/crates.io-index"
1735 checksum = "ed6bd09a7f7e68f3f0bf710fb7ab9c4615a488b58b5f653382a687701e458c92"
17081736 dependencies = [
17091737 "difflib",
17101738 "float-cmp",
17161744
17171745 [[package]]
17181746 name = "predicates-core"
1719 version = "1.0.3"
1720 source = "registry+https://github.com/rust-lang/crates.io-index"
1721 checksum = "da1c2388b1513e1b605fcec39a95e0a9e8ef088f71443ef37099fa9ae6673fcb"
1747 version = "1.0.5"
1748 source = "registry+https://github.com/rust-lang/crates.io-index"
1749 checksum = "72f883590242d3c6fc5bf50299011695fa6590c2c70eac95ee1bdb9a733ad1a2"
17221750
17231751 [[package]]
17241752 name = "predicates-tree"
1725 version = "1.0.5"
1726 source = "registry+https://github.com/rust-lang/crates.io-index"
1727 checksum = "4d86de6de25020a36c6d3643a86d9a6a9f552107c0559c60ea03551b5e16c032"
1753 version = "1.0.7"
1754 source = "registry+https://github.com/rust-lang/crates.io-index"
1755 checksum = "54ff541861505aabf6ea722d2131ee980b8276e10a1297b94e896dd8b621850d"
17281756 dependencies = [
17291757 "predicates-core",
17301758 "termtree",
17381766
17391767 [[package]]
17401768 name = "proc-macro2"
1741 version = "1.0.38"
1742 source = "registry+https://github.com/rust-lang/crates.io-index"
1743 checksum = "9027b48e9d4c9175fa2218adf3557f91c1137021739951d4932f5f8268ac48aa"
1744 dependencies = [
1745 "unicode-xid",
1769 version = "1.0.47"
1770 source = "registry+https://github.com/rust-lang/crates.io-index"
1771 checksum = "5ea3d908b0e36316caf9e9e2c4625cdde190a7e6f440d794667ed17a1855e725"
1772 dependencies = [
1773 "unicode-ident",
17461774 ]
17471775
17481776 [[package]]
17491777 name = "quote"
1750 version = "1.0.18"
1751 source = "registry+https://github.com/rust-lang/crates.io-index"
1752 checksum = "a1feb54ed693b93a84e14094943b84b7c4eae204c512b7ccb95ab0c66d278ad1"
1778 version = "1.0.21"
1779 source = "registry+https://github.com/rust-lang/crates.io-index"
1780 checksum = "bbe448f377a7d6961e30f5955f9b8d106c3f5e449d493ee1b125c1d43c2b5179"
17531781 dependencies = [
17541782 "proc-macro2",
17551783 ]
17761804 dependencies = [
17771805 "libc",
17781806 "rand_chacha 0.3.1",
1779 "rand_core 0.6.3",
1807 "rand_core 0.6.4",
17801808 ]
17811809
17821810 [[package]]
17961824 checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88"
17971825 dependencies = [
17981826 "ppv-lite86",
1799 "rand_core 0.6.3",
1827 "rand_core 0.6.4",
18001828 ]
18011829
18021830 [[package]]
18101838
18111839 [[package]]
18121840 name = "rand_core"
1813 version = "0.6.3"
1814 source = "registry+https://github.com/rust-lang/crates.io-index"
1815 checksum = "d34f1408f55294453790c48b2f1ebbb1c5b4b7563eb1f418bcfcfdbb06ebb4e7"
1816 dependencies = [
1817 "getrandom 0.2.6",
1841 version = "0.6.4"
1842 source = "registry+https://github.com/rust-lang/crates.io-index"
1843 checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c"
1844 dependencies = [
1845 "getrandom 0.2.8",
18181846 ]
18191847
18201848 [[package]]
18371865
18381866 [[package]]
18391867 name = "redox_syscall"
1840 version = "0.2.13"
1841 source = "registry+https://github.com/rust-lang/crates.io-index"
1842 checksum = "62f25bc4c7e55e0b0b7a1d43fb893f4fa1361d0abe38b9ce4f323c2adfe6ef42"
1868 version = "0.2.16"
1869 source = "registry+https://github.com/rust-lang/crates.io-index"
1870 checksum = "fb5a58c1855b4b6819d59012155603f0b22ad30cad752600aadfcb695265519a"
18431871 dependencies = [
18441872 "bitflags",
18451873 ]
18501878 source = "registry+https://github.com/rust-lang/crates.io-index"
18511879 checksum = "b033d837a7cf162d7993aded9304e30a83213c648b6e389db233191f891e5c2b"
18521880 dependencies = [
1853 "getrandom 0.2.6",
1881 "getrandom 0.2.8",
18541882 "redox_syscall",
18551883 "thiserror",
18561884 ]
18571885
18581886 [[package]]
18591887 name = "regex"
1860 version = "1.5.5"
1861 source = "registry+https://github.com/rust-lang/crates.io-index"
1862 checksum = "1a11647b6b25ff05a515cb92c365cec08801e83423a235b51e231e1808747286"
1888 version = "1.7.0"
1889 source = "registry+https://github.com/rust-lang/crates.io-index"
1890 checksum = "e076559ef8e241f2ae3479e36f97bd5741c0330689e217ad51ce2c76808b868a"
18631891 dependencies = [
18641892 "aho-corasick",
18651893 "memchr",
18741902
18751903 [[package]]
18761904 name = "regex-syntax"
1877 version = "0.6.25"
1878 source = "registry+https://github.com/rust-lang/crates.io-index"
1879 checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
1905 version = "0.6.28"
1906 source = "registry+https://github.com/rust-lang/crates.io-index"
1907 checksum = "456c603be3e8d448b072f410900c09faf164fbce2d480456f50eea6e25f9c848"
18801908
18811909 [[package]]
18821910 name = "remove_dir_all"
18891917
18901918 [[package]]
18911919 name = "reqwest"
1892 version = "0.11.10"
1893 source = "registry+https://github.com/rust-lang/crates.io-index"
1894 checksum = "46a1f7aa4f35e5e8b4160449f51afc758f0ce6454315a9fa7d0d113e958c41eb"
1920 version = "0.11.13"
1921 source = "registry+https://github.com/rust-lang/crates.io-index"
1922 checksum = "68cc60575865c7831548863cc02356512e3f1dc2f3f82cb837d7fc4cc8f3c97c"
18951923 dependencies = [
18961924 "base64",
18971925 "bytes",
19051933 "hyper-tls",
19061934 "ipnet",
19071935 "js-sys",
1908 "lazy_static",
19091936 "log",
19101937 "mime",
19111938 "native-tls",
1939 "once_cell",
19121940 "percent-encoding",
19131941 "pin-project-lite",
19141942 "serde",
19171945 "tokio",
19181946 "tokio-native-tls",
19191947 "tokio-socks",
1948 "tower-service",
19201949 "url",
19211950 "wasm-bindgen",
19221951 "wasm-bindgen-futures",
19431972 ]
19441973
19451974 [[package]]
1975 name = "rustix"
1976 version = "0.35.13"
1977 source = "registry+https://github.com/rust-lang/crates.io-index"
1978 checksum = "727a1a6d65f786ec22df8a81ca3121107f235970dc1705ed681d3e6e8b9cd5f9"
1979 dependencies = [
1980 "bitflags",
1981 "errno",
1982 "io-lifetimes",
1983 "libc",
1984 "linux-raw-sys",
1985 "windows-sys 0.42.0",
1986 ]
1987
1988 [[package]]
19461989 name = "rustversion"
1947 version = "1.0.6"
1948 source = "registry+https://github.com/rust-lang/crates.io-index"
1949 checksum = "f2cc38e8fa666e2de3c4aba7edeb5ffc5246c1c2ed0e3d17e560aeeba736b23f"
1990 version = "1.0.9"
1991 source = "registry+https://github.com/rust-lang/crates.io-index"
1992 checksum = "97477e48b4cf8603ad5f7aaf897467cf42ab4218a38ef76fb14c2d6773a6d6a8"
19501993
19511994 [[package]]
19521995 name = "ryu"
1953 version = "1.0.9"
1954 source = "registry+https://github.com/rust-lang/crates.io-index"
1955 checksum = "73b4b750c782965c211b42f022f59af1fbceabdd026623714f104152f1ec149f"
1996 version = "1.0.11"
1997 source = "registry+https://github.com/rust-lang/crates.io-index"
1998 checksum = "4501abdff3ae82a1c1b477a17252eb69cee9e66eb915c1abaa4f44d873df9f09"
19561999
19572000 [[package]]
19582001 name = "schannel"
1959 version = "0.1.19"
1960 source = "registry+https://github.com/rust-lang/crates.io-index"
1961 checksum = "8f05ba609c234e60bee0d547fe94a4c7e9da733d1c962cf6e59efa4cd9c8bc75"
2002 version = "0.1.20"
2003 source = "registry+https://github.com/rust-lang/crates.io-index"
2004 checksum = "88d6731146462ea25d9244b2ed5fd1d716d25c52e4d54aa4fb0f3c4e9854dbe2"
19622005 dependencies = [
19632006 "lazy_static",
1964 "winapi",
2007 "windows-sys 0.36.1",
19652008 ]
19662009
19672010 [[package]]
19882031
19892032 [[package]]
19902033 name = "security-framework"
1991 version = "2.6.1"
1992 source = "registry+https://github.com/rust-lang/crates.io-index"
1993 checksum = "2dc14f172faf8a0194a3aded622712b0de276821addc574fa54fc0a1167e10dc"
2034 version = "2.7.0"
2035 source = "registry+https://github.com/rust-lang/crates.io-index"
2036 checksum = "2bc1bb97804af6631813c55739f771071e0f2ed33ee20b68c86ec505d906356c"
19942037 dependencies = [
19952038 "bitflags",
19962039 "core-foundation",
20312074
20322075 [[package]]
20332076 name = "semver"
2034 version = "1.0.9"
2035 source = "registry+https://github.com/rust-lang/crates.io-index"
2036 checksum = "8cb243bdfdb5936c8dc3c45762a19d12ab4550cdc753bc247637d4ec35a040fd"
2077 version = "1.0.14"
2078 source = "registry+https://github.com/rust-lang/crates.io-index"
2079 checksum = "e25dfac463d778e353db5be2449d1cce89bd6fd23c9f1ea21310ce6e5a1b29c4"
20372080
20382081 [[package]]
20392082 name = "serde"
2040 version = "1.0.137"
2041 source = "registry+https://github.com/rust-lang/crates.io-index"
2042 checksum = "61ea8d54c77f8315140a05f4c7237403bf38b72704d031543aa1d16abbf517d1"
2083 version = "1.0.147"
2084 source = "registry+https://github.com/rust-lang/crates.io-index"
2085 checksum = "d193d69bae983fc11a79df82342761dfbf28a99fc8d203dca4c3c1b590948965"
20432086 dependencies = [
20442087 "serde_derive",
20452088 ]
20462089
20472090 [[package]]
20482091 name = "serde_derive"
2049 version = "1.0.137"
2050 source = "registry+https://github.com/rust-lang/crates.io-index"
2051 checksum = "1f26faba0c3959972377d3b2d306ee9f71faee9714294e41bb777f83f88578be"
2092 version = "1.0.147"
2093 source = "registry+https://github.com/rust-lang/crates.io-index"
2094 checksum = "4f1d362ca8fc9c3e3a7484440752472d68a6caa98f1ab81d99b5dfe517cec852"
20522095 dependencies = [
20532096 "proc-macro2",
20542097 "quote",
20572100
20582101 [[package]]
20592102 name = "serde_json"
2060 version = "1.0.81"
2061 source = "registry+https://github.com/rust-lang/crates.io-index"
2062 checksum = "9b7ce2b32a1aed03c558dc61a5cd328f15aff2dbc17daad8fb8af04d2100e15c"
2063 dependencies = [
2064 "itoa 1.0.1",
2103 version = "1.0.87"
2104 source = "registry+https://github.com/rust-lang/crates.io-index"
2105 checksum = "6ce777b7b150d76b9cf60d28b55f5847135a003f7d7350c6be7a773508ce7d45"
2106 dependencies = [
2107 "itoa 1.0.4",
20652108 "ryu",
20662109 "serde",
20672110 ]
20832126 checksum = "d3491c14715ca2294c4d6a88f15e84739788c1d030eed8c110436aafdaa2f3fd"
20842127 dependencies = [
20852128 "form_urlencoded",
2086 "itoa 1.0.1",
2129 "itoa 1.0.4",
20872130 "ryu",
20882131 "serde",
20892132 ]
21002143
21012144 [[package]]
21022145 name = "signal-hook"
2103 version = "0.3.13"
2104 source = "registry+https://github.com/rust-lang/crates.io-index"
2105 checksum = "647c97df271007dcea485bb74ffdb57f2e683f1306c854f468a0c244badabf2d"
2146 version = "0.3.14"
2147 source = "registry+https://github.com/rust-lang/crates.io-index"
2148 checksum = "a253b5e89e2698464fc26b545c9edceb338e18a89effeeecfea192c3025be29d"
21062149 dependencies = [
21072150 "libc",
21082151 "signal-hook-registry",
21302173
21312174 [[package]]
21322175 name = "similar"
2133 version = "2.1.0"
2134 source = "registry+https://github.com/rust-lang/crates.io-index"
2135 checksum = "2e24979f63a11545f5f2c60141afe249d4f19f84581ea2138065e400941d83d3"
2176 version = "2.2.1"
2177 source = "registry+https://github.com/rust-lang/crates.io-index"
2178 checksum = "420acb44afdae038210c99e69aae24109f32f15500aa708e81d46c9f29d55fcf"
21362179
21372180 [[package]]
21382181 name = "siphasher"
21422185
21432186 [[package]]
21442187 name = "slab"
2145 version = "0.4.6"
2146 source = "registry+https://github.com/rust-lang/crates.io-index"
2147 checksum = "eb703cfe953bccee95685111adeedb76fabe4e97549a58d16f03ea7b9367bb32"
2188 version = "0.4.7"
2189 source = "registry+https://github.com/rust-lang/crates.io-index"
2190 checksum = "4614a76b2a8be0058caa9dbbaf66d988527d86d003c11a94fbd335d7661edcef"
2191 dependencies = [
2192 "autocfg",
2193 ]
21482194
21492195 [[package]]
21502196 name = "sluice"
21592205
21602206 [[package]]
21612207 name = "smallvec"
2162 version = "1.8.0"
2163 source = "registry+https://github.com/rust-lang/crates.io-index"
2164 checksum = "f2dd574626839106c320a323308629dcb1acfc96e32a8cba364ddc61ac23ee83"
2208 version = "1.10.0"
2209 source = "registry+https://github.com/rust-lang/crates.io-index"
2210 checksum = "a507befe795404456341dfab10cef66ead4c041f62b8b11bbb92bffe5d0953e0"
21652211
21662212 [[package]]
21672213 name = "socket2"
2168 version = "0.4.4"
2169 source = "registry+https://github.com/rust-lang/crates.io-index"
2170 checksum = "66d72b759436ae32898a2af0a14218dbf55efde3feeb170eb623637db85ee1e0"
2214 version = "0.4.7"
2215 source = "registry+https://github.com/rust-lang/crates.io-index"
2216 checksum = "02e2d2db9033d13a1567121ddd7a095ee144db4e1ca1b1bda3419bc0da294ebd"
21712217 dependencies = [
21722218 "libc",
21732219 "winapi",
22132259
22142260 [[package]]
22152261 name = "syn"
2216 version = "1.0.93"
2217 source = "registry+https://github.com/rust-lang/crates.io-index"
2218 checksum = "04066589568b72ec65f42d65a1a52436e954b168773148893c020269563decf2"
2262 version = "1.0.103"
2263 source = "registry+https://github.com/rust-lang/crates.io-index"
2264 checksum = "a864042229133ada95abf3b54fdc62ef5ccabe9515b64717bcb9a1919e59445d"
22192265 dependencies = [
22202266 "proc-macro2",
22212267 "quote",
2222 "unicode-xid",
2268 "unicode-ident",
22232269 ]
22242270
22252271 [[package]]
22782324 ]
22792325
22802326 [[package]]
2327 name = "terminal_size"
2328 version = "0.2.2"
2329 source = "registry+https://github.com/rust-lang/crates.io-index"
2330 checksum = "40ca90c434fd12083d1a6bdcbe9f92a14f96c8a1ba600ba451734ac334521f7a"
2331 dependencies = [
2332 "rustix",
2333 "windows-sys 0.42.0",
2334 ]
2335
2336 [[package]]
22812337 name = "termtree"
2282 version = "0.2.4"
2283 source = "registry+https://github.com/rust-lang/crates.io-index"
2284 checksum = "507e9898683b6c43a9aa55b64259b721b52ba226e0f3779137e50ad114a4c90b"
2285
2286 [[package]]
2287 name = "textwrap"
2288 version = "0.15.0"
2289 source = "registry+https://github.com/rust-lang/crates.io-index"
2290 checksum = "b1141d4d61095b28419e22cb0bbf02755f5e54e0526f97f1e3d1d160e60885fb"
2291 dependencies = [
2292 "terminal_size",
2293 ]
2338 version = "0.4.0"
2339 source = "registry+https://github.com/rust-lang/crates.io-index"
2340 checksum = "95059e91184749cb66be6dc994f67f182b6d897cb3df74a5bf66b5e709295fd8"
22942341
22952342 [[package]]
22962343 name = "thin-slice"
23002347
23012348 [[package]]
23022349 name = "thiserror"
2303 version = "1.0.31"
2304 source = "registry+https://github.com/rust-lang/crates.io-index"
2305 checksum = "bd829fe32373d27f76265620b5309d0340cb8550f523c1dda251d6298069069a"
2350 version = "1.0.37"
2351 source = "registry+https://github.com/rust-lang/crates.io-index"
2352 checksum = "10deb33631e3c9018b9baf9dcbbc4f737320d2b576bac10f6aefa048fa407e3e"
23062353 dependencies = [
23072354 "thiserror-impl",
23082355 ]
23092356
23102357 [[package]]
23112358 name = "thiserror-impl"
2312 version = "1.0.31"
2313 source = "registry+https://github.com/rust-lang/crates.io-index"
2314 checksum = "0396bc89e626244658bef819e22d0cc459e795a5ebe878e6ec336d1674a8d79a"
2359 version = "1.0.37"
2360 source = "registry+https://github.com/rust-lang/crates.io-index"
2361 checksum = "982d17546b47146b28f7c22e3d08465f6b8903d0ea13c1660d9d84a6e7adcdbb"
23152362 dependencies = [
23162363 "proc-macro2",
23172364 "quote",
23442391
23452392 [[package]]
23462393 name = "tokio"
2347 version = "1.18.2"
2348 source = "registry+https://github.com/rust-lang/crates.io-index"
2349 checksum = "4903bf0427cf68dddd5aa6a93220756f8be0c34fcfa9f5e6191e103e15a31395"
2350 dependencies = [
2394 version = "1.21.2"
2395 source = "registry+https://github.com/rust-lang/crates.io-index"
2396 checksum = "a9e03c497dc955702ba729190dc4aac6f2a0ce97f913e5b1b5912fc5039d9099"
2397 dependencies = [
2398 "autocfg",
23512399 "bytes",
23522400 "libc",
23532401 "memchr",
23542402 "mio",
23552403 "num_cpus",
2356 "once_cell",
23572404 "parking_lot",
23582405 "pin-project-lite",
23592406 "signal-hook-registry",
23642411
23652412 [[package]]
23662413 name = "tokio-macros"
2367 version = "1.7.0"
2368 source = "registry+https://github.com/rust-lang/crates.io-index"
2369 checksum = "b557f72f448c511a979e2564e55d74e6c4432fc96ff4f6241bc6bded342643b7"
2414 version = "1.8.0"
2415 source = "registry+https://github.com/rust-lang/crates.io-index"
2416 checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
23702417 dependencies = [
23712418 "proc-macro2",
23722419 "quote",
23962443 ]
23972444
23982445 [[package]]
2399 name = "tokio-stream"
2400 version = "0.1.8"
2401 source = "registry+https://github.com/rust-lang/crates.io-index"
2402 checksum = "50145484efff8818b5ccd256697f36863f587da82cf8b409c53adf1e840798e3"
2403 dependencies = [
2404 "futures-core",
2405 "pin-project-lite",
2406 "tokio",
2407 ]
2408
2409 [[package]]
24102446 name = "tokio-util"
2411 version = "0.7.1"
2412 source = "registry+https://github.com/rust-lang/crates.io-index"
2413 checksum = "0edfdeb067411dba2044da6d1cb2df793dd35add7888d73c16e3381ded401764"
2447 version = "0.7.4"
2448 source = "registry+https://github.com/rust-lang/crates.io-index"
2449 checksum = "0bb2e075f03b3d66d8d8785356224ba688d2906a371015e225beeb65ca92c740"
24142450 dependencies = [
24152451 "bytes",
24162452 "futures-core",
24312467
24322468 [[package]]
24332469 name = "tower-service"
2434 version = "0.3.1"
2435 source = "registry+https://github.com/rust-lang/crates.io-index"
2436 checksum = "360dfd1d6d30e05fda32ace2c8c70e9c0a9da713275777f5a4dbb8a1893930c6"
2470 version = "0.3.2"
2471 source = "registry+https://github.com/rust-lang/crates.io-index"
2472 checksum = "b6bc1c9ce2b5135ac7f93c72918fc37feb872bdc6a5533a8b85eb4b86bfdae52"
24372473
24382474 [[package]]
24392475 name = "tracing"
2440 version = "0.1.34"
2441 source = "registry+https://github.com/rust-lang/crates.io-index"
2442 checksum = "5d0ecdcb44a79f0fe9844f0c4f33a342cbcbb5117de8001e6ba0dc2351327d09"
2476 version = "0.1.37"
2477 source = "registry+https://github.com/rust-lang/crates.io-index"
2478 checksum = "8ce8c33a8d48bd45d624a6e523445fd21ec13d3653cd51f681abf67418f54eb8"
24432479 dependencies = [
24442480 "cfg-if",
24452481 "log",
24502486
24512487 [[package]]
24522488 name = "tracing-attributes"
2453 version = "0.1.21"
2454 source = "registry+https://github.com/rust-lang/crates.io-index"
2455 checksum = "cc6b8ad3567499f98a1db7a752b07a7c8c7c7c34c332ec00effb2b0027974b7c"
2489 version = "0.1.23"
2490 source = "registry+https://github.com/rust-lang/crates.io-index"
2491 checksum = "4017f8f45139870ca7e672686113917c71c7a6e02d4924eda67186083c03081a"
24562492 dependencies = [
24572493 "proc-macro2",
24582494 "quote",
24612497
24622498 [[package]]
24632499 name = "tracing-core"
2464 version = "0.1.26"
2465 source = "registry+https://github.com/rust-lang/crates.io-index"
2466 checksum = "f54c8ca710e81886d498c2fd3331b56c93aa248d49de2222ad2742247c60072f"
2467 dependencies = [
2468 "lazy_static",
2500 version = "0.1.30"
2501 source = "registry+https://github.com/rust-lang/crates.io-index"
2502 checksum = "24eb03ba0eab1fd845050058ce5e616558e8f8d8fca633e6b163fe25c797213a"
2503 dependencies = [
2504 "once_cell",
24692505 ]
24702506
24712507 [[package]]
24912527 checksum = "099b7128301d285f79ddd55b9a83d5e6b9e97c92e0ea0daebee7263e932de992"
24922528
24932529 [[package]]
2530 name = "unicode-ident"
2531 version = "1.0.5"
2532 source = "registry+https://github.com/rust-lang/crates.io-index"
2533 checksum = "6ceab39d59e4c9499d4e5a8ee0e2735b891bb7308ac83dfb4e80cad195c9f6f3"
2534
2535 [[package]]
24942536 name = "unicode-normalization"
2495 version = "0.1.19"
2496 source = "registry+https://github.com/rust-lang/crates.io-index"
2497 checksum = "d54590932941a9e9266f0832deed84ebe1bf2e4c9e4a3554d393d18f5e854bf9"
2537 version = "0.1.22"
2538 source = "registry+https://github.com/rust-lang/crates.io-index"
2539 checksum = "5c5713f0fc4b5db668a2ac63cdb7bb4469d8c9fed047b1d0292cc7b0ce2ba921"
24982540 dependencies = [
24992541 "tinyvec",
25002542 ]
25012543
25022544 [[package]]
25032545 name = "unicode-width"
2504 version = "0.1.9"
2505 source = "registry+https://github.com/rust-lang/crates.io-index"
2506 checksum = "3ed742d4ea2bd1176e236172c8429aaf54486e7ac098db29ffe6529e0ce50973"
2546 version = "0.1.10"
2547 source = "registry+https://github.com/rust-lang/crates.io-index"
2548 checksum = "c0edd1e5b14653f783770bce4a4dabb4a5108a5370a5f5d8cfe8710c361f6c8b"
25072549
25082550 [[package]]
25092551 name = "unicode-xid"
2510 version = "0.2.3"
2511 source = "registry+https://github.com/rust-lang/crates.io-index"
2512 checksum = "957e51f3646910546462e67d5f7599b9e4fb8acdd304b087a6494730f9eebf04"
2552 version = "0.2.4"
2553 source = "registry+https://github.com/rust-lang/crates.io-index"
2554 checksum = "f962df74c8c05a667b5ee8bcf162993134c104e96440b663c8daa176dc772d8c"
25132555
25142556 [[package]]
25152557 name = "url"
2516 version = "2.2.2"
2517 source = "registry+https://github.com/rust-lang/crates.io-index"
2518 checksum = "a507c383b2d33b5fc35d1861e77e6b383d158b2da5e14fe51b83dfedf6fd578c"
2558 version = "2.3.1"
2559 source = "registry+https://github.com/rust-lang/crates.io-index"
2560 checksum = "0d68c799ae75762b8c3fe375feb6600ef5602c883c5d21eb51c09f22b83c4643"
25192561 dependencies = [
25202562 "form_urlencoded",
25212563 "idna",
2522 "matches",
25232564 "percent-encoding",
25242565 "serde",
25252566 ]
25322573
25332574 [[package]]
25342575 name = "uuid"
2535 version = "1.0.0"
2536 source = "registry+https://github.com/rust-lang/crates.io-index"
2537 checksum = "8cfcd319456c4d6ea10087ed423473267e1a071f3bc0aa89f80d60997843c6f0"
2538 dependencies = [
2539 "getrandom 0.2.6",
2576 version = "1.2.2"
2577 source = "registry+https://github.com/rust-lang/crates.io-index"
2578 checksum = "422ee0de9031b5b948b97a8fc04e3aa35230001a722ddd27943e0be31564ce4c"
2579 dependencies = [
2580 "getrandom 0.2.8",
25402581 ]
25412582
25422583 [[package]]
25942635
25952636 [[package]]
25962637 name = "wasi"
2597 version = "0.10.2+wasi-snapshot-preview1"
2598 source = "registry+https://github.com/rust-lang/crates.io-index"
2599 checksum = "fd6fbd9a79829dd1ad0cc20627bf1ed606756a7f77edff7b66b7064f9cb327c6"
2600
2601 [[package]]
2602 name = "wasi"
26032638 version = "0.11.0+wasi-snapshot-preview1"
26042639 source = "registry+https://github.com/rust-lang/crates.io-index"
26052640 checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423"
26062641
26072642 [[package]]
26082643 name = "wasm-bindgen"
2609 version = "0.2.80"
2610 source = "registry+https://github.com/rust-lang/crates.io-index"
2611 checksum = "27370197c907c55e3f1a9fbe26f44e937fe6451368324e009cba39e139dc08ad"
2644 version = "0.2.83"
2645 source = "registry+https://github.com/rust-lang/crates.io-index"
2646 checksum = "eaf9f5aceeec8be17c128b2e93e031fb8a4d469bb9c4ae2d7dc1888b26887268"
26122647 dependencies = [
26132648 "cfg-if",
26142649 "wasm-bindgen-macro",
26162651
26172652 [[package]]
26182653 name = "wasm-bindgen-backend"
2619 version = "0.2.80"
2620 source = "registry+https://github.com/rust-lang/crates.io-index"
2621 checksum = "53e04185bfa3a779273da532f5025e33398409573f348985af9a1cbf3774d3f4"
2654 version = "0.2.83"
2655 source = "registry+https://github.com/rust-lang/crates.io-index"
2656 checksum = "4c8ffb332579b0557b52d268b91feab8df3615f265d5270fec2a8c95b17c1142"
26222657 dependencies = [
26232658 "bumpalo",
2624 "lazy_static",
26252659 "log",
2660 "once_cell",
26262661 "proc-macro2",
26272662 "quote",
26282663 "syn",
26312666
26322667 [[package]]
26332668 name = "wasm-bindgen-futures"
2634 version = "0.4.30"
2635 source = "registry+https://github.com/rust-lang/crates.io-index"
2636 checksum = "6f741de44b75e14c35df886aff5f1eb73aa114fa5d4d00dcd37b5e01259bf3b2"
2669 version = "0.4.33"
2670 source = "registry+https://github.com/rust-lang/crates.io-index"
2671 checksum = "23639446165ca5a5de86ae1d8896b737ae80319560fbaa4c2887b7da6e7ebd7d"
26372672 dependencies = [
26382673 "cfg-if",
26392674 "js-sys",
26432678
26442679 [[package]]
26452680 name = "wasm-bindgen-macro"
2646 version = "0.2.80"
2647 source = "registry+https://github.com/rust-lang/crates.io-index"
2648 checksum = "17cae7ff784d7e83a2fe7611cfe766ecf034111b49deb850a3dc7699c08251f5"
2681 version = "0.2.83"
2682 source = "registry+https://github.com/rust-lang/crates.io-index"
2683 checksum = "052be0f94026e6cbc75cdefc9bae13fd6052cdcaf532fa6c45e7ae33a1e6c810"
26492684 dependencies = [
26502685 "quote",
26512686 "wasm-bindgen-macro-support",
26532688
26542689 [[package]]
26552690 name = "wasm-bindgen-macro-support"
2656 version = "0.2.80"
2657 source = "registry+https://github.com/rust-lang/crates.io-index"
2658 checksum = "99ec0dc7a4756fffc231aab1b9f2f578d23cd391390ab27f952ae0c9b3ece20b"
2691 version = "0.2.83"
2692 source = "registry+https://github.com/rust-lang/crates.io-index"
2693 checksum = "07bc0c051dc5f23e307b13285f9d75df86bfdf816c5721e573dec1f9b8aa193c"
26592694 dependencies = [
26602695 "proc-macro2",
26612696 "quote",
26662701
26672702 [[package]]
26682703 name = "wasm-bindgen-shared"
2669 version = "0.2.80"
2670 source = "registry+https://github.com/rust-lang/crates.io-index"
2671 checksum = "d554b7f530dee5964d9a9468d95c1f8b8acae4f282807e7d27d4b03099a46744"
2704 version = "0.2.83"
2705 source = "registry+https://github.com/rust-lang/crates.io-index"
2706 checksum = "1c38c045535d93ec4f0b4defec448e4291638ee608530863b1e2ba115d4fff7f"
26722707
26732708 [[package]]
26742709 name = "web-sys"
2675 version = "0.3.57"
2676 source = "registry+https://github.com/rust-lang/crates.io-index"
2677 checksum = "7b17e741662c70c8bd24ac5c5b18de314a2c26c32bf8346ee1e6f53de919c283"
2710 version = "0.3.60"
2711 source = "registry+https://github.com/rust-lang/crates.io-index"
2712 checksum = "bcda906d8be16e728fd5adc5b729afad4e444e106ab28cd1c7256e54fa61510f"
26782713 dependencies = [
26792714 "js-sys",
26802715 "wasm-bindgen",
27262761 source = "registry+https://github.com/rust-lang/crates.io-index"
27272762 checksum = "ea04155a16a59f9eab786fe12a4a450e75cdb175f9e0d80da1e17db09f55b8d2"
27282763 dependencies = [
2729 "windows_aarch64_msvc",
2730 "windows_i686_gnu",
2731 "windows_i686_msvc",
2732 "windows_x86_64_gnu",
2733 "windows_x86_64_msvc",
2734 ]
2764 "windows_aarch64_msvc 0.36.1",
2765 "windows_i686_gnu 0.36.1",
2766 "windows_i686_msvc 0.36.1",
2767 "windows_x86_64_gnu 0.36.1",
2768 "windows_x86_64_msvc 0.36.1",
2769 ]
2770
2771 [[package]]
2772 name = "windows-sys"
2773 version = "0.42.0"
2774 source = "registry+https://github.com/rust-lang/crates.io-index"
2775 checksum = "5a3e1820f08b8513f676f7ab6c1f99ff312fb97b553d30ff4dd86f9f15728aa7"
2776 dependencies = [
2777 "windows_aarch64_gnullvm",
2778 "windows_aarch64_msvc 0.42.0",
2779 "windows_i686_gnu 0.42.0",
2780 "windows_i686_msvc 0.42.0",
2781 "windows_x86_64_gnu 0.42.0",
2782 "windows_x86_64_gnullvm",
2783 "windows_x86_64_msvc 0.42.0",
2784 ]
2785
2786 [[package]]
2787 name = "windows_aarch64_gnullvm"
2788 version = "0.42.0"
2789 source = "registry+https://github.com/rust-lang/crates.io-index"
2790 checksum = "41d2aa71f6f0cbe00ae5167d90ef3cfe66527d6f613ca78ac8024c3ccab9a19e"
27352791
27362792 [[package]]
27372793 name = "windows_aarch64_msvc"
27402796 checksum = "9bb8c3fd39ade2d67e9874ac4f3db21f0d710bee00fe7cab16949ec184eeaa47"
27412797
27422798 [[package]]
2799 name = "windows_aarch64_msvc"
2800 version = "0.42.0"
2801 source = "registry+https://github.com/rust-lang/crates.io-index"
2802 checksum = "dd0f252f5a35cac83d6311b2e795981f5ee6e67eb1f9a7f64eb4500fbc4dcdb4"
2803
2804 [[package]]
27432805 name = "windows_i686_gnu"
27442806 version = "0.36.1"
27452807 source = "registry+https://github.com/rust-lang/crates.io-index"
27462808 checksum = "180e6ccf01daf4c426b846dfc66db1fc518f074baa793aa7d9b9aaeffad6a3b6"
27472809
27482810 [[package]]
2811 name = "windows_i686_gnu"
2812 version = "0.42.0"
2813 source = "registry+https://github.com/rust-lang/crates.io-index"
2814 checksum = "fbeae19f6716841636c28d695375df17562ca208b2b7d0dc47635a50ae6c5de7"
2815
2816 [[package]]
27492817 name = "windows_i686_msvc"
27502818 version = "0.36.1"
27512819 source = "registry+https://github.com/rust-lang/crates.io-index"
27522820 checksum = "e2e7917148b2812d1eeafaeb22a97e4813dfa60a3f8f78ebe204bcc88f12f024"
27532821
27542822 [[package]]
2823 name = "windows_i686_msvc"
2824 version = "0.42.0"
2825 source = "registry+https://github.com/rust-lang/crates.io-index"
2826 checksum = "84c12f65daa39dd2babe6e442988fc329d6243fdce47d7d2d155b8d874862246"
2827
2828 [[package]]
27552829 name = "windows_x86_64_gnu"
27562830 version = "0.36.1"
27572831 source = "registry+https://github.com/rust-lang/crates.io-index"
27582832 checksum = "4dcd171b8776c41b97521e5da127a2d86ad280114807d0b2ab1e462bc764d9e1"
27592833
27602834 [[package]]
2835 name = "windows_x86_64_gnu"
2836 version = "0.42.0"
2837 source = "registry+https://github.com/rust-lang/crates.io-index"
2838 checksum = "bf7b1b21b5362cbc318f686150e5bcea75ecedc74dd157d874d754a2ca44b0ed"
2839
2840 [[package]]
2841 name = "windows_x86_64_gnullvm"
2842 version = "0.42.0"
2843 source = "registry+https://github.com/rust-lang/crates.io-index"
2844 checksum = "09d525d2ba30eeb3297665bd434a54297e4170c7f1a44cad4ef58095b4cd2028"
2845
2846 [[package]]
27612847 name = "windows_x86_64_msvc"
27622848 version = "0.36.1"
27632849 source = "registry+https://github.com/rust-lang/crates.io-index"
27642850 checksum = "c811ca4a8c853ef420abd8592ba53ddbbac90410fab6903b3e79972a631f7680"
27652851
27662852 [[package]]
2853 name = "windows_x86_64_msvc"
2854 version = "0.42.0"
2855 source = "registry+https://github.com/rust-lang/crates.io-index"
2856 checksum = "f40009d85759725a34da6d89a94e63d7bdc50a862acf0dbc7c8e488f1edcb6f5"
2857
2858 [[package]]
27672859 name = "winreg"
27682860 version = "0.10.1"
27692861 source = "registry+https://github.com/rust-lang/crates.io-index"
00 [package]
11 name = "feroxbuster"
2 version = "2.7.1"
2 version = "2.7.2"
33 authors = ["Ben 'epi' Risher (@epi052)"]
44 license = "MIT"
55 edition = "2021"
2121 maintenance = { status = "actively-developed" }
2222
2323 [build-dependencies]
24 clap = { version = "3.1.18", features = ["wrap_help", "cargo"] }
25 clap_complete = "3.1.4"
24 clap = { version = "4.0.8", features = ["wrap_help", "cargo"] }
25 clap_complete = "4.0.2"
2626 regex = "1.5.5"
2727 lazy_static = "1.4.0"
2828 dirs = "4.0.0"
3838 # uses feature unification to add 'serde' to reqwest::Url
3939 url = { version = "2.2.2", features = ["serde"] }
4040 serde_regex = "1.1.0"
41 clap = { version = "3.1.18", features = ["wrap_help", "cargo"] }
41 clap = { version = "4.0.8", features = ["wrap_help", "cargo"] }
4242 lazy_static = "1.4.0"
4343 toml = "0.5.9"
4444 serde = { version = "1.0.137", features = ["derive", "rc"] }
4545 serde_json = "1.0.81"
4646 uuid = { version = "1.0.0", features = ["v4"] }
4747 indicatif = "0.15"
48 console = "0.15.0"
48 console = "0.15.2"
4949 openssl = { version = "0.10.40", features = ["vendored"] }
5050 dirs = "4.0.0"
5151 regex = "1.5.5"
52 crossterm = "0.23.2"
52 crossterm = "0.25.0"
5353 rlimit = "0.8.3"
5454 ctrlc = "3.2.2"
5555 fuzzyhash = "0.2.1"
5656 anyhow = "1.0.57"
57 leaky-bucket = "0.10.0"
57 leaky-bucket = "0.12.1"
5858
5959 [dev-dependencies]
6060 tempfile = "3.3.0"
1010 # dependency management
1111 [tasks.upgrade-deps]
1212 command = "cargo"
13 args = ["upgrade", "--exclude", "indicatif", "leaky-bucket"]
13 args = ["upgrade", "--exclude", "indicatif"]
1414
1515 [tasks.update]
1616 command = "cargo"
180180 <!-- prettier-ignore-start -->
181181 <!-- markdownlint-disable -->
182182 <table>
183 <tr>
184 <td align="center"><a href="https://io.fi"><img src="https://avatars.githubusercontent.com/u/5235109?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Joona Hoikkala</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=joohoi" title="Documentation">📖</a></td>
185 <td align="center"><a href="https://github.com/jsav0"><img src="https://avatars.githubusercontent.com/u/20546041?v=4?s=100" width="100px;" alt=""/><br /><sub><b>J Savage</b></sub></a><br /><a href="#infra-jsav0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=jsav0" title="Documentation">📖</a></td>
186 <td align="center"><a href="http://www.tgotwig.dev"><img src="https://avatars.githubusercontent.com/u/30773779?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Thomas Gotwig</b></sub></a><br /><a href="#infra-TGotwig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=TGotwig" title="Documentation">📖</a></td>
187 <td align="center"><a href="https://github.com/spikecodes"><img src="https://avatars.githubusercontent.com/u/19519553?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Spike</b></sub></a><br /><a href="#infra-spikecodes" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=spikecodes" title="Documentation">📖</a></td>
188 <td align="center"><a href="https://github.com/evanrichter"><img src="https://avatars.githubusercontent.com/u/330292?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Evan Richter</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Documentation">📖</a></td>
189 <td align="center"><a href="https://github.com/mzpqnxow"><img src="https://avatars.githubusercontent.com/u/8016228?v=4?s=100" width="100px;" alt=""/><br /><sub><b>AG</b></sub></a><br /><a href="#ideas-mzpqnxow" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=mzpqnxow" title="Documentation">📖</a></td>
190 <td align="center"><a href="https://n-thumann.de/"><img src="https://avatars.githubusercontent.com/u/46975855?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolas Thumann</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Documentation">📖</a></td>
191 </tr>
192 <tr>
193 <td align="center"><a href="https://github.com/tomtastic"><img src="https://avatars.githubusercontent.com/u/302127?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tom Matthews</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=tomtastic" title="Documentation">📖</a></td>
194 <td align="center"><a href="https://github.com/bsysop"><img src="https://avatars.githubusercontent.com/u/9998303?v=4?s=100" width="100px;" alt=""/><br /><sub><b>bsysop</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bsysop" title="Documentation">📖</a></td>
195 <td align="center"><a href="http://bpsizemore.me"><img src="https://avatars.githubusercontent.com/u/11645898?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Brian Sizemore</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bpsizemore" title="Code">💻</a></td>
196 <td align="center"><a href="https://pwn.by/noraj"><img src="https://avatars.githubusercontent.com/u/16578570?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Alexandre ZANNI</b></sub></a><br /><a href="#infra-noraj" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=noraj" title="Documentation">📖</a></td>
197 <td align="center"><a href="https://github.com/craig"><img src="https://avatars.githubusercontent.com/u/99729?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Craig</b></sub></a><br /><a href="#infra-craig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
198 <td align="center"><a href="https://www.reddit.com/u/EONRaider"><img src="https://avatars.githubusercontent.com/u/15611424?v=4?s=100" width="100px;" alt=""/><br /><sub><b>EONRaider</b></sub></a><br /><a href="#infra-EONRaider" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
199 <td align="center"><a href="https://github.com/wtwver"><img src="https://avatars.githubusercontent.com/u/53866088?v=4?s=100" width="100px;" alt=""/><br /><sub><b>wtwver</b></sub></a><br /><a href="#infra-wtwver" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
200 </tr>
201 <tr>
202 <td align="center"><a href="https://tib3rius.com"><img src="https://avatars.githubusercontent.com/u/48113936?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Tib3rius</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ATib3rius" title="Bug reports">🐛</a></td>
203 <td align="center"><a href="https://github.com/0xdf"><img src="https://avatars.githubusercontent.com/u/1489045?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf" title="Bug reports">🐛</a></td>
204 <td align="center"><a href="http://secure77.de"><img src="https://avatars.githubusercontent.com/u/31564517?v=4?s=100" width="100px;" alt=""/><br /><sub><b>secure-77</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asecure-77" title="Bug reports">🐛</a></td>
205 <td align="center"><a href="https://github.com/sbrun"><img src="https://avatars.githubusercontent.com/u/7712154?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Sophie Brun</b></sub></a><br /><a href="#infra-sbrun" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
206 <td align="center"><a href="https://github.com/black-A"><img src="https://avatars.githubusercontent.com/u/30686803?v=4?s=100" width="100px;" alt=""/><br /><sub><b>black-A</b></sub></a><br /><a href="#ideas-black-A" title="Ideas, Planning, & Feedback">🤔</a></td>
207 <td align="center"><a href="https://github.com/dinosn"><img src="https://avatars.githubusercontent.com/u/3851678?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Nicolas Krassas</b></sub></a><br /><a href="#ideas-dinosn" title="Ideas, Planning, & Feedback">🤔</a></td>
208 <td align="center"><a href="https://github.com/N0ur5"><img src="https://avatars.githubusercontent.com/u/24260009?v=4?s=100" width="100px;" alt=""/><br /><sub><b>N0ur5</b></sub></a><br /><a href="#ideas-N0ur5" title="Ideas, Planning, & Feedback">🤔</a></td>
209 </tr>
210 <tr>
211 <td align="center"><a href="https://github.com/moscowchill"><img src="https://avatars.githubusercontent.com/u/72578879?v=4?s=100" width="100px;" alt=""/><br /><sub><b>mchill</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amoscowchill" title="Bug reports">🐛</a></td>
212 <td align="center"><a href="http://BitThr3at.github.io"><img src="https://avatars.githubusercontent.com/u/45028933?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Naman</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ABitThr3at" title="Bug reports">🐛</a></td>
213 <td align="center"><a href="https://github.com/Sicks3c"><img src="https://avatars.githubusercontent.com/u/32225186?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ayoub Elaich</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asicks3c" title="Bug reports">🐛</a></td>
214 <td align="center"><a href="https://github.com/HenryHoggard"><img src="https://avatars.githubusercontent.com/u/1208121?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Henry</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AHenryHoggard" title="Bug reports">🐛</a></td>
215 <td align="center"><a href="https://github.com/SleepiPanda"><img src="https://avatars.githubusercontent.com/u/6428561?v=4?s=100" width="100px;" alt=""/><br /><sub><b>SleepiPanda</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ASleepiPanda" title="Bug reports">🐛</a></td>
216 <td align="center"><a href="https://github.com/uBadRequest"><img src="https://avatars.githubusercontent.com/u/47282747?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Bad Requests</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AuBadRequest" title="Bug reports">🐛</a></td>
217 <td align="center"><a href="https://home.dnaka91.rocks"><img src="https://avatars.githubusercontent.com/u/36804488?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Dominik Nakamura</b></sub></a><br /><a href="#infra-dnaka91" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
218 </tr>
219 <tr>
220 <td align="center"><a href="https://github.com/hunter0x8"><img src="https://avatars.githubusercontent.com/u/46222314?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Muhammad Ahsan</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ahunter0x8" title="Bug reports">🐛</a></td>
221 <td align="center"><a href="https://github.com/cortantief"><img src="https://avatars.githubusercontent.com/u/34527333?v=4?s=100" width="100px;" alt=""/><br /><sub><b>cortantief</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Acortantief" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=cortantief" title="Code">💻</a></td>
222 <td align="center"><a href="https://github.com/dsaxton"><img src="https://avatars.githubusercontent.com/u/2658661?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Daniel Saxton</b></sub></a><br /><a href="#ideas-dsaxton" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=dsaxton" title="Code">💻</a></td>
223 <td align="center"><a href="https://github.com/narkopolo"><img src="https://avatars.githubusercontent.com/u/16690056?v=4?s=100" width="100px;" alt=""/><br /><sub><b>narkopolo</b></sub></a><br /><a href="#ideas-narkopolo" title="Ideas, Planning, & Feedback">🤔</a></td>
224 <td align="center"><a href="https://ring0.lol"><img src="https://avatars.githubusercontent.com/u/1893909?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Justin Steven</b></sub></a><br /><a href="#ideas-justinsteven" title="Ideas, Planning, & Feedback">🤔</a></td>
225 <td align="center"><a href="https://github.com/7047payloads"><img src="https://avatars.githubusercontent.com/u/95562424?v=4?s=100" width="100px;" alt=""/><br /><sub><b>7047payloads</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=7047payloads" title="Code">💻</a></td>
226 <td align="center"><a href="https://github.com/unkn0wnsyst3m"><img src="https://avatars.githubusercontent.com/u/21272239?v=4?s=100" width="100px;" alt=""/><br /><sub><b>unkn0wnsyst3m</b></sub></a><br /><a href="#ideas-unkn0wnsyst3m" title="Ideas, Planning, & Feedback">🤔</a></td>
227 </tr>
228 <tr>
229 <td align="center"><a href="https://ironwort.me/"><img src="https://avatars.githubusercontent.com/u/15280042?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0x08</b></sub></a><br /><a href="#ideas-its0x08" title="Ideas, Planning, & Feedback">🤔</a></td>
230 <td align="center"><a href="https://github.com/MD-Levitan"><img src="https://avatars.githubusercontent.com/u/12116508?v=4?s=100" width="100px;" alt=""/><br /><sub><b>kusok</b></sub></a><br /><a href="#ideas-MD-Levitan" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=MD-Levitan" title="Code">💻</a></td>
231 <td align="center"><a href="https://github.com/godylockz"><img src="https://avatars.githubusercontent.com/u/81207744?v=4?s=100" width="100px;" alt=""/><br /><sub><b>godylockz</b></sub></a><br /><a href="#ideas-godylockz" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=godylockz" title="Code">💻</a></td>
232 <td align="center"><a href="http://ryanmontgomery.me"><img src="https://avatars.githubusercontent.com/u/44453666?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Ryan Montgomery</b></sub></a><br /><a href="#ideas-0dayCTF" title="Ideas, Planning, & Feedback">🤔</a></td>
233 <td align="center"><a href="https://github.com/IppSec"><img src="https://avatars.githubusercontent.com/u/24677271?v=4?s=100" width="100px;" alt=""/><br /><sub><b>ippsec</b></sub></a><br /><a href="#ideas-ippsec" title="Ideas, Planning, & Feedback">🤔</a></td>
234 <td align="center"><a href="https://github.com/gtjamesa"><img src="https://avatars.githubusercontent.com/u/2078364?v=4?s=100" width="100px;" alt=""/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Agtjamesa" title="Bug reports">🐛</a></td>
235 <td align="center"><a href="https://twitter.com/Jhaddix"><img src="https://avatars.githubusercontent.com/u/3488554?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Jason Haddix</b></sub></a><br /><a href="#ideas-jhaddix" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ajhaddix" title="Bug reports">🐛</a></td>
236 </tr>
237 <tr>
238 <td align="center"><a href="https://github.com/ThisLimn0"><img src="https://avatars.githubusercontent.com/u/67125885?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Limn0</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AThisLimn0" title="Bug reports">🐛</a></td>
239 <td align="center"><a href="https://github.com/0xdf223"><img src="https://avatars.githubusercontent.com/u/76954092?v=4?s=100" width="100px;" alt=""/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf223" title="Bug reports">🐛</a> <a href="#ideas-0xdf223" title="Ideas, Planning, & Feedback">🤔</a></td>
240 <td align="center"><a href="https://github.com/Flangyver"><img src="https://avatars.githubusercontent.com/u/59575870?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Flangyver</b></sub></a><br /><a href="#ideas-Flangyver" title="Ideas, Planning, & Feedback">🤔</a></td>
241 <td align="center"><a href="https://github.com/DonatoReis"><img src="https://avatars.githubusercontent.com/u/93531354?v=4?s=100" width="100px;" alt=""/><br /><sub><b>PeakyBlinder</b></sub></a><br /><a href="#ideas-DonatoReis" title="Ideas, Planning, & Feedback">🤔</a></td>
242 <td align="center"><a href="https://postmodern.github.io/"><img src="https://avatars.githubusercontent.com/u/12671?v=4?s=100" width="100px;" alt=""/><br /><sub><b>Postmodern</b></sub></a><br /><a href="#ideas-postmodern" title="Ideas, Planning, & Feedback">🤔</a></td>
243 </tr>
183 <tbody>
184 <tr>
185 <td align="center"><a href="https://io.fi"><img src="https://avatars.githubusercontent.com/u/5235109?v=4?s=100" width="100px;" alt="Joona Hoikkala"/><br /><sub><b>Joona Hoikkala</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=joohoi" title="Documentation">📖</a></td>
186 <td align="center"><a href="https://github.com/jsav0"><img src="https://avatars.githubusercontent.com/u/20546041?v=4?s=100" width="100px;" alt="J Savage"/><br /><sub><b>J Savage</b></sub></a><br /><a href="#infra-jsav0" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=jsav0" title="Documentation">📖</a></td>
187 <td align="center"><a href="http://www.tgotwig.dev"><img src="https://avatars.githubusercontent.com/u/30773779?v=4?s=100" width="100px;" alt="Thomas Gotwig"/><br /><sub><b>Thomas Gotwig</b></sub></a><br /><a href="#infra-TGotwig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=TGotwig" title="Documentation">📖</a></td>
188 <td align="center"><a href="https://github.com/spikecodes"><img src="https://avatars.githubusercontent.com/u/19519553?v=4?s=100" width="100px;" alt="Spike"/><br /><sub><b>Spike</b></sub></a><br /><a href="#infra-spikecodes" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=spikecodes" title="Documentation">📖</a></td>
189 <td align="center"><a href="https://github.com/evanrichter"><img src="https://avatars.githubusercontent.com/u/330292?v=4?s=100" width="100px;" alt="Evan Richter"/><br /><sub><b>Evan Richter</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=evanrichter" title="Documentation">📖</a></td>
190 <td align="center"><a href="https://github.com/mzpqnxow"><img src="https://avatars.githubusercontent.com/u/8016228?v=4?s=100" width="100px;" alt="AG"/><br /><sub><b>AG</b></sub></a><br /><a href="#ideas-mzpqnxow" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=mzpqnxow" title="Documentation">📖</a></td>
191 <td align="center"><a href="https://n-thumann.de/"><img src="https://avatars.githubusercontent.com/u/46975855?v=4?s=100" width="100px;" alt="Nicolas Thumann"/><br /><sub><b>Nicolas Thumann</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Code">💻</a> <a href="https://github.com/epi052/feroxbuster/commits?author=n-thumann" title="Documentation">📖</a></td>
192 </tr>
193 <tr>
194 <td align="center"><a href="https://github.com/tomtastic"><img src="https://avatars.githubusercontent.com/u/302127?v=4?s=100" width="100px;" alt="Tom Matthews"/><br /><sub><b>Tom Matthews</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=tomtastic" title="Documentation">📖</a></td>
195 <td align="center"><a href="https://github.com/bsysop"><img src="https://avatars.githubusercontent.com/u/9998303?v=4?s=100" width="100px;" alt="bsysop"/><br /><sub><b>bsysop</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bsysop" title="Documentation">📖</a></td>
196 <td align="center"><a href="http://bpsizemore.me"><img src="https://avatars.githubusercontent.com/u/11645898?v=4?s=100" width="100px;" alt="Brian Sizemore"/><br /><sub><b>Brian Sizemore</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=bpsizemore" title="Code">💻</a></td>
197 <td align="center"><a href="https://pwn.by/noraj"><img src="https://avatars.githubusercontent.com/u/16578570?v=4?s=100" width="100px;" alt="Alexandre ZANNI"/><br /><sub><b>Alexandre ZANNI</b></sub></a><br /><a href="#infra-noraj" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a> <a href="https://github.com/epi052/feroxbuster/commits?author=noraj" title="Documentation">📖</a></td>
198 <td align="center"><a href="https://github.com/craig"><img src="https://avatars.githubusercontent.com/u/99729?v=4?s=100" width="100px;" alt="Craig"/><br /><sub><b>Craig</b></sub></a><br /><a href="#infra-craig" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
199 <td align="center"><a href="https://www.reddit.com/u/EONRaider"><img src="https://avatars.githubusercontent.com/u/15611424?v=4?s=100" width="100px;" alt="EONRaider"/><br /><sub><b>EONRaider</b></sub></a><br /><a href="#infra-EONRaider" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
200 <td align="center"><a href="https://github.com/wtwver"><img src="https://avatars.githubusercontent.com/u/53866088?v=4?s=100" width="100px;" alt="wtwver"/><br /><sub><b>wtwver</b></sub></a><br /><a href="#infra-wtwver" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
201 </tr>
202 <tr>
203 <td align="center"><a href="https://tib3rius.com"><img src="https://avatars.githubusercontent.com/u/48113936?v=4?s=100" width="100px;" alt="Tib3rius"/><br /><sub><b>Tib3rius</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ATib3rius" title="Bug reports">🐛</a></td>
204 <td align="center"><a href="https://github.com/0xdf"><img src="https://avatars.githubusercontent.com/u/1489045?v=4?s=100" width="100px;" alt="0xdf"/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf" title="Bug reports">🐛</a></td>
205 <td align="center"><a href="http://secure77.de"><img src="https://avatars.githubusercontent.com/u/31564517?v=4?s=100" width="100px;" alt="secure-77"/><br /><sub><b>secure-77</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asecure-77" title="Bug reports">🐛</a></td>
206 <td align="center"><a href="https://github.com/sbrun"><img src="https://avatars.githubusercontent.com/u/7712154?v=4?s=100" width="100px;" alt="Sophie Brun"/><br /><sub><b>Sophie Brun</b></sub></a><br /><a href="#infra-sbrun" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
207 <td align="center"><a href="https://github.com/black-A"><img src="https://avatars.githubusercontent.com/u/30686803?v=4?s=100" width="100px;" alt="black-A"/><br /><sub><b>black-A</b></sub></a><br /><a href="#ideas-black-A" title="Ideas, Planning, & Feedback">🤔</a></td>
208 <td align="center"><a href="https://github.com/dinosn"><img src="https://avatars.githubusercontent.com/u/3851678?v=4?s=100" width="100px;" alt="Nicolas Krassas"/><br /><sub><b>Nicolas Krassas</b></sub></a><br /><a href="#ideas-dinosn" title="Ideas, Planning, & Feedback">🤔</a></td>
209 <td align="center"><a href="https://github.com/N0ur5"><img src="https://avatars.githubusercontent.com/u/24260009?v=4?s=100" width="100px;" alt="N0ur5"/><br /><sub><b>N0ur5</b></sub></a><br /><a href="#ideas-N0ur5" title="Ideas, Planning, & Feedback">🤔</a></td>
210 </tr>
211 <tr>
212 <td align="center"><a href="https://github.com/moscowchill"><img src="https://avatars.githubusercontent.com/u/72578879?v=4?s=100" width="100px;" alt="mchill"/><br /><sub><b>mchill</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Amoscowchill" title="Bug reports">🐛</a></td>
213 <td align="center"><a href="http://BitThr3at.github.io"><img src="https://avatars.githubusercontent.com/u/45028933?v=4?s=100" width="100px;" alt="Naman"/><br /><sub><b>Naman</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ABitThr3at" title="Bug reports">🐛</a></td>
214 <td align="center"><a href="https://github.com/Sicks3c"><img src="https://avatars.githubusercontent.com/u/32225186?v=4?s=100" width="100px;" alt="Ayoub Elaich"/><br /><sub><b>Ayoub Elaich</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Asicks3c" title="Bug reports">🐛</a></td>
215 <td align="center"><a href="https://github.com/HenryHoggard"><img src="https://avatars.githubusercontent.com/u/1208121?v=4?s=100" width="100px;" alt="Henry"/><br /><sub><b>Henry</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AHenryHoggard" title="Bug reports">🐛</a></td>
216 <td align="center"><a href="https://github.com/SleepiPanda"><img src="https://avatars.githubusercontent.com/u/6428561?v=4?s=100" width="100px;" alt="SleepiPanda"/><br /><sub><b>SleepiPanda</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3ASleepiPanda" title="Bug reports">🐛</a></td>
217 <td align="center"><a href="https://github.com/uBadRequest"><img src="https://avatars.githubusercontent.com/u/47282747?v=4?s=100" width="100px;" alt="Bad Requests"/><br /><sub><b>Bad Requests</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AuBadRequest" title="Bug reports">🐛</a></td>
218 <td align="center"><a href="https://home.dnaka91.rocks"><img src="https://avatars.githubusercontent.com/u/36804488?v=4?s=100" width="100px;" alt="Dominik Nakamura"/><br /><sub><b>Dominik Nakamura</b></sub></a><br /><a href="#infra-dnaka91" title="Infrastructure (Hosting, Build-Tools, etc)">🚇</a></td>
219 </tr>
220 <tr>
221 <td align="center"><a href="https://github.com/hunter0x8"><img src="https://avatars.githubusercontent.com/u/46222314?v=4?s=100" width="100px;" alt="Muhammad Ahsan"/><br /><sub><b>Muhammad Ahsan</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ahunter0x8" title="Bug reports">🐛</a></td>
222 <td align="center"><a href="https://github.com/cortantief"><img src="https://avatars.githubusercontent.com/u/34527333?v=4?s=100" width="100px;" alt="cortantief"/><br /><sub><b>cortantief</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Acortantief" title="Bug reports">🐛</a> <a href="https://github.com/epi052/feroxbuster/commits?author=cortantief" title="Code">💻</a></td>
223 <td align="center"><a href="https://github.com/dsaxton"><img src="https://avatars.githubusercontent.com/u/2658661?v=4?s=100" width="100px;" alt="Daniel Saxton"/><br /><sub><b>Daniel Saxton</b></sub></a><br /><a href="#ideas-dsaxton" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=dsaxton" title="Code">💻</a></td>
224 <td align="center"><a href="https://github.com/narkopolo"><img src="https://avatars.githubusercontent.com/u/16690056?v=4?s=100" width="100px;" alt="narkopolo"/><br /><sub><b>narkopolo</b></sub></a><br /><a href="#ideas-narkopolo" title="Ideas, Planning, & Feedback">🤔</a></td>
225 <td align="center"><a href="https://ring0.lol"><img src="https://avatars.githubusercontent.com/u/1893909?v=4?s=100" width="100px;" alt="Justin Steven"/><br /><sub><b>Justin Steven</b></sub></a><br /><a href="#ideas-justinsteven" title="Ideas, Planning, & Feedback">🤔</a></td>
226 <td align="center"><a href="https://github.com/7047payloads"><img src="https://avatars.githubusercontent.com/u/95562424?v=4?s=100" width="100px;" alt="7047payloads"/><br /><sub><b>7047payloads</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=7047payloads" title="Code">💻</a></td>
227 <td align="center"><a href="https://github.com/unkn0wnsyst3m"><img src="https://avatars.githubusercontent.com/u/21272239?v=4?s=100" width="100px;" alt="unkn0wnsyst3m"/><br /><sub><b>unkn0wnsyst3m</b></sub></a><br /><a href="#ideas-unkn0wnsyst3m" title="Ideas, Planning, & Feedback">🤔</a></td>
228 </tr>
229 <tr>
230 <td align="center"><a href="https://ironwort.me/"><img src="https://avatars.githubusercontent.com/u/15280042?v=4?s=100" width="100px;" alt="0x08"/><br /><sub><b>0x08</b></sub></a><br /><a href="#ideas-its0x08" title="Ideas, Planning, & Feedback">🤔</a></td>
231 <td align="center"><a href="https://github.com/MD-Levitan"><img src="https://avatars.githubusercontent.com/u/12116508?v=4?s=100" width="100px;" alt="kusok"/><br /><sub><b>kusok</b></sub></a><br /><a href="#ideas-MD-Levitan" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=MD-Levitan" title="Code">💻</a></td>
232 <td align="center"><a href="https://github.com/godylockz"><img src="https://avatars.githubusercontent.com/u/81207744?v=4?s=100" width="100px;" alt="godylockz"/><br /><sub><b>godylockz</b></sub></a><br /><a href="#ideas-godylockz" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/commits?author=godylockz" title="Code">💻</a></td>
233 <td align="center"><a href="http://ryanmontgomery.me"><img src="https://avatars.githubusercontent.com/u/44453666?v=4?s=100" width="100px;" alt="Ryan Montgomery"/><br /><sub><b>Ryan Montgomery</b></sub></a><br /><a href="#ideas-0dayCTF" title="Ideas, Planning, & Feedback">🤔</a></td>
234 <td align="center"><a href="https://github.com/IppSec"><img src="https://avatars.githubusercontent.com/u/24677271?v=4?s=100" width="100px;" alt="ippsec"/><br /><sub><b>ippsec</b></sub></a><br /><a href="#ideas-ippsec" title="Ideas, Planning, & Feedback">🤔</a></td>
235 <td align="center"><a href="https://github.com/gtjamesa"><img src="https://avatars.githubusercontent.com/u/2078364?v=4?s=100" width="100px;" alt="James"/><br /><sub><b>James</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3Agtjamesa" title="Bug reports">🐛</a></td>
236 <td align="center"><a href="https://twitter.com/Jhaddix"><img src="https://avatars.githubusercontent.com/u/3488554?v=4?s=100" width="100px;" alt="Jason Haddix"/><br /><sub><b>Jason Haddix</b></sub></a><br /><a href="#ideas-jhaddix" title="Ideas, Planning, & Feedback">🤔</a> <a href="https://github.com/epi052/feroxbuster/issues?q=author%3Ajhaddix" title="Bug reports">🐛</a></td>
237 </tr>
238 <tr>
239 <td align="center"><a href="https://github.com/ThisLimn0"><img src="https://avatars.githubusercontent.com/u/67125885?v=4?s=100" width="100px;" alt="Limn0"/><br /><sub><b>Limn0</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3AThisLimn0" title="Bug reports">🐛</a></td>
240 <td align="center"><a href="https://github.com/0xdf223"><img src="https://avatars.githubusercontent.com/u/76954092?v=4?s=100" width="100px;" alt="0xdf"/><br /><sub><b>0xdf</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/issues?q=author%3A0xdf223" title="Bug reports">🐛</a> <a href="#ideas-0xdf223" title="Ideas, Planning, & Feedback">🤔</a></td>
241 <td align="center"><a href="https://github.com/Flangyver"><img src="https://avatars.githubusercontent.com/u/59575870?v=4?s=100" width="100px;" alt="Flangyver"/><br /><sub><b>Flangyver</b></sub></a><br /><a href="#ideas-Flangyver" title="Ideas, Planning, & Feedback">🤔</a></td>
242 <td align="center"><a href="https://github.com/DonatoReis"><img src="https://avatars.githubusercontent.com/u/93531354?v=4?s=100" width="100px;" alt="PeakyBlinder"/><br /><sub><b>PeakyBlinder</b></sub></a><br /><a href="#ideas-DonatoReis" title="Ideas, Planning, & Feedback">🤔</a></td>
243 <td align="center"><a href="https://postmodern.github.io/"><img src="https://avatars.githubusercontent.com/u/12671?v=4?s=100" width="100px;" alt="Postmodern"/><br /><sub><b>Postmodern</b></sub></a><br /><a href="#ideas-postmodern" title="Ideas, Planning, & Feedback">🤔</a></td>
244 <td align="center"><a href="https://github.com/herrcykel"><img src="https://avatars.githubusercontent.com/u/1936757?v=4?s=100" width="100px;" alt="O"/><br /><sub><b>O</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=herrcykel" title="Code">💻</a></td>
245 <td align="center"><a href="http://udoprog.github.io/"><img src="https://avatars.githubusercontent.com/u/111092?v=4?s=100" width="100px;" alt="John-John Tedro"/><br /><sub><b>John-John Tedro</b></sub></a><br /><a href="https://github.com/epi052/feroxbuster/commits?author=udoprog" title="Code">💻</a></td>
246 </tr>
247 </tbody>
244248 </table>
245249
246250 <!-- markdownlint-restore -->
5858 if !config_dir.exists() {
5959 // recursively create the feroxbuster directory and all of its parent components if
6060 // they are missing
61 if !config_dir.exists() {
62 // recursively create the feroxbuster directory and all of its parent components if
63 // they are missing
64 if create_dir_all(&config_dir).is_err() {
65 // only copy the config file when we're not running in the CI/CD pipeline
66 // which fails with permission denied
67 eprintln!("Couldn't create one or more directories needed to copy the config file");
68 return;
69 }
61 if create_dir_all(&config_dir).is_err() {
62 // only copy the config file when we're not running in the CI/CD pipeline
63 // which fails with permission denied
64 eprintln!("Couldn't create one or more directories needed to copy the config file");
65 return;
7066 }
7167 }
7268
6868 '-o+[Output file to write results to (use w/ --json for JSON entries)]:FILE:_files' \
6969 '--output=[Output file to write results to (use w/ --json for JSON entries)]:FILE:_files' \
7070 '--debug-log=[Output file to write log entries (use w/ --json for JSON entries)]:FILE:_files' \
71 '-h[Print help information]' \
72 '--help[Print help information]' \
73 '-V[Print version information]' \
74 '--version[Print version information]' \
7571 '(-u --url)--stdin[Read url(s) from STDIN]' \
7672 '(-p --proxy -k --insecure --burp-replay)--burp[Set --proxy to http://127.0.0.1:8080 and set --insecure to true]' \
7773 '(-P --replay-proxy -k --insecure)--burp-replay[Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true]' \
107103 '--quiet[Hide progress bars and banner (good for tmux windows w/ notifications)]' \
108104 '--json[Emit JSON logs to --output and --debug-log instead of normal text]' \
109105 '--no-state[Disable state output file (*.state)]' \
106 '-h[Print help information (use `--help` for more detail)]' \
107 '--help[Print help information (use `--help` for more detail)]' \
108 '-V[Print version information]' \
109 '--version[Print version information]' \
110110 && ret=0
111111 }
112112
7474 [CompletionResult]::new('-o', 'o', [CompletionResultType]::ParameterName, 'Output file to write results to (use w/ --json for JSON entries)')
7575 [CompletionResult]::new('--output', 'output', [CompletionResultType]::ParameterName, 'Output file to write results to (use w/ --json for JSON entries)')
7676 [CompletionResult]::new('--debug-log', 'debug-log', [CompletionResultType]::ParameterName, 'Output file to write log entries (use w/ --json for JSON entries)')
77 [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information')
78 [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information')
79 [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version information')
80 [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version information')
8177 [CompletionResult]::new('--stdin', 'stdin', [CompletionResultType]::ParameterName, 'Read url(s) from STDIN')
8278 [CompletionResult]::new('--burp', 'burp', [CompletionResultType]::ParameterName, 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true')
8379 [CompletionResult]::new('--burp-replay', 'burp-replay', [CompletionResultType]::ParameterName, 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true')
113109 [CompletionResult]::new('--quiet', 'quiet', [CompletionResultType]::ParameterName, 'Hide progress bars and banner (good for tmux windows w/ notifications)')
114110 [CompletionResult]::new('--json', 'json', [CompletionResultType]::ParameterName, 'Emit JSON logs to --output and --debug-log instead of normal text')
115111 [CompletionResult]::new('--no-state', 'no-state', [CompletionResultType]::ParameterName, 'Disable state output file (*.state)')
112 [CompletionResult]::new('-h', 'h', [CompletionResultType]::ParameterName, 'Print help information (use `--help` for more detail)')
113 [CompletionResult]::new('--help', 'help', [CompletionResultType]::ParameterName, 'Print help information (use `--help` for more detail)')
114 [CompletionResult]::new('-V', 'V', [CompletionResultType]::ParameterName, 'Print version information')
115 [CompletionResult]::new('--version', 'version', [CompletionResultType]::ParameterName, 'Print version information')
116116 break
117117 }
118118 })
77
88 for i in ${COMP_WORDS[@]}
99 do
10 case "${i}" in
11 "$1")
10 case "${cmd},${i}" in
11 ",$1")
1212 cmd="feroxbuster"
1313 ;;
1414 *)
1818
1919 case "${cmd}" in
2020 feroxbuster)
21 opts="-h -V -u -p -P -R -a -A -x -m -H -b -Q -f -S -X -W -N -C -s -T -r -k -t -n -d -e -L -w -D -E -B -g -I -v -q -o --help --version --url --stdin --resume-from --burp --burp-replay --smart --thorough --proxy --replay-proxy --replay-codes --user-agent --random-agent --extensions --methods --data --headers --cookies --query --add-slash --dont-scan --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --status-codes --timeout --redirects --insecure --threads --no-recursion --depth --force-recursion --extract-links --scan-limit --parallel --rate-limit --time-limit --wordlist --auto-tune --auto-bail --dont-filter --collect-extensions --collect-backups --collect-words --dont-collect --verbosity --silent --quiet --json --output --debug-log --no-state"
21 opts="-u -p -P -R -a -A -x -m -H -b -Q -f -S -X -W -N -C -s -T -r -k -t -n -d -e -L -w -D -E -B -g -I -v -q -o -h -V --url --stdin --resume-from --burp --burp-replay --smart --thorough --proxy --replay-proxy --replay-codes --user-agent --random-agent --extensions --methods --data --headers --cookies --query --add-slash --dont-scan --filter-size --filter-regex --filter-words --filter-lines --filter-status --filter-similar-to --status-codes --timeout --redirects --insecure --threads --no-recursion --depth --force-recursion --extract-links --scan-limit --parallel --rate-limit --time-limit --wordlist --auto-tune --auto-bail --dont-filter --collect-extensions --collect-backups --collect-words --dont-collect --verbosity --silent --quiet --json --output --debug-log --no-state --help --version"
2222 if [[ ${cur} == -* || ${COMP_CWORD} -eq 1 ]] ; then
2323 COMPREPLY=( $(compgen -W "${opts}" -- "${cur}") )
2424 return 0
7171 cand -o 'Output file to write results to (use w/ --json for JSON entries)'
7272 cand --output 'Output file to write results to (use w/ --json for JSON entries)'
7373 cand --debug-log 'Output file to write log entries (use w/ --json for JSON entries)'
74 cand -h 'Print help information'
75 cand --help 'Print help information'
76 cand -V 'Print version information'
77 cand --version 'Print version information'
7874 cand --stdin 'Read url(s) from STDIN'
7975 cand --burp 'Set --proxy to http://127.0.0.1:8080 and set --insecure to true'
8076 cand --burp-replay 'Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true'
110106 cand --quiet 'Hide progress bars and banner (good for tmux windows w/ notifications)'
111107 cand --json 'Emit JSON logs to --output and --debug-log instead of normal text'
112108 cand --no-state 'Disable state output file (*.state)'
109 cand -h 'Print help information (use `--help` for more detail)'
110 cand --help 'Print help information (use `--help` for more detail)'
111 cand -V 'Print version information'
112 cand --version 'Print version information'
113113 }
114114 ]
115115 $completions[$command]
88 DEFAULT_CONFIG_NAME,
99 };
1010 use anyhow::{anyhow, Context, Result};
11 use clap::ArgMatches;
11 use clap::{parser::ValueSource, ArgMatches};
1212 use regex::Regex;
1313 use reqwest::{Client, Method, StatusCode, Url};
1414 use serde::{Deserialize, Serialize};
2121
2222 /// macro helper to abstract away repetitive configuration updates
2323 macro_rules! update_config_if_present {
24 ($conf_val:expr, $matches:ident, $arg_name:expr) => {
25 match $matches.value_of_t($arg_name) {
26 Ok(value) => *$conf_val = value, // Update value
27 Err(err) => {
28 if !matches!(err.kind(), clap::ErrorKind::ArgumentNotFound) {
29 // Do nothing if argument not found
30 err.exit() // Exit with error on any other parse error
31 }
32 }
24 ($conf_val:expr, $matches:ident, $arg_name:expr, $arg_type:ty) => {
25 match $matches.get_one::<$arg_type>($arg_name) {
26 Some(value) => *$conf_val = value.to_owned(), // Update value
27 None => {}
3328 }
3429 };
3530 }
3934 ($old:expr, $new:expr, $default:expr) => {
4035 if $new != $default {
4136 *$old = $new;
37 }
38 };
39 }
40
41 /// macro helper to abstract away repetitive checks to see if the user has specified a value
42 /// for a given argument from the commandline or if we just had a default value in the parser
43 macro_rules! came_from_cli {
44 ($matches:ident, $arg_name:expr) => {
45 matches!(
46 $matches.value_source($arg_name),
47 Some(ValueSource::CommandLine)
48 )
49 };
50 }
51
52 /// macro helper to abstract away repetitive if not default: update checks, specifically for
53 /// values that are number types, i.e. usize, u64, etc
54 macro_rules! update_config_with_num_type_if_present {
55 ($conf_val:expr, $matches:ident, $arg_name:expr, $arg_type:ty) => {
56 if let Some(val) = $matches.get_one::<String>($arg_name) {
57 match val.parse::<$arg_type>() {
58 Ok(v) => *$conf_val = v,
59 Err(_) => {
60 report_and_exit(&format!(
61 "Invalid value for --{}, must be a positive integer",
62 $arg_name
63 ));
64 }
65 }
4266 }
4367 };
4468 }
459483
460484 // --resume-from used, need to first read the Configuration from disk, and then
461485 // merge the cli_config into the resumed config
462 if let Some(filename) = args.value_of("resume_from") {
486 if let Some(filename) = args.get_one::<String>("resume_from") {
463487 // when resuming a scan, instead of normal configuration loading, we just
464488 // load the config from disk by calling resume_scan
465489 let mut previous_config = resume_scan(filename);
545569 fn parse_cli_args(args: &ArgMatches) -> Self {
546570 let mut config = Configuration::default();
547571
548 update_config_if_present!(&mut config.threads, args, "threads");
549 update_config_if_present!(&mut config.depth, args, "depth");
550 update_config_if_present!(&mut config.scan_limit, args, "scan_limit");
551 update_config_if_present!(&mut config.parallel, args, "parallel");
552 update_config_if_present!(&mut config.rate_limit, args, "rate_limit");
553 update_config_if_present!(&mut config.wordlist, args, "wordlist");
554 update_config_if_present!(&mut config.output, args, "output");
555 update_config_if_present!(&mut config.debug_log, args, "debug_log");
556 update_config_if_present!(&mut config.time_limit, args, "time_limit");
557 update_config_if_present!(&mut config.resume_from, args, "resume_from");
558
559 if let Some(arg) = args.values_of("status_codes") {
572 update_config_with_num_type_if_present!(&mut config.threads, args, "threads", usize);
573 update_config_with_num_type_if_present!(&mut config.parallel, args, "parallel", usize);
574 update_config_with_num_type_if_present!(&mut config.depth, args, "depth", usize);
575 update_config_with_num_type_if_present!(&mut config.scan_limit, args, "scan_limit", usize);
576 update_config_with_num_type_if_present!(&mut config.rate_limit, args, "rate_limit", usize);
577 update_config_if_present!(&mut config.wordlist, args, "wordlist", String);
578 update_config_if_present!(&mut config.output, args, "output", String);
579 update_config_if_present!(&mut config.debug_log, args, "debug_log", String);
580 update_config_if_present!(&mut config.resume_from, args, "resume_from", String);
581
582 if let Ok(Some(inner)) = args.try_get_one::<String>("time_limit") {
583 config.time_limit = inner.to_owned();
584 }
585
586 if let Some(arg) = args.get_many::<String>("status_codes") {
560587 config.status_codes = arg
561588 .map(|code| {
562589 StatusCode::from_bytes(code.as_bytes())
566593 .collect();
567594 }
568595
569 if let Some(arg) = args.values_of("replay_codes") {
596 if let Some(arg) = args.get_many::<String>("replay_codes") {
570597 // replay codes passed in by the user
571598 config.replay_codes = arg
572599 .map(|code| {
580607 config.replay_codes = config.status_codes.clone();
581608 }
582609
583 if let Some(arg) = args.values_of("filter_status") {
610 if let Some(arg) = args.get_many::<String>("filter_status") {
584611 config.filter_status = arg
585612 .map(|code| {
586613 StatusCode::from_bytes(code.as_bytes())
590617 .collect();
591618 }
592619
593 if let Some(arg) = args.values_of("extensions") {
620 if let Some(arg) = args.get_many::<String>("extensions") {
594621 config.extensions = arg
595622 .map(|val| val.trim_start_matches('.').to_string())
596623 .collect();
597624 }
598625
599 if let Some(arg) = args.values_of("dont_collect") {
626 if let Some(arg) = args.get_many::<String>("dont_collect") {
600627 config.dont_collect = arg.map(|val| val.to_string()).collect();
601628 }
602629
603 if let Some(arg) = args.values_of("methods") {
630 if let Some(arg) = args.get_many::<String>("methods") {
604631 config.methods = arg
605632 .map(|val| {
606633 // Check methods if they are correct
612639 .collect();
613640 }
614641
615 if let Some(arg) = args.value_of("data") {
642 if let Some(arg) = args.get_one::<String>("data") {
616643 if let Some(stripped) = arg.strip_prefix('@') {
617644 config.data =
618645 std::fs::read(stripped).unwrap_or_else(|e| report_and_exit(&e.to_string()));
621648 }
622649 }
623650
624 if args.is_present("stdin") {
651 if came_from_cli!(args, "stdin") {
625652 config.stdin = true;
626 } else if let Some(url) = args.value_of("url") {
627 config.target_url = String::from(url);
628 }
629
630 if let Some(arg) = args.values_of("url_denylist") {
653 } else if let Some(url) = args.get_one::<String>("url") {
654 config.target_url = url.into();
655 }
656
657 if let Some(arg) = args.get_many::<String>("url_denylist") {
631658 // compile all regular expressions and absolute urls used for --dont-scan
632659 //
633660 // when --dont-scan is used, the should_deny_url function is called at least once per
671698 }
672699 }
673700
674 if let Some(arg) = args.values_of("filter_regex") {
701 if let Some(arg) = args.get_many::<String>("filter_regex") {
675702 config.filter_regex = arg.map(|val| val.to_string()).collect();
676703 }
677704
678 if let Some(arg) = args.values_of("filter_similar") {
705 if let Some(arg) = args.get_many::<String>("filter_similar") {
679706 config.filter_similar = arg.map(|val| val.to_string()).collect();
680707 }
681708
682 if let Some(arg) = args.values_of("filter_size") {
709 if let Some(arg) = args.get_many::<String>("filter_size") {
683710 config.filter_size = arg
684711 .map(|size| {
685712 size.parse::<u64>()
688715 .collect();
689716 }
690717
691 if let Some(arg) = args.values_of("filter_words") {
718 if let Some(arg) = args.get_many::<String>("filter_words") {
692719 config.filter_word_count = arg
693720 .map(|size| {
694721 size.parse::<usize>()
697724 .collect();
698725 }
699726
700 if let Some(arg) = args.values_of("filter_lines") {
727 if let Some(arg) = args.get_many::<String>("filter_lines") {
701728 config.filter_line_count = arg
702729 .map(|size| {
703730 size.parse::<usize>()
706733 .collect();
707734 }
708735
709 if args.is_present("silent") {
736 if came_from_cli!(args, "silent") {
710737 // the reason this is protected by an if statement:
711738 // consider a user specifying silent = true in ferox-config.toml
712739 // if the line below is outside of the if, we'd overwrite true with
715742 config.output_level = OutputLevel::Silent;
716743 }
717744
718 if args.is_present("quiet") {
745 if came_from_cli!(args, "quiet") {
719746 config.quiet = true;
720747 config.output_level = OutputLevel::Quiet;
721748 }
722749
723 if args.is_present("auto_tune") || args.is_present("smart") || args.is_present("thorough") {
750 if came_from_cli!(args, "auto_tune")
751 || came_from_cli!(args, "smart")
752 || came_from_cli!(args, "thorough")
753 {
724754 config.auto_tune = true;
725755 config.requester_policy = RequesterPolicy::AutoTune;
726756 }
727757
728 if args.is_present("auto_bail") {
758 if came_from_cli!(args, "auto_bail") {
729759 config.auto_bail = true;
730760 config.requester_policy = RequesterPolicy::AutoBail;
731761 }
732762
733 if args.is_present("no_state") {
763 if came_from_cli!(args, "no_state") {
734764 config.save_state = false;
735765 }
736766
737 if args.is_present("dont_filter") {
767 if came_from_cli!(args, "dont_filter") {
738768 config.dont_filter = true;
739769 }
740770
741 if args.is_present("collect_extensions") || args.is_present("thorough") {
771 if came_from_cli!(args, "collect_extensions") || came_from_cli!(args, "thorough") {
742772 config.collect_extensions = true;
743773 }
744774
745 if args.is_present("collect_backups")
746 || args.is_present("smart")
747 || args.is_present("thorough")
775 if came_from_cli!(args, "collect_backups")
776 || came_from_cli!(args, "smart")
777 || came_from_cli!(args, "thorough")
748778 {
749779 config.collect_backups = true;
750780 }
751781
752 if args.is_present("collect_words")
753 || args.is_present("smart")
754 || args.is_present("thorough")
782 if came_from_cli!(args, "collect_words")
783 || came_from_cli!(args, "smart")
784 || came_from_cli!(args, "thorough")
755785 {
756786 config.collect_words = true;
757787 }
758788
759 if args.occurrences_of("verbosity") > 0 {
789 if args.get_count("verbosity") > 0 {
760790 // occurrences_of returns 0 if none are found; this is protected in
761791 // an if block for the same reason as the quiet option
762 config.verbosity = args.occurrences_of("verbosity") as u8;
763 }
764
765 if args.is_present("no_recursion") {
792 config.verbosity = args.get_count("verbosity") as u8;
793 }
794
795 if came_from_cli!(args, "no_recursion") {
766796 config.no_recursion = true;
767797 }
768798
769 if args.is_present("add_slash") {
799 if came_from_cli!(args, "add_slash") {
770800 config.add_slash = true;
771801 }
772802
773 if args.is_present("extract_links")
774 || args.is_present("smart")
775 || args.is_present("thorough")
803 if came_from_cli!(args, "extract_links")
804 || came_from_cli!(args, "smart")
805 || came_from_cli!(args, "thorough")
776806 {
777807 config.extract_links = true;
778808 }
779809
780 if args.is_present("json") {
810 if came_from_cli!(args, "json") {
781811 config.json = true;
782812 }
783813
784 if args.is_present("force_recursion") {
814 if came_from_cli!(args, "force_recursion") {
785815 config.force_recursion = true;
786816 }
787817
788818 ////
789819 // organizational breakpoint; all options below alter the Client configuration
790820 ////
791 update_config_if_present!(&mut config.proxy, args, "proxy");
792 update_config_if_present!(&mut config.replay_proxy, args, "replay_proxy");
793 update_config_if_present!(&mut config.user_agent, args, "user_agent");
794 update_config_if_present!(&mut config.timeout, args, "timeout");
795
796 if args.is_present("burp") {
821 update_config_if_present!(&mut config.proxy, args, "proxy", String);
822 update_config_if_present!(&mut config.replay_proxy, args, "replay_proxy", String);
823 update_config_if_present!(&mut config.user_agent, args, "user_agent", String);
824 update_config_with_num_type_if_present!(&mut config.timeout, args, "timeout", u64);
825
826 if came_from_cli!(args, "burp") {
797827 config.proxy = String::from("http://127.0.0.1:8080");
798828 }
799829
800 if args.is_present("burp_replay") {
830 if came_from_cli!(args, "burp_replay") {
801831 config.replay_proxy = String::from("http://127.0.0.1:8080");
802832 }
803833
804 if args.is_present("random_agent") {
834 if came_from_cli!(args, "random_agent") {
805835 config.random_agent = true;
806836 }
807837
808 if args.is_present("redirects") {
838 if came_from_cli!(args, "redirects") {
809839 config.redirects = true;
810840 }
811841
812 if args.is_present("insecure") || args.is_present("burp") || args.is_present("burp_replay")
842 if came_from_cli!(args, "insecure")
843 || came_from_cli!(args, "burp")
844 || came_from_cli!(args, "burp_replay")
813845 {
814846 config.insecure = true;
815847 }
816848
817 if let Some(headers) = args.values_of("headers") {
849 if let Some(headers) = args.get_many::<String>("headers") {
818850 for val in headers {
819851 let mut split_val = val.split(':');
820852
828860 }
829861 }
830862
831 if let Some(cookies) = args.values_of("cookies") {
863 if let Some(cookies) = args.get_many::<String>("cookies") {
832864 config.headers.insert(
833865 // we know the header name is always "cookie"
834866 "Cookie".to_string(),
844876 );
845877 }
846878
847 if let Some(queries) = args.values_of("queries") {
879 if let Some(queries) = args.get_many::<String>("queries") {
848880 for val in queries {
849881 // same basic logic used as reading in the headers HashMap above
850882 let mut split_val = val.split('=');
956988 update_if_not_default!(&mut conf.force_recursion, new.force_recursion, false);
957989 update_if_not_default!(&mut conf.extract_links, new.extract_links, false);
958990 update_if_not_default!(&mut conf.extensions, new.extensions, Vec::<String>::new());
959 update_if_not_default!(&mut conf.methods, new.methods, Vec::<String>::new());
991 update_if_not_default!(&mut conf.methods, new.methods, methods());
960992 update_if_not_default!(&mut conf.data, new.data, Vec::<u8>::new());
961993 update_if_not_default!(&mut conf.url_denylist, new.url_denylist, Vec::<Url>::new());
962994 if !new.regex_denylist.is_empty() {
8080 }
8181
8282 /// enum representing the three possible states for informational output (not logging verbosity)
83 #[derive(Debug, Copy, Clone, PartialEq)]
83 #[derive(Debug, Copy, Clone, PartialEq, Eq)]
8484 pub enum OutputLevel {
8585 /// normal scan, no --quiet|--silent
8686 Default,
115115 }
116116
117117 /// represents actions the Requester should take in certain situations
118 #[derive(Debug, PartialEq, Copy, Clone)]
118 #[derive(Debug, PartialEq, Eq, Copy, Clone)]
119119 pub enum RequesterPolicy {
120120 /// automatically try to lower request rate in order to reduce errors
121121 AutoTune,
1111 /// ref: https://developers.google.com/search/reference/robots_txt
1212 pub(super) const ROBOTS_TXT_REGEX: &str =
1313 r#"(?m)^ *(Allow|Disallow): *(?P<url_path>[a-zA-Z0-9._/?#@!&'()+,;%=-]+?)$"#; // multi-line (?m)
14
15 /// Regular expression to filter bad characters from extracted url paths
16 ///
17 /// ref: https://www.rfc-editor.org/rfc/rfc3986#section-2
18 pub(super) const URL_CHARS_REGEX: &str = r#"["<>\\^`{|} ]"#;
1419
1520 /// Which type of extraction should be performed
1621 #[derive(Debug, Copy, Clone)]
8994 Ok(Extractor {
9095 links_regex: Regex::new(LINKFINDER_REGEX).unwrap(),
9196 robots_regex: Regex::new(ROBOTS_TXT_REGEX).unwrap(),
97 url_regex: Regex::new(URL_CHARS_REGEX).unwrap(),
9298 response: if self.response.is_some() {
9399 Some(self.response.unwrap())
94100 } else {
1616 use anyhow::{bail, Context, Result};
1717 use reqwest::{Client, StatusCode, Url};
1818 use scraper::{Html, Selector};
19 use std::collections::HashSet;
19 use std::{borrow::Cow, collections::HashSet};
2020
2121 /// Whether an active scan is recursive or not
2222 #[derive(Debug)]
3636
3737 /// `ROBOTS_TXT_REGEX` as a regex::Regex type
3838 pub(super) robots_regex: Regex,
39
40 /// regex to validate a url
41 pub(super) url_regex: Regex,
3942
4043 /// Response from which to extract links
4144 pub(super) response: Option<&'a FeroxResponse>,
219222 self.extract_links_by_attr(resp_url, links, html, "div", "src");
220223 self.extract_links_by_attr(resp_url, links, html, "frame", "src");
221224 self.extract_links_by_attr(resp_url, links, html, "embed", "src");
225 self.extract_links_by_attr(resp_url, links, html, "link", "href");
222226 }
223227
224228 /// Given the body of a `reqwest::Response`, perform the following actions
331335 let normalized_path = self.normalize_url_path(path);
332336
333337 // filter out any empty strings caused by .split
334 let mut parts: Vec<&str> = normalized_path
338 let mut parts: Vec<Cow<_>> = normalized_path
335339 .split('/')
340 .map(|s| self.url_regex.replace_all(s, ""))
336341 .filter(|s| !s.is_empty())
337342 .collect();
338343
391396 .join(link)
392397 .with_context(|| format!("Could not join {} with {}", old_url, link))?;
393398
399 if old_url.domain() != new_url.domain() || old_url.host() != old_url.host() {
400 // domains/ips are not the same, don't scan things that aren't part of the original
401 // target url
402 log::debug!(
403 "Skipping {} because it's not part of the original target",
404 new_url
405 );
406 log::trace!("exit: add_link_to_set_of_links");
407 return Ok(());
408 }
409
394410 links.insert(new_url.to_string());
395411
396412 log::trace!("exit: add_link_to_set_of_links");
412428
413429 let scanned_urls = self.handles.ferox_scans()?;
414430
415 if scanned_urls.get_scan_by_url(&new_url.to_string()).is_some() {
431 if scanned_urls.get_scan_by_url(new_url.as_ref()).is_some() {
416432 //we've seen the url before and don't need to scan again
417433 log::trace!("exit: request_link -> None");
418434 bail!("previously seen url");
0 use super::builder::{LINKFINDER_REGEX, ROBOTS_TXT_REGEX};
0 use super::builder::{LINKFINDER_REGEX, ROBOTS_TXT_REGEX, URL_CHARS_REGEX};
11 use super::*;
22 use crate::config::{Configuration, OutputLevel};
33 use crate::scan_manager::ScanOrder;
272272 let extractor = Extractor {
273273 links_regex: Regex::new(LINKFINDER_REGEX).unwrap(),
274274 robots_regex: Regex::new(ROBOTS_TXT_REGEX).unwrap(),
275 url_regex: Regex::new(URL_CHARS_REGEX).unwrap(),
275276 response: Some(&ferox_response),
276277 url: String::new(),
277278 target: ExtractionTarget::ResponseBody,
300301 let extractor = Extractor {
301302 links_regex: Regex::new(LINKFINDER_REGEX).unwrap(),
302303 robots_regex: Regex::new(ROBOTS_TXT_REGEX).unwrap(),
304 url_regex: Regex::new(URL_CHARS_REGEX).unwrap(),
303305 response: None,
304306 url: srv.url("/api/users/stuff/things"),
305307 target: ExtractionTarget::RobotsTxt,
00 use super::*;
11
22 /// Dummy filter for internal shenanigans
3 #[derive(Default, Debug, PartialEq)]
3 #[derive(Default, Debug, PartialEq, Eq)]
44 pub struct EmptyFilter {}
55
66 impl FeroxFilter for EmptyFilter {
11
22 /// Simple implementor of FeroxFilter; used to filter out responses based on the number of lines
33 /// in a Response body; specified using -N|--filter-lines
4 #[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
4 #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
55 pub struct LinesFilter {
66 /// Number of lines in a Response's body that should be filtered
77 pub line_count: usize,
22
33 /// Simple implementor of FeroxFilter; used to filter out responses based on the similarity of a
44 /// Response body with a known response; specified using --filter-similar-to
5 #[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
5 #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
66 pub struct SimilarityFilter {
77 /// Hash of Response's body to be used during similarity comparison
88 pub hash: String,
1919 /// Check `FeroxResponse::text` against what was requested from the site passed in via
2020 /// --filter-similar-to
2121 fn should_filter_response(&self, response: &FeroxResponse) -> bool {
22 let other = FuzzyHash::new(&response.text());
22 let other = FuzzyHash::new(response.text());
2323
2424 if let Ok(result) = FuzzyHash::compare(&self.hash, &other.to_string()) {
2525 return result >= self.threshold;
11
22 /// Simple implementor of FeroxFilter; used to filter out responses based on the length of a
33 /// Response body; specified using -S|--filter-size
4 #[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
4 #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
55 pub struct SizeFilter {
66 /// Overall length of a Response's body that should be filtered
77 pub content_length: u64,
11
22 /// Simple implementor of FeroxFilter; used to filter out status codes specified using
33 /// -C|--filter-status
4 #[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
4 #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
55 pub struct StatusCodeFilter {
66 /// Status code that should not be displayed to the user
77 pub filter_code: u16,
4040 }
4141
4242 // hash the response body and store the resulting hash in the filter object
43 let hash = FuzzyHash::new(&fr.text()).to_string();
43 let hash = FuzzyHash::new(fr.text()).to_string();
4444
4545 Ok(SimilarityFilter {
4646 hash,
88 ///
99 /// `size` is size of the response that should be included with filters passed via runtime
1010 /// configuration and any static wildcard lengths.
11 #[derive(Debug, Clone, PartialEq, Serialize, Deserialize)]
11 #[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
1212 pub struct WildcardFilter {
1313 /// size of the response that will later be combined with the length of the path of the url
1414 /// requested
11
22 /// Simple implementor of FeroxFilter; used to filter out responses based on the number of words
33 /// in a Response body; specified using -W|--filter-words
4 #[derive(Default, Debug, PartialEq, Serialize, Deserialize)]
4 #[derive(Default, Debug, PartialEq, Eq, Serialize, Deserialize)]
55 pub struct WordsFilter {
66 /// Number of words in a Response's body that should be filtered
77 pub word_count: usize,
4747 fn get_unique_words_from_wordlist(path: &str) -> Result<Arc<Vec<String>>> {
4848 log::trace!("enter: get_unique_words_from_wordlist({})", path);
4949
50 let file = File::open(&path).with_context(|| format!("Could not open {}", path))?;
50 let file = File::open(path).with_context(|| format!("Could not open {}", path))?;
5151
5252 let reader = BufReader::new(file);
5353
0 use clap::ArgAction;
01 use clap::{
12 crate_authors, crate_description, crate_name, crate_version, Arg, ArgGroup, Command, ValueHint,
23 };
2425 }
2526
2627 /// Create and return an instance of [clap::App](https://docs.rs/clap/latest/clap/struct.App.html), i.e. the Command Line Interface's configuration
27 pub fn initialize() -> Command<'static> {
28 pub fn initialize() -> Command {
2829 let app = Command::new(crate_name!())
2930 .version(crate_version!())
3031 .author(crate_authors!())
3839 Arg::new("url")
3940 .short('u')
4041 .long("url")
41 .required_unless_present_any(&["stdin", "resume_from"])
42 .required_unless_present_any(["stdin", "resume_from"])
4243 .help_heading("Target selection")
4344 .value_name("URL")
4445 .use_value_delimiter(true)
4950 Arg::new("stdin")
5051 .long("stdin")
5152 .help_heading("Target selection")
52 .takes_value(false)
53 .num_args(0)
5354 .help("Read url(s) from STDIN")
5455 .conflicts_with("url")
5556 )
6162 .help_heading("Target selection")
6263 .help("State file from which to resume a partially complete scan (ex. --resume-from ferox-1606586780.state)")
6364 .conflicts_with("url")
64 .takes_value(true),
65 .num_args(1),
6566 );
6667
6768 /////////////////////////////////////////////////////////////////////
7172 .arg(
7273 Arg::new("burp")
7374 .long("burp")
75 .num_args(0)
7476 .help_heading("Composite settings")
75 .conflicts_with_all(&["proxy", "insecure", "burp_replay"])
77 .conflicts_with_all(["proxy", "insecure", "burp_replay"])
7678 .help("Set --proxy to http://127.0.0.1:8080 and set --insecure to true"),
7779 )
7880 .arg(
7981 Arg::new("burp_replay")
8082 .long("burp-replay")
83 .num_args(0)
8184 .help_heading("Composite settings")
82 .conflicts_with_all(&["replay_proxy", "insecure"])
85 .conflicts_with_all(["replay_proxy", "insecure"])
8386 .help("Set --replay-proxy to http://127.0.0.1:8080 and set --insecure to true"),
8487 )
8588 .arg(
8689 Arg::new("smart")
8790 .long("smart")
91 .num_args(0)
8892 .help_heading("Composite settings")
8993 .help("Set --extract-links, --auto-tune, --collect-words, and --collect-backups to true"),
9094 ).arg(
9195 Arg::new("thorough")
9296 .long("thorough")
97 .num_args(0)
9398 .help_heading("Composite settings")
9499 .help("Use the same settings as --smart and set --collect-extensions to true"),
95100 );
102107 Arg::new("proxy")
103108 .short('p')
104109 .long("proxy")
105 .takes_value(true)
110 .num_args(1)
106111 .value_name("PROXY")
107112 .value_hint(ValueHint::Url)
108113 .help_heading("Proxy settings")
114119 Arg::new("replay_proxy")
115120 .short('P')
116121 .long("replay-proxy")
117 .takes_value(true)
122 .num_args(1)
118123 .value_hint(ValueHint::Url)
119124 .value_name("REPLAY_PROXY")
120125 .help_heading("Proxy settings")
127132 .short('R')
128133 .long("replay-codes")
129134 .value_name("REPLAY_CODE")
130 .takes_value(true)
131 .multiple_values(true)
132 .multiple_occurrences(true)
135 .num_args(1..)
136 .action(ArgAction::Append)
133137 .use_value_delimiter(true)
134138 .requires("replay_proxy")
135139 .help_heading("Proxy settings")
147151 .short('a')
148152 .long("user-agent")
149153 .value_name("USER_AGENT")
150 .takes_value(true)
154 .num_args(1)
151155 .help_heading("Request settings")
152156 .help(&**DEFAULT_USER_AGENT),
153157 )
155159 Arg::new("random_agent")
156160 .short('A')
157161 .long("random-agent")
158 .takes_value(false)
162 .num_args(0)
159163 .help_heading("Request settings")
160164 .help("Use a random User-Agent"),
161165 )
164168 .short('x')
165169 .long("extensions")
166170 .value_name("FILE_EXTENSION")
167 .takes_value(true)
168 .multiple_values(true)
169 .multiple_occurrences(true)
171 .num_args(1..)
172 .action(ArgAction::Append)
170173 .use_value_delimiter(true)
171174 .help_heading("Request settings")
172175 .help(
178181 .short('m')
179182 .long("methods")
180183 .value_name("HTTP_METHODS")
181 .takes_value(true)
182 .multiple_values(true)
183 .multiple_occurrences(true)
184 .num_args(1..)
185 .action(ArgAction::Append)
184186 .use_value_delimiter(true)
185187 .help_heading("Request settings")
186188 .help(
191193 Arg::new("data")
192194 .long("data")
193195 .value_name("DATA")
194 .takes_value(true)
196 .num_args(1)
195197 .help_heading("Request settings")
196198 .help(
197199 "Request's Body; can read data from a file if input starts with an @ (ex: @post.bin)",
202204 .short('H')
203205 .long("headers")
204206 .value_name("HEADER")
205 .takes_value(true)
206 .help_heading("Request settings")
207 .multiple_values(true)
208 .multiple_occurrences(true)
207 .num_args(1..)
208 .action(ArgAction::Append)
209 .help_heading("Request settings")
209210 .use_value_delimiter(true)
210211 .help(
211212 "Specify HTTP headers to be used in each request (ex: -H Header:val -H 'stuff: things')",
216217 .short('b')
217218 .long("cookies")
218219 .value_name("COOKIE")
219 .takes_value(true)
220 .multiple_values(true)
221 .multiple_occurrences(true)
220 .num_args(1..)
221 .action(ArgAction::Append)
222222 .use_value_delimiter(true)
223223 .help_heading("Request settings")
224224 .help(
230230 .short('Q')
231231 .long("query")
232232 .value_name("QUERY")
233 .takes_value(true)
234 .multiple_values(true)
235 .multiple_occurrences(true)
233 .num_args(1..)
234 .action(ArgAction::Append)
236235 .use_value_delimiter(true)
237236 .help_heading("Request settings")
238237 .help(
244243 .short('f')
245244 .long("add-slash")
246245 .help_heading("Request settings")
247 .takes_value(false)
246 .num_args(0)
248247 .help("Append / to each request's URL")
249248 );
250249
255254 Arg::new("url_denylist")
256255 .long("dont-scan")
257256 .value_name("URL")
258 .takes_value(true)
259 .multiple_values(true)
260 .multiple_occurrences(true)
257 .num_args(1..)
258 .action(ArgAction::Append)
261259 .use_value_delimiter(true)
262260 .help_heading("Request filters")
263261 .help("URL(s) or Regex Pattern(s) to exclude from recursion/scans"),
272270 .short('S')
273271 .long("filter-size")
274272 .value_name("SIZE")
275 .takes_value(true)
276 .multiple_values(true)
277 .multiple_occurrences(true)
273 .num_args(1..)
274 .action(ArgAction::Append)
278275 .use_value_delimiter(true)
279276 .help_heading("Response filters")
280277 .help(
286283 .short('X')
287284 .long("filter-regex")
288285 .value_name("REGEX")
289 .takes_value(true)
290 .multiple_values(true)
291 .multiple_occurrences(true)
286 .num_args(1..)
287 .action(ArgAction::Append)
292288 .use_value_delimiter(true)
293289 .help_heading("Response filters")
294290 .help(
300296 .short('W')
301297 .long("filter-words")
302298 .value_name("WORDS")
303 .takes_value(true)
304 .multiple_values(true)
305 .multiple_occurrences(true)
299 .num_args(1..)
300 .action(ArgAction::Append)
306301 .use_value_delimiter(true)
307302 .help_heading("Response filters")
308303 .help(
314309 .short('N')
315310 .long("filter-lines")
316311 .value_name("LINES")
317 .takes_value(true)
318 .multiple_values(true)
319 .multiple_occurrences(true)
312 .num_args(1..)
313 .action(ArgAction::Append)
320314 .use_value_delimiter(true)
321315 .help_heading("Response filters")
322316 .help(
328322 .short('C')
329323 .long("filter-status")
330324 .value_name("STATUS_CODE")
331 .takes_value(true)
332 .multiple_values(true)
333 .multiple_occurrences(true)
325 .num_args(1..)
326 .action(ArgAction::Append)
334327 .use_value_delimiter(true)
335328 .conflicts_with("status_codes")
336329 .help_heading("Response filters")
342335 Arg::new("filter_similar")
343336 .long("filter-similar-to")
344337 .value_name("UNWANTED_PAGE")
345 .takes_value(true)
346 .multiple_values(true)
347 .multiple_occurrences(true)
338 .num_args(1..)
339 .action(ArgAction::Append)
348340 .value_hint(ValueHint::Url)
349341 .use_value_delimiter(true)
350342 .help_heading("Response filters")
357349 .short('s')
358350 .long("status-codes")
359351 .value_name("STATUS_CODE")
360 .takes_value(true)
361 .multiple_values(true)
362 .multiple_occurrences(true)
352 .num_args(1..)
353 .action(ArgAction::Append)
363354 .use_value_delimiter(true)
364355 .help_heading("Response filters")
365356 .help(
376367 .short('T')
377368 .long("timeout")
378369 .value_name("SECONDS")
379 .takes_value(true)
370 .num_args(1)
380371 .help_heading("Client settings")
381372 .help("Number of seconds before a client's request times out (default: 7)"),
382373 )
384375 Arg::new("redirects")
385376 .short('r')
386377 .long("redirects")
387 .takes_value(false)
378 .num_args(0)
388379 .help_heading("Client settings")
389380 .help("Allow client to follow redirects"),
390381 )
392383 Arg::new("insecure")
393384 .short('k')
394385 .long("insecure")
395 .takes_value(false)
386 .num_args(0)
396387 .help_heading("Client settings")
397388 .help("Disables TLS certificate validation in the client"),
398389 );
406397 .short('t')
407398 .long("threads")
408399 .value_name("THREADS")
409 .takes_value(true)
400 .num_args(1)
410401 .help_heading("Scan settings")
411402 .help("Number of concurrent threads (default: 50)"),
412403 )
414405 Arg::new("no_recursion")
415406 .short('n')
416407 .long("no-recursion")
417 .takes_value(false)
408 .num_args(0)
418409 .help_heading("Scan settings")
419410 .help("Do not scan recursively"),
420411 )
423414 .short('d')
424415 .long("depth")
425416 .value_name("RECURSION_DEPTH")
426 .takes_value(true)
417 .num_args(1)
427418 .help_heading("Scan settings")
428419 .help("Maximum recursion depth, a depth of 0 is infinite recursion (default: 4)"),
429420 ).arg(
430421 Arg::new("force_recursion")
431422 .long("force-recursion")
423 .num_args(0)
432424 .conflicts_with("no_recursion")
433425 .help_heading("Scan settings")
434426 .help("Force recursion attempts on all 'found' endpoints (still respects recursion depth)"),
436428 Arg::new("extract_links")
437429 .short('e')
438430 .long("extract-links")
439 .takes_value(false)
431 .num_args(0)
440432 .help_heading("Scan settings")
441433 .help("Extract links from response body (html, javascript, etc...); make new requests based on findings")
442434 )
445437 .short('L')
446438 .long("scan-limit")
447439 .value_name("SCAN_LIMIT")
448 .takes_value(true)
440 .num_args(1)
449441 .help_heading("Scan settings")
450442 .help("Limit total number of concurrent scans (default: 0, i.e. no limit)")
451443 )
453445 Arg::new("parallel")
454446 .long("parallel")
455447 .value_name("PARALLEL_SCANS")
456 .takes_value(true)
448 .num_args(1)
457449 .requires("stdin")
458450 .help_heading("Scan settings")
459451 .help("Run parallel feroxbuster instances (one child process per url passed via stdin)")
462454 Arg::new("rate_limit")
463455 .long("rate-limit")
464456 .value_name("RATE_LIMIT")
465 .takes_value(true)
457 .num_args(1)
466458 .conflicts_with("auto_tune")
467459 .help_heading("Scan settings")
468460 .help("Limit number of requests per second (per directory) (default: 0, i.e. no limit)")
471463 Arg::new("time_limit")
472464 .long("time-limit")
473465 .value_name("TIME_SPEC")
474 .takes_value(true)
475 .validator(valid_time_spec)
466 .num_args(1)
467 .value_parser(valid_time_spec)
476468 .help_heading("Scan settings")
477469 .help("Limit total run time of all scans (ex: --time-limit 10m)")
478470 )
484476 .value_name("FILE")
485477 .help("Path to the wordlist")
486478 .help_heading("Scan settings")
487 .takes_value(true),
479 .num_args(1),
488480 ).arg(
489481 Arg::new("auto_tune")
490482 .long("auto-tune")
491 .takes_value(false)
483 .num_args(0)
492484 .conflicts_with("auto_bail")
493485 .help_heading("Scan settings")
494486 .help("Automatically lower scan rate when an excessive amount of errors are encountered")
496488 .arg(
497489 Arg::new("auto_bail")
498490 .long("auto-bail")
499 .takes_value(false)
491 .num_args(0)
500492 .help_heading("Scan settings")
501493 .help("Automatically stop scanning when an excessive amount of errors are encountered")
502494 ).arg(
503495 Arg::new("dont_filter")
504496 .short('D')
505497 .long("dont-filter")
506 .takes_value(false)
498 .num_args(0)
507499 .help_heading("Scan settings")
508500 .help("Don't auto-filter wildcard responses")
509501 ).arg(
510502 Arg::new("collect_extensions")
511503 .short('E')
512504 .long("collect-extensions")
513 .takes_value(false)
505 .num_args(0)
514506 .help_heading("Dynamic collection settings")
515507 .help("Automatically discover extensions and add them to --extensions (unless they're in --dont-collect)")
516508 ).arg(
517509 Arg::new("collect_backups")
518510 .short('B')
519511 .long("collect-backups")
520 .takes_value(false)
512 .num_args(0)
521513 .help_heading("Dynamic collection settings")
522514 .help("Automatically request likely backup extensions for \"found\" urls")
523515 ).arg(
524516 Arg::new("collect_words")
525517 .short('g')
526518 .long("collect-words")
527 .takes_value(false)
519 .num_args(0)
528520 .help_heading("Dynamic collection settings")
529521 .help("Automatically discover important words from within responses and add them to the wordlist")
530522 ).arg(
532524 .short('I')
533525 .long("dont-collect")
534526 .value_name("FILE_EXTENSION")
535 .takes_value(true)
536 .multiple_values(true)
537 .multiple_occurrences(true)
527 .num_args(1..)
528 .action(ArgAction::Append)
538529 .use_value_delimiter(true)
539530 .help_heading("Dynamic collection settings")
540531 .help(
550541 Arg::new("verbosity")
551542 .short('v')
552543 .long("verbosity")
553 .takes_value(false)
554 .multiple_occurrences(true)
544 .num_args(0)
545 .action(ArgAction::Count)
555546 .conflicts_with("silent")
556547 .help_heading("Output settings")
557548 .help("Increase verbosity level (use -vv or more for greater effect. [CAUTION] 4 -v's is probably too much)"),
558549 ).arg(
559550 Arg::new("silent")
560551 .long("silent")
561 .takes_value(false)
552 .num_args(0)
562553 .conflicts_with("quiet")
563554 .help_heading("Output settings")
564555 .help("Only print URLs + turn off logging (good for piping a list of urls to other commands)")
567558 Arg::new("quiet")
568559 .short('q')
569560 .long("quiet")
570 .takes_value(false)
561 .num_args(0)
571562 .help_heading("Output settings")
572563 .help("Hide progress bars and banner (good for tmux windows w/ notifications)")
573564 )
575566 .arg(
576567 Arg::new("json")
577568 .long("json")
578 .takes_value(false)
569 .num_args(0)
579570 .requires("output_files")
580571 .help_heading("Output settings")
581572 .help("Emit JSON logs to --output and --debug-log instead of normal text")
587578 .value_name("FILE")
588579 .help_heading("Output settings")
589580 .help("Output file to write results to (use w/ --json for JSON entries)")
590 .takes_value(true),
581 .num_args(1),
591582 )
592583 .arg(
593584 Arg::new("debug_log")
596587 .value_hint(ValueHint::FilePath)
597588 .help_heading("Output settings")
598589 .help("Output file to write log entries (use w/ --json for JSON entries)")
599 .takes_value(true),
590 .num_args(1),
600591 )
601592 .arg(
602593 Arg::new("no_state")
603594 .long("no-state")
604 .takes_value(false)
595 .num_args(0)
605596 .help_heading("Output settings")
606597 .help("Disable state output file (*.state)")
607598 );
612603 let mut app = app
613604 .group(
614605 ArgGroup::new("output_files")
615 .args(&["debug_log", "output"])
606 .args(["debug_log", "output"])
616607 .multiple(true),
617608 )
618609 .after_long_help(EPILOGUE);
640631 }
641632
642633 /// Validate that a string is formatted as a number followed by s, m, h, or d (10d, 30s, etc...)
643 fn valid_time_spec(time_spec: &str) -> Result<(), String> {
634 fn valid_time_spec(time_spec: &str) -> Result<String, String> {
644635 match TIMESPEC_REGEX.is_match(time_spec) {
645 true => Ok(()),
636 true => Ok(time_spec.to_string()),
646637 false => {
647638 let msg = format!(
648639 "Expected a non-negative, whole number followed by s, m, h, or d (case insensitive); received {}",
686677 ./feroxbuster -u http://127.1 --extract-links
687678
688679 Ludicrous speed... go!
689 ./feroxbuster -u http://127.1 -threads 200
680 ./feroxbuster -u http://127.1 --threads 200
690681
691682 Limit to a total of 60 active requests at any given time (threads * scan limit)
692683 ./feroxbuster -u http://127.1 --threads 30 --scan-limit 2
3131 /// The URL that to be scanned
3232 pub(super) url: String,
3333
34 /// A url used solely for comparison to other URLs
35 pub(super) normalized_url: String,
36
3437 /// The type of scan
3538 pub scan_type: ScanType,
3639
7881 num_requests: 0,
7982 scan_order: ScanOrder::Latest,
8083 url: String::new(),
84 normalized_url: String::new(),
8185 progress_bar: Mutex::new(None),
8286 scan_type: ScanType::File,
8387 output_level: Default::default(),
190194 ) -> Arc<Self> {
191195 Arc::new(Self {
192196 url: url.to_string(),
197 normalized_url: format!("{}/", url.trim_end_matches('/')),
193198 scan_type,
194199 scan_order,
195200 num_requests,
331336 where
332337 S: Serializer,
333338 {
334 let mut state = serializer.serialize_struct("FeroxScan", 4)?;
339 let mut state = serializer.serialize_struct("FeroxScan", 6)?;
335340
336341 state.serialize_field("id", &self.id)?;
337342 state.serialize_field("url", &self.url)?;
343 state.serialize_field("normalized_url", &self.normalized_url)?;
338344 state.serialize_field("scan_type", &self.scan_type)?;
339345 state.serialize_field("status", &self.status)?;
340346 state.serialize_field("num_requests", &self.num_requests)?;
384390 "url" => {
385391 if let Some(url) = value.as_str() {
386392 scan.url = url.to_string();
393 }
394 }
395 "normalized_url" => {
396 if let Some(normalized_url) = value.as_str() {
397 scan.normalized_url = normalized_url.to_string();
387398 }
388399 }
389400 "num_requests" => {
479490 let scan = FeroxScan {
480491 id: "".to_string(),
481492 url: "".to_string(),
493 normalized_url: String::from("/"),
482494 scan_type: ScanType::Directory,
483495 scan_order: ScanOrder::Initial,
484496 num_requests: 0,
7474 let mut seq = serializer.serialize_seq(Some(scans.len() + 1))?;
7575
7676 for scan in scans.iter() {
77 seq.serialize_element(&*scan).unwrap_or_default();
77 seq.serialize_element(scan).unwrap_or_default();
7878 }
7979 seq.end()
8080 }
212212 /// on the given URL
213213 pub fn contains(&self, url: &str) -> bool {
214214 if let Ok(scans) = self.scans.read() {
215 let normalized = format!("{}/", url.trim_end_matches('/'));
216
215217 for scan in scans.iter() {
216 if scan.url == url {
218 if scan.normalized_url == normalized {
217219 return true;
218220 }
219221 }
224226 /// Find and return a `FeroxScan` based on the given URL
225227 pub fn get_scan_by_url(&self, url: &str) -> Option<Arc<FeroxScan>> {
226228 if let Ok(guard) = self.scans.read() {
229 let normalized = format!("{}/", url.trim_end_matches('/'));
230
227231 for scan in guard.iter() {
228 if scan.url == url {
232 if scan.normalized_url == normalized {
229233 return Some(scan.clone());
230234 }
231235 }
588592 ///
589593 /// Also return a reference to the new `FeroxScan`
590594 pub fn add_directory_scan(&self, url: &str, scan_order: ScanOrder) -> (bool, Arc<FeroxScan>) {
591 self.add_scan(url, ScanType::Directory, scan_order)
595 let normalized = format!("{}/", url.trim_end_matches('/'));
596 self.add_scan(&normalized, ScanType::Directory, scan_order)
592597 }
593598
594599 /// Given a url, create a new `FeroxScan` and add it to `FeroxScans` as a File Scan
276276 None,
277277 );
278278 let fs_json = format!(
279 r#"{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}"#,
279 r#"{{"id":"{}","url":"https://spiritanimal.com","normalized_url":"https://spiritanimal.com/","scan_type":"Directory","status":"NotStarted","num_requests":0}}"#,
280280 fs.id
281281 );
282282 assert_eq!(fs_json, serde_json::to_string(&*fs).unwrap());
295295 );
296296 let ferox_scans = FeroxScans::default();
297297 let ferox_scans_json = format!(
298 r#"[{{"id":"{}","url":"https://spiritanimal.com","scan_type":"Directory","status":"NotStarted","num_requests":0}}]"#,
298 r#"[{{"id":"{}","url":"https://spiritanimal.com","normalized_url":"https://spiritanimal.com/","scan_type":"Directory","status":"NotStarted","num_requests":0}}]"#,
299299 ferox_scan.id
300300 );
301301 ferox_scans.scans.write().unwrap().push(ferox_scan);
555555 let scan = FeroxScan {
556556 id: "".to_string(),
557557 url: String::from("http://localhost"),
558 normalized_url: String::from("http://localhost/"),
558559 scan_order: ScanOrder::Latest,
559560 scan_type: Default::default(),
560561 num_requests: 0,
599600 let scan = FeroxScan {
600601 id: "".to_string(),
601602 url: String::from("http://localhost"),
603 normalized_url: String::from("http://localhost/"),
602604 scan_order: ScanOrder::Latest,
603605 scan_type: Default::default(),
604606 num_requests: 0,
0 use std::fmt::Write as _;
01 use std::sync::atomic::AtomicBool;
12 use std::{ops::Deref, sync::atomic::Ordering, sync::Arc, time::Instant};
23
283284 let mut message = format!("=> {}", style("Directory listing").blue().bright());
284285
285286 if !self.handles.config.extract_links {
286 message
287 .push_str(&format!(" (add {} to scan)", style("-e").bright().yellow()))
287 write!(message, " (add {} to scan)", style("-e").bright().yellow())?;
288288 }
289289
290290 progress_bar.reset_eta();
55
66 use anyhow::Result;
77 use lazy_static::lazy_static;
8 use leaky_bucket::LeakyBucket;
8 use leaky_bucket::RateLimiter;
99 use tokio::{
1010 sync::RwLock,
1111 time::{sleep, Duration},
4444 target_url: String,
4545
4646 /// limits requests per second if present
47 rate_limiter: RwLock<Option<LeakyBucket>>,
47 rate_limiter: RwLock<Option<RateLimiter>>,
4848
4949 /// data regarding policy and metadata about last enforced trigger etc...
5050 policy_data: PolicyData,
9393 })
9494 }
9595
96 /// build a LeakyBucket, given a rate limit (as requests per second)
97 fn build_a_bucket(limit: usize) -> Result<LeakyBucket> {
96 /// build a RateLimiter, given a rate limit (as requests per second)
97 fn build_a_bucket(limit: usize) -> Result<RateLimiter> {
9898 let refill = max((limit as f64 / 10.0).round() as usize, 1); // minimum of 1 per second
9999 let tokens = max((limit as f64 / 2.0).round() as usize, 1);
100100 let interval = if refill == 1 { 1000 } else { 100 }; // 1 second if refill is 1
101101
102 Ok(LeakyBucket::builder()
103 .refill_interval(Duration::from_millis(interval)) // add tokens every 0.1s
104 .refill_amount(refill) // ex: 100 req/s -> 10 tokens per 0.1s
105 .tokens(tokens) // reduce initial burst, 2 is arbitrary, but felt good
102 Ok(RateLimiter::builder()
103 .interval(Duration::from_millis(interval)) // add tokens every 0.1s
104 .refill(refill) // ex: 100 req/s -> 10 tokens per 0.1s
105 .initial(tokens) // reduce initial burst, 2 is arbitrary, but felt good
106106 .max(limit)
107 .build()?)
107 .build())
108108 }
109109
110110 /// sleep and set a flag that can be checked by other threads
126126 let guard = self.rate_limiter.read().await;
127127
128128 if guard.is_some() {
129 guard.as_ref().unwrap().acquire_one().await?;
129 guard.as_ref().unwrap().acquire_one().await;
130130 }
131131
132132 Ok(())
207207 } else {
208208 // errors can only be incremented, so an else is sufficient
209209 *guard += 1;
210 self.policy_data.adjust_up(&*guard);
210 self.policy_data.adjust_up(&guard);
211211 }
212212 }
213213
924924 /// decrease the scan rate
925925 async fn adjust_limit_resets_streak_counter_on_downward_movement() {
926926 let (handles, _) = setup_requester_test(None).await;
927 let mut buckets = leaky_bucket::LeakyBuckets::new();
928 let coordinator = buckets.coordinate().unwrap();
929 tokio::spawn(async move { coordinator.await.expect("coordinator errored") });
930 let limiter = buckets.rate_limiter().max(200).build().unwrap();
927 let limiter = RateLimiter::builder()
928 .interval(Duration::from_secs(1))
929 .max(200)
930 .build();
931931
932932 let scan = FeroxScan::default();
933933 scan.add_error();
946946 requester.policy_data.set_reqs_sec(400);
947947 requester.policy_data.set_errors(1);
948948
949 let mut guard = requester.tuning_lock.lock().unwrap();
950 *guard = 2;
951 drop(guard);
949 {
950 let mut guard = requester.tuning_lock.lock().unwrap();
951 *guard = 2;
952 }
952953
953954 requester
954955 .adjust_limit(PolicyTrigger::Errors, false)
10351036 /// set_rate_limiter should exit early when new limit equals the current bucket's max
10361037 async fn set_rate_limiter_early_exit() {
10371038 let (handles, _) = setup_requester_test(None).await;
1038 let mut buckets = leaky_bucket::LeakyBuckets::new();
1039 let coordinator = buckets.coordinate().unwrap();
1040 tokio::spawn(async move { coordinator.await.expect("coordinator errored") });
1041 let limiter = buckets.rate_limiter().max(200).build().unwrap();
1039 let limiter = RateLimiter::builder()
1040 .interval(Duration::from_secs(1))
1041 .max(200)
1042 .build();
10421043
10431044 let requester = Requester {
10441045 handles,
10671068 async fn tune_sets_expected_values_and_then_waits() {
10681069 let (handles, _) = setup_requester_test(None).await;
10691070
1070 let mut buckets = leaky_bucket::LeakyBuckets::new();
1071 let coordinator = buckets.coordinate().unwrap();
1072 tokio::spawn(async move { coordinator.await.expect("coordinator errored") });
1073 let limiter = buckets.rate_limiter().max(200).build().unwrap();
1071 let limiter = RateLimiter::builder()
1072 .interval(Duration::from_secs(1))
1073 .max(200)
1074 .build();
10741075
10751076 let scan = FeroxScan::new(
10761077 "http://localhost",
0 #[derive(Copy, Clone, PartialEq, Debug)]
0 #[derive(Copy, Clone, PartialEq, Eq, Debug)]
11 /// represents different situations where different criteria can trigger auto-tune/bail behavior
22 pub enum PolicyTrigger {
33 /// excessive 403 trigger
525525 String::new()
526526 };
527527
528 let slug = url.replace("://", "_").replace('/', "_").replace('.', "_");
528 let slug = url.replace("://", "_").replace(['/', '.'], "_");
529529
530530 let filename = format!("{}{}-{}.{}", altered_prefix, slug, ts, suffix);
531531
198198 let sub_dir = output_dir.as_ref().join(&sub_dir);
199199
200200 // created directory like output-file-1627845741.logs/
201 assert!(dir_regex.is_match(&sub_dir.to_string_lossy().to_string()));
201 assert!(dir_regex.is_match(&sub_dir.to_string_lossy()));
202202
203203 for entry in sub_dir.read_dir()? {
204204 let entry = entry?;
4141 .arg("-h")
4242 .assert()
4343 .success()
44 .stdout(predicate::str::contains(
45 "[CAUTION] 4 -v's is probably too much",
46 ));
44 .stdout(
45 predicate::str::contains("[CAUTION]")
46 .and(predicate::str::contains("4"))
47 .and(predicate::str::contains("-v's"))
48 .and(predicate::str::contains("is"))
49 .and(predicate::str::contains("probably"))
50 .and(predicate::str::contains("too"))
51 .and(predicate::str::contains("much")),
52 );
4753 }
1919 // localhost:PORT/ <- complete
2020 // localhost:PORT/js <- will get scanned with /css and /stuff
2121 let complete_scan = format!(
22 r#"{{"id":"057016a14769414aac9a7a62707598cb","url":"{}","scan_type":"Directory","status":"Complete"}}"#,
23 srv.url("/")
22 r#"{{"id":"057016a14769414aac9a7a62707598cb","url":"{}","normalized_url":"{}","scan_type":"Directory","status":"Complete"}}"#,
23 srv.url("/"),
24 srv.url("/"),
2425 );
2526 let incomplete_scan = format!(
26 r#"{{"id":"400b2323a16f43468a04ffcbbeba34c6","url":"{}","scan_type":"Directory","status":"NotStarted"}}"#,
27 r#"{{"id":"400b2323a16f43468a04ffcbbeba34c6","url":"{}","normalized_url":"{}/","scan_type":"Directory","status":"NotStarted"}}"#,
28 srv.url("/js"),
2729 srv.url("/js")
2830 );
2931 let scans = format!(r#""scans":[{},{}]"#, complete_scan, incomplete_scan);
88 filename: &str,
99 ) -> Result<(TempDir, PathBuf), Box<dyn std::error::Error>> {
1010 let tmp_dir = TempDir::new()?;
11 let file = tmp_dir.path().join(&filename);
11 let file = tmp_dir.path().join(filename);
1212 write(&file, words.join("\n"))?;
1313 Ok((tmp_dir, file))
1414 }