pypcapkit 1.3.3.post1__cp313-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (466) hide show
  1. pcapkit/__init__.py +126 -0
  2. pcapkit/__main__.py +138 -0
  3. pcapkit/all.py +136 -0
  4. pcapkit/const/__init__.py +81 -0
  5. pcapkit/const/arp/__init__.py +25 -0
  6. pcapkit/const/arp/hardware.py +181 -0
  7. pcapkit/const/arp/operation.py +131 -0
  8. pcapkit/const/ftp/__init__.py +25 -0
  9. pcapkit/const/ftp/command.py +309 -0
  10. pcapkit/const/ftp/return_code.py +304 -0
  11. pcapkit/const/hip/__init__.py +94 -0
  12. pcapkit/const/hip/certificate.py +77 -0
  13. pcapkit/const/hip/cipher.py +65 -0
  14. pcapkit/const/hip/di.py +59 -0
  15. pcapkit/const/hip/ecdsa_curve.py +59 -0
  16. pcapkit/const/hip/ecdsa_low_curve.py +56 -0
  17. pcapkit/const/hip/eddsa_curve.py +65 -0
  18. pcapkit/const/hip/esp_transform_suite.py +98 -0
  19. pcapkit/const/hip/group.py +86 -0
  20. pcapkit/const/hip/hi_algorithm.py +86 -0
  21. pcapkit/const/hip/hit_suite.py +68 -0
  22. pcapkit/const/hip/nat_traversal.py +62 -0
  23. pcapkit/const/hip/notify_message.py +200 -0
  24. pcapkit/const/hip/packet.py +89 -0
  25. pcapkit/const/hip/parameter.py +377 -0
  26. pcapkit/const/hip/registration.py +68 -0
  27. pcapkit/const/hip/registration_failure.py +84 -0
  28. pcapkit/const/hip/suite.py +71 -0
  29. pcapkit/const/hip/transport.py +59 -0
  30. pcapkit/const/http/__init__.py +39 -0
  31. pcapkit/const/http/error_code.py +95 -0
  32. pcapkit/const/http/frame.py +95 -0
  33. pcapkit/const/http/method.py +184 -0
  34. pcapkit/const/http/setting.py +96 -0
  35. pcapkit/const/http/status_code.py +294 -0
  36. pcapkit/const/ipv4/__init__.py +57 -0
  37. pcapkit/const/ipv4/classification_level.py +64 -0
  38. pcapkit/const/ipv4/option_class.py +55 -0
  39. pcapkit/const/ipv4/option_number.py +137 -0
  40. pcapkit/const/ipv4/protection_authority.py +63 -0
  41. pcapkit/const/ipv4/qs_function.py +51 -0
  42. pcapkit/const/ipv4/router_alert.py +251 -0
  43. pcapkit/const/ipv4/tos_del.py +51 -0
  44. pcapkit/const/ipv4/tos_ecn.py +55 -0
  45. pcapkit/const/ipv4/tos_pre.py +63 -0
  46. pcapkit/const/ipv4/tos_rel.py +51 -0
  47. pcapkit/const/ipv4/tos_thr.py +51 -0
  48. pcapkit/const/ipv4/ts_flag.py +53 -0
  49. pcapkit/const/ipv6/__init__.py +53 -0
  50. pcapkit/const/ipv6/extension_header.py +66 -0
  51. pcapkit/const/ipv6/option.py +137 -0
  52. pcapkit/const/ipv6/option_action.py +55 -0
  53. pcapkit/const/ipv6/qs_function.py +51 -0
  54. pcapkit/const/ipv6/router_alert.py +266 -0
  55. pcapkit/const/ipv6/routing.py +80 -0
  56. pcapkit/const/ipv6/seed_id.py +55 -0
  57. pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
  58. pcapkit/const/ipv6/tagger_id.py +62 -0
  59. pcapkit/const/ipx/__init__.py +27 -0
  60. pcapkit/const/ipx/packet.py +72 -0
  61. pcapkit/const/ipx/socket.py +104 -0
  62. pcapkit/const/l2tp/__init__.py +21 -0
  63. pcapkit/const/l2tp/type.py +51 -0
  64. pcapkit/const/mh/__init__.py +204 -0
  65. pcapkit/const/mh/access_type.py +92 -0
  66. pcapkit/const/mh/ack_status_code.py +71 -0
  67. pcapkit/const/mh/ani_suboption.py +74 -0
  68. pcapkit/const/mh/auth_subtype.py +53 -0
  69. pcapkit/const/mh/binding_ack_flag.py +66 -0
  70. pcapkit/const/mh/binding_error.py +51 -0
  71. pcapkit/const/mh/binding_revocation.py +59 -0
  72. pcapkit/const/mh/binding_update_flag.py +81 -0
  73. pcapkit/const/mh/cga_extension.py +66 -0
  74. pcapkit/const/mh/cga_sec.py +57 -0
  75. pcapkit/const/mh/cga_type.py +68 -0
  76. pcapkit/const/mh/dhcp_support_mode.py +53 -0
  77. pcapkit/const/mh/dns_status_code.py +65 -0
  78. pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
  79. pcapkit/const/mh/dsmipv6_home_address.py +74 -0
  80. pcapkit/const/mh/enumerating_algorithm.py +56 -0
  81. pcapkit/const/mh/fb_ack_status.py +62 -0
  82. pcapkit/const/mh/fb_action.py +71 -0
  83. pcapkit/const/mh/fb_indication_trigger.py +65 -0
  84. pcapkit/const/mh/fb_type.py +59 -0
  85. pcapkit/const/mh/flow_id_status.py +77 -0
  86. pcapkit/const/mh/flow_id_suboption.py +71 -0
  87. pcapkit/const/mh/handoff_type.py +71 -0
  88. pcapkit/const/mh/handover_ack_flag.py +54 -0
  89. pcapkit/const/mh/handover_ack_status.py +92 -0
  90. pcapkit/const/mh/handover_initiate_flag.py +57 -0
  91. pcapkit/const/mh/handover_initiate_status.py +62 -0
  92. pcapkit/const/mh/home_address_reply.py +71 -0
  93. pcapkit/const/mh/lla_code.py +63 -0
  94. pcapkit/const/mh/lma_mag_suboption.py +59 -0
  95. pcapkit/const/mh/mn_group_id.py +59 -0
  96. pcapkit/const/mh/mn_id_subtype.py +77 -0
  97. pcapkit/const/mh/operator_id.py +63 -0
  98. pcapkit/const/mh/option.py +260 -0
  99. pcapkit/const/mh/packet.py +119 -0
  100. pcapkit/const/mh/qos_attribute.py +89 -0
  101. pcapkit/const/mh/revocation_status_code.py +83 -0
  102. pcapkit/const/mh/revocation_trigger.py +86 -0
  103. pcapkit/const/mh/status_code.py +232 -0
  104. pcapkit/const/mh/traffic_selector.py +62 -0
  105. pcapkit/const/mh/upa_status.py +71 -0
  106. pcapkit/const/mh/upn_reason.py +80 -0
  107. pcapkit/const/ospf/__init__.py +27 -0
  108. pcapkit/const/ospf/authentication.py +65 -0
  109. pcapkit/const/ospf/packet.py +71 -0
  110. pcapkit/const/pcapng/__init__.py +51 -0
  111. pcapkit/const/pcapng/block_type.py +152 -0
  112. pcapkit/const/pcapng/filter_type.py +48 -0
  113. pcapkit/const/pcapng/hash_algorithm.py +59 -0
  114. pcapkit/const/pcapng/option_type.py +233 -0
  115. pcapkit/const/pcapng/record_type.py +57 -0
  116. pcapkit/const/pcapng/secrets_type.py +56 -0
  117. pcapkit/const/pcapng/verdict_type.py +53 -0
  118. pcapkit/const/reg/__init__.py +34 -0
  119. pcapkit/const/reg/apptype.py +32702 -0
  120. pcapkit/const/reg/ethertype.py +714 -0
  121. pcapkit/const/reg/linktype.py +902 -0
  122. pcapkit/const/reg/transtype.py +523 -0
  123. pcapkit/const/tcp/__init__.py +35 -0
  124. pcapkit/const/tcp/checksum.py +55 -0
  125. pcapkit/const/tcp/flags.py +73 -0
  126. pcapkit/const/tcp/mp_tcp_option.py +80 -0
  127. pcapkit/const/tcp/option.py +198 -0
  128. pcapkit/const/vlan/__init__.py +23 -0
  129. pcapkit/const/vlan/priority_level.py +71 -0
  130. pcapkit/corekit/__init__.py +59 -0
  131. pcapkit/corekit/fields/__init__.py +45 -0
  132. pcapkit/corekit/fields/collections.py +282 -0
  133. pcapkit/corekit/fields/field.py +269 -0
  134. pcapkit/corekit/fields/ipaddress.py +274 -0
  135. pcapkit/corekit/fields/misc.py +722 -0
  136. pcapkit/corekit/fields/numbers.py +375 -0
  137. pcapkit/corekit/fields/strings.py +245 -0
  138. pcapkit/corekit/infoclass.py +394 -0
  139. pcapkit/corekit/io.py +506 -0
  140. pcapkit/corekit/module.py +39 -0
  141. pcapkit/corekit/multidict.py +626 -0
  142. pcapkit/corekit/protochain.py +263 -0
  143. pcapkit/corekit/version.py +33 -0
  144. pcapkit/dumpkit/__init__.py +15 -0
  145. pcapkit/dumpkit/common.py +199 -0
  146. pcapkit/dumpkit/null.py +77 -0
  147. pcapkit/dumpkit/pcap.py +144 -0
  148. pcapkit/foundation/__init__.py +45 -0
  149. pcapkit/foundation/engines/__init__.py +36 -0
  150. pcapkit/foundation/engines/dpkt.py +230 -0
  151. pcapkit/foundation/engines/engine.py +194 -0
  152. pcapkit/foundation/engines/pcap.py +188 -0
  153. pcapkit/foundation/engines/pcapng.py +310 -0
  154. pcapkit/foundation/engines/pyshark.py +166 -0
  155. pcapkit/foundation/engines/scapy.py +161 -0
  156. pcapkit/foundation/extraction.py +915 -0
  157. pcapkit/foundation/reassembly/__init__.py +49 -0
  158. pcapkit/foundation/reassembly/data/__init__.py +48 -0
  159. pcapkit/foundation/reassembly/data/ip.py +117 -0
  160. pcapkit/foundation/reassembly/data/tcp.py +145 -0
  161. pcapkit/foundation/reassembly/ip.py +192 -0
  162. pcapkit/foundation/reassembly/ipv4.py +50 -0
  163. pcapkit/foundation/reassembly/ipv6.py +50 -0
  164. pcapkit/foundation/reassembly/reassembly.py +389 -0
  165. pcapkit/foundation/reassembly/tcp.py +249 -0
  166. pcapkit/foundation/registry/__init__.py +41 -0
  167. pcapkit/foundation/registry/foundation.py +327 -0
  168. pcapkit/foundation/registry/protocols.py +885 -0
  169. pcapkit/foundation/traceflow/__init__.py +44 -0
  170. pcapkit/foundation/traceflow/data/__init__.py +30 -0
  171. pcapkit/foundation/traceflow/data/tcp.py +105 -0
  172. pcapkit/foundation/traceflow/tcp.py +159 -0
  173. pcapkit/foundation/traceflow/traceflow.py +390 -0
  174. pcapkit/interface/__init__.py +22 -0
  175. pcapkit/interface/core.py +185 -0
  176. pcapkit/interface/misc.py +120 -0
  177. pcapkit/protocols/__init__.py +85 -0
  178. pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
  179. pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
  180. pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
  181. pcapkit/protocols/application/NotImplemented/dns.py +0 -0
  182. pcapkit/protocols/application/NotImplemented/imap.py +0 -0
  183. pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
  184. pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
  185. pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
  186. pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
  187. pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
  188. pcapkit/protocols/application/NotImplemented/pop.py +0 -0
  189. pcapkit/protocols/application/NotImplemented/rip.py +0 -0
  190. pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
  191. pcapkit/protocols/application/NotImplemented/sip.py +0 -0
  192. pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
  193. pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
  194. pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
  195. pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
  196. pcapkit/protocols/application/NotImplemented/tls.py +0 -0
  197. pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
  198. pcapkit/protocols/application/__init__.py +34 -0
  199. pcapkit/protocols/application/application.py +114 -0
  200. pcapkit/protocols/application/ftp.py +206 -0
  201. pcapkit/protocols/application/http.py +176 -0
  202. pcapkit/protocols/application/httpv1.py +320 -0
  203. pcapkit/protocols/application/httpv2.py +1255 -0
  204. pcapkit/protocols/data/__init__.py +192 -0
  205. pcapkit/protocols/data/application/__init__.py +57 -0
  206. pcapkit/protocols/data/application/ftp.py +59 -0
  207. pcapkit/protocols/data/application/httpv1.py +79 -0
  208. pcapkit/protocols/data/application/httpv2.py +293 -0
  209. pcapkit/protocols/data/data.py +25 -0
  210. pcapkit/protocols/data/internet/__init__.py +298 -0
  211. pcapkit/protocols/data/internet/ah.py +31 -0
  212. pcapkit/protocols/data/internet/hip.py +804 -0
  213. pcapkit/protocols/data/internet/hopopt.py +351 -0
  214. pcapkit/protocols/data/internet/ipv4.py +369 -0
  215. pcapkit/protocols/data/internet/ipv6.py +67 -0
  216. pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
  217. pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
  218. pcapkit/protocols/data/internet/ipv6_route.py +86 -0
  219. pcapkit/protocols/data/internet/ipx.py +56 -0
  220. pcapkit/protocols/data/internet/mh.py +509 -0
  221. pcapkit/protocols/data/link/__init__.py +33 -0
  222. pcapkit/protocols/data/link/arp.py +74 -0
  223. pcapkit/protocols/data/link/ethernet.py +28 -0
  224. pcapkit/protocols/data/link/l2tp.py +63 -0
  225. pcapkit/protocols/data/link/ospf.py +58 -0
  226. pcapkit/protocols/data/link/vlan.py +42 -0
  227. pcapkit/protocols/data/misc/__init__.py +109 -0
  228. pcapkit/protocols/data/misc/null.py +18 -0
  229. pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
  230. pcapkit/protocols/data/misc/pcap/frame.py +56 -0
  231. pcapkit/protocols/data/misc/pcap/header.py +53 -0
  232. pcapkit/protocols/data/misc/pcapng.py +925 -0
  233. pcapkit/protocols/data/misc/raw.py +25 -0
  234. pcapkit/protocols/data/protocol.py +32 -0
  235. pcapkit/protocols/data/transport/__init__.py +71 -0
  236. pcapkit/protocols/data/transport/tcp.py +555 -0
  237. pcapkit/protocols/data/transport/udp.py +29 -0
  238. pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
  239. pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
  240. pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
  241. pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
  242. pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
  243. pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
  244. pcapkit/protocols/internet/__init__.py +43 -0
  245. pcapkit/protocols/internet/ah.py +275 -0
  246. pcapkit/protocols/internet/hip.py +4727 -0
  247. pcapkit/protocols/internet/hopopt.py +1879 -0
  248. pcapkit/protocols/internet/internet.py +240 -0
  249. pcapkit/protocols/internet/ip.py +51 -0
  250. pcapkit/protocols/internet/ipsec.py +50 -0
  251. pcapkit/protocols/internet/ipv4.py +1782 -0
  252. pcapkit/protocols/internet/ipv6.py +361 -0
  253. pcapkit/protocols/internet/ipv6_frag.py +258 -0
  254. pcapkit/protocols/internet/ipv6_opts.py +1890 -0
  255. pcapkit/protocols/internet/ipv6_route.py +710 -0
  256. pcapkit/protocols/internet/ipx.py +230 -0
  257. pcapkit/protocols/internet/mh.py +2764 -0
  258. pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
  259. pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
  260. pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
  261. pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
  262. pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
  263. pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
  264. pcapkit/protocols/link/__init__.py +35 -0
  265. pcapkit/protocols/link/arp.py +421 -0
  266. pcapkit/protocols/link/ethernet.py +248 -0
  267. pcapkit/protocols/link/l2tp.py +267 -0
  268. pcapkit/protocols/link/link.py +140 -0
  269. pcapkit/protocols/link/ospf.py +342 -0
  270. pcapkit/protocols/link/rarp.py +82 -0
  271. pcapkit/protocols/link/vlan.py +225 -0
  272. pcapkit/protocols/misc/__init__.py +37 -0
  273. pcapkit/protocols/misc/null.py +129 -0
  274. pcapkit/protocols/misc/pcap/__init__.py +17 -0
  275. pcapkit/protocols/misc/pcap/frame.py +478 -0
  276. pcapkit/protocols/misc/pcap/header.py +358 -0
  277. pcapkit/protocols/misc/pcapng.py +5520 -0
  278. pcapkit/protocols/misc/raw.py +180 -0
  279. pcapkit/protocols/protocol.py +1216 -0
  280. pcapkit/protocols/schema/__init__.py +140 -0
  281. pcapkit/protocols/schema/application/__init__.py +40 -0
  282. pcapkit/protocols/schema/application/ftp.py +21 -0
  283. pcapkit/protocols/schema/application/httpv1.py +21 -0
  284. pcapkit/protocols/schema/application/httpv2.py +384 -0
  285. pcapkit/protocols/schema/internet/__init__.py +294 -0
  286. pcapkit/protocols/schema/internet/ah.py +40 -0
  287. pcapkit/protocols/schema/internet/hip.py +1184 -0
  288. pcapkit/protocols/schema/internet/hopopt.py +679 -0
  289. pcapkit/protocols/schema/internet/ipv4.py +576 -0
  290. pcapkit/protocols/schema/internet/ipv6.py +63 -0
  291. pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
  292. pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
  293. pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
  294. pcapkit/protocols/schema/internet/ipx.py +40 -0
  295. pcapkit/protocols/schema/internet/mh.py +718 -0
  296. pcapkit/protocols/schema/link/__init__.py +19 -0
  297. pcapkit/protocols/schema/link/arp.py +39 -0
  298. pcapkit/protocols/schema/link/ethernet.py +51 -0
  299. pcapkit/protocols/schema/link/l2tp.py +88 -0
  300. pcapkit/protocols/schema/link/ospf.py +90 -0
  301. pcapkit/protocols/schema/link/vlan.py +69 -0
  302. pcapkit/protocols/schema/misc/__init__.py +108 -0
  303. pcapkit/protocols/schema/misc/null.py +18 -0
  304. pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
  305. pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
  306. pcapkit/protocols/schema/misc/pcap/header.py +63 -0
  307. pcapkit/protocols/schema/misc/pcapng.py +1689 -0
  308. pcapkit/protocols/schema/misc/raw.py +24 -0
  309. pcapkit/protocols/schema/schema.py +809 -0
  310. pcapkit/protocols/schema/transport/__init__.py +69 -0
  311. pcapkit/protocols/schema/transport/tcp.py +928 -0
  312. pcapkit/protocols/schema/transport/udp.py +90 -0
  313. pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
  314. pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
  315. pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
  316. pcapkit/protocols/transport/__init__.py +27 -0
  317. pcapkit/protocols/transport/tcp.py +3025 -0
  318. pcapkit/protocols/transport/transport.py +158 -0
  319. pcapkit/protocols/transport/udp.py +214 -0
  320. pcapkit/py.typed +0 -0
  321. pcapkit/toolkit/__init__.py +57 -0
  322. pcapkit/toolkit/dpkt.py +306 -0
  323. pcapkit/toolkit/pcap.py +212 -0
  324. pcapkit/toolkit/pcapng.py +251 -0
  325. pcapkit/toolkit/pyshark.py +99 -0
  326. pcapkit/toolkit/scapy.py +297 -0
  327. pcapkit/utilities/__init__.py +20 -0
  328. pcapkit/utilities/compat.py +196 -0
  329. pcapkit/utilities/decorators.py +192 -0
  330. pcapkit/utilities/exceptions.py +365 -0
  331. pcapkit/utilities/logging.py +55 -0
  332. pcapkit/utilities/warnings.py +185 -0
  333. pcapkit/vendor/__init__.py +105 -0
  334. pcapkit/vendor/__main__.py +92 -0
  335. pcapkit/vendor/arp/__init__.py +27 -0
  336. pcapkit/vendor/arp/hardware.py +29 -0
  337. pcapkit/vendor/arp/operation.py +29 -0
  338. pcapkit/vendor/default.py +474 -0
  339. pcapkit/vendor/ftp/__init__.py +27 -0
  340. pcapkit/vendor/ftp/command.py +244 -0
  341. pcapkit/vendor/ftp/return_code.py +256 -0
  342. pcapkit/vendor/hip/__init__.py +94 -0
  343. pcapkit/vendor/hip/certificate.py +29 -0
  344. pcapkit/vendor/hip/cipher.py +29 -0
  345. pcapkit/vendor/hip/di.py +29 -0
  346. pcapkit/vendor/hip/ecdsa_curve.py +29 -0
  347. pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
  348. pcapkit/vendor/hip/eddsa_curve.py +85 -0
  349. pcapkit/vendor/hip/esp_transform_suite.py +29 -0
  350. pcapkit/vendor/hip/group.py +87 -0
  351. pcapkit/vendor/hip/hi_algorithm.py +29 -0
  352. pcapkit/vendor/hip/hit_suite.py +29 -0
  353. pcapkit/vendor/hip/nat_traversal.py +29 -0
  354. pcapkit/vendor/hip/notify_message.py +29 -0
  355. pcapkit/vendor/hip/packet.py +88 -0
  356. pcapkit/vendor/hip/parameter.py +88 -0
  357. pcapkit/vendor/hip/registration.py +29 -0
  358. pcapkit/vendor/hip/registration_failure.py +29 -0
  359. pcapkit/vendor/hip/suite.py +29 -0
  360. pcapkit/vendor/hip/transport.py +29 -0
  361. pcapkit/vendor/http/__init__.py +39 -0
  362. pcapkit/vendor/http/error_code.py +95 -0
  363. pcapkit/vendor/http/frame.py +91 -0
  364. pcapkit/vendor/http/method.py +167 -0
  365. pcapkit/vendor/http/setting.py +93 -0
  366. pcapkit/vendor/http/status_code.py +185 -0
  367. pcapkit/vendor/ipv4/__init__.py +57 -0
  368. pcapkit/vendor/ipv4/classification_level.py +91 -0
  369. pcapkit/vendor/ipv4/option_class.py +80 -0
  370. pcapkit/vendor/ipv4/option_number.py +105 -0
  371. pcapkit/vendor/ipv4/protection_authority.py +84 -0
  372. pcapkit/vendor/ipv4/qs_function.py +78 -0
  373. pcapkit/vendor/ipv4/router_alert.py +93 -0
  374. pcapkit/vendor/ipv4/tos_del.py +78 -0
  375. pcapkit/vendor/ipv4/tos_ecn.py +95 -0
  376. pcapkit/vendor/ipv4/tos_pre.py +84 -0
  377. pcapkit/vendor/ipv4/tos_rel.py +78 -0
  378. pcapkit/vendor/ipv4/tos_thr.py +77 -0
  379. pcapkit/vendor/ipv4/ts_flag.py +79 -0
  380. pcapkit/vendor/ipv6/__init__.py +53 -0
  381. pcapkit/vendor/ipv6/extension_header.py +171 -0
  382. pcapkit/vendor/ipv6/option.py +104 -0
  383. pcapkit/vendor/ipv6/option_action.py +90 -0
  384. pcapkit/vendor/ipv6/qs_function.py +78 -0
  385. pcapkit/vendor/ipv6/router_alert.py +93 -0
  386. pcapkit/vendor/ipv6/routing.py +87 -0
  387. pcapkit/vendor/ipv6/seed_id.py +81 -0
  388. pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
  389. pcapkit/vendor/ipv6/tagger_id.py +81 -0
  390. pcapkit/vendor/ipx/__init__.py +37 -0
  391. pcapkit/vendor/ipx/packet.py +123 -0
  392. pcapkit/vendor/ipx/socket.py +125 -0
  393. pcapkit/vendor/l2tp/__init__.py +21 -0
  394. pcapkit/vendor/l2tp/type.py +78 -0
  395. pcapkit/vendor/mh/__init__.py +204 -0
  396. pcapkit/vendor/mh/access_type.py +87 -0
  397. pcapkit/vendor/mh/ack_status_code.py +88 -0
  398. pcapkit/vendor/mh/ani_suboption.py +88 -0
  399. pcapkit/vendor/mh/auth_subtype.py +83 -0
  400. pcapkit/vendor/mh/binding_ack_flag.py +148 -0
  401. pcapkit/vendor/mh/binding_error.py +78 -0
  402. pcapkit/vendor/mh/binding_revocation.py +87 -0
  403. pcapkit/vendor/mh/binding_update_flag.py +147 -0
  404. pcapkit/vendor/mh/cga_extension.py +91 -0
  405. pcapkit/vendor/mh/cga_sec.py +91 -0
  406. pcapkit/vendor/mh/cga_type.py +74 -0
  407. pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
  408. pcapkit/vendor/mh/dns_status_code.py +87 -0
  409. pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
  410. pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
  411. pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
  412. pcapkit/vendor/mh/fb_ack_status.py +87 -0
  413. pcapkit/vendor/mh/fb_action.py +88 -0
  414. pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
  415. pcapkit/vendor/mh/fb_type.py +88 -0
  416. pcapkit/vendor/mh/flow_id_status.py +87 -0
  417. pcapkit/vendor/mh/flow_id_suboption.py +87 -0
  418. pcapkit/vendor/mh/handoff_type.py +87 -0
  419. pcapkit/vendor/mh/handover_ack_flag.py +143 -0
  420. pcapkit/vendor/mh/handover_ack_status.py +87 -0
  421. pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
  422. pcapkit/vendor/mh/handover_initiate_status.py +87 -0
  423. pcapkit/vendor/mh/home_address_reply.py +87 -0
  424. pcapkit/vendor/mh/lla_code.py +97 -0
  425. pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
  426. pcapkit/vendor/mh/mn_group_id.py +87 -0
  427. pcapkit/vendor/mh/mn_id_subtype.py +87 -0
  428. pcapkit/vendor/mh/operator_id.py +87 -0
  429. pcapkit/vendor/mh/option.py +83 -0
  430. pcapkit/vendor/mh/packet.py +82 -0
  431. pcapkit/vendor/mh/qos_attribute.py +87 -0
  432. pcapkit/vendor/mh/revocation_status_code.py +87 -0
  433. pcapkit/vendor/mh/revocation_trigger.py +87 -0
  434. pcapkit/vendor/mh/status_code.py +91 -0
  435. pcapkit/vendor/mh/traffic_selector.py +87 -0
  436. pcapkit/vendor/mh/upa_status.py +87 -0
  437. pcapkit/vendor/mh/upn_reason.py +87 -0
  438. pcapkit/vendor/ospf/__init__.py +27 -0
  439. pcapkit/vendor/ospf/authentication.py +29 -0
  440. pcapkit/vendor/ospf/packet.py +29 -0
  441. pcapkit/vendor/pcapng/__init__.py +51 -0
  442. pcapkit/vendor/pcapng/block_type.py +94 -0
  443. pcapkit/vendor/pcapng/filter_type.py +77 -0
  444. pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
  445. pcapkit/vendor/pcapng/option_type.py +287 -0
  446. pcapkit/vendor/pcapng/record_type.py +81 -0
  447. pcapkit/vendor/pcapng/secrets_type.py +81 -0
  448. pcapkit/vendor/pcapng/verdict_type.py +79 -0
  449. pcapkit/vendor/reg/__init__.py +34 -0
  450. pcapkit/vendor/reg/apptype.py +338 -0
  451. pcapkit/vendor/reg/ethertype.py +121 -0
  452. pcapkit/vendor/reg/linktype.py +110 -0
  453. pcapkit/vendor/reg/transtype.py +111 -0
  454. pcapkit/vendor/tcp/__init__.py +35 -0
  455. pcapkit/vendor/tcp/checksum.py +80 -0
  456. pcapkit/vendor/tcp/flags.py +149 -0
  457. pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
  458. pcapkit/vendor/tcp/option.py +103 -0
  459. pcapkit/vendor/vlan/__init__.py +23 -0
  460. pcapkit/vendor/vlan/priority_level.py +97 -0
  461. pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
  462. pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
  463. pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
  464. pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
  465. pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
  466. pypcapkit-1.3.3.post1.dist-info/top_level.txt +1 -0
@@ -0,0 +1,39 @@
1
+ # -*- coding: utf-8 -*-
2
+ # pylint: disable=unused-import
3
+ r""":class:`~pcapkit.protocols.application.http.HTTP` Vendor Crawlers
4
+ ========================================================================
5
+
6
+ .. module:: pcapkit.vendor.http
7
+
8
+ This module contains all vendor crawlers of
9
+ :class:`~pcapkit.protocols.application.http.HTTP` implementations. Available
10
+ crawlers include:
11
+
12
+ .. list-table::
13
+
14
+ * - :class:`HTTP_ErrorCode <pcapkit.vendor.http.error_code.ErrorCode>`
15
+ - HTTP/2 Error Code [*]_
16
+ * - :class:`HTTP_Frame <pcapkit.vendor.http.frame.Frame>`
17
+ - HTTP/2 Frame Type [*]_
18
+ * - :class:`HTTP_Method <pcapkit.vendor.http.method.Method>`
19
+ - HTTP/1.\* Method [*]_
20
+ * - :class:`HTTP_Setting <pcapkit.vendor.http.setting.Setting>`
21
+ - HTTP/2 Settings [*]_
22
+ * - :class:`HTTP_Status <pcapkit.vendor.http.status_code.StatusCode>`
23
+ - HTTP/1.\* Status Code [*]_
24
+
25
+ .. [*] https://www.iana.org/assignments/http2-parameters/http2-parameters.xhtml#error-code
26
+ .. [*] https://www.iana.org/assignments/http2-parameters/http2-parameters.xhtml#frame-type
27
+ .. [*] https://www.iana.org/assignments/http-methods/http-methods.xhtml#methods
28
+ .. [*] https://www.iana.org/assignments/http2-parameters/http2-parameters.xhtml#settings
29
+ .. [*] https://www.iana.org/assignments/http-status-codes/http-status-codes.xhtml#http-status-codes-1
30
+
31
+ """
32
+
33
+ from pcapkit.vendor.http.error_code import ErrorCode as HTTP_ErrorCode
34
+ from pcapkit.vendor.http.frame import Frame as HTTP_Frame
35
+ from pcapkit.vendor.http.method import Method as HTTP_Method
36
+ from pcapkit.vendor.http.setting import Setting as HTTP_Setting
37
+ from pcapkit.vendor.http.status_code import StatusCode as HTTP_StatusCode
38
+
39
+ __all__ = ['HTTP_ErrorCode', 'HTTP_Frame', 'HTTP_Method', 'HTTP_Setting', 'HTTP_StatusCode']
@@ -0,0 +1,95 @@
1
+ # -*- coding: utf-8 -*-
2
+ """HTTP/2 Error Code
3
+ =======================
4
+
5
+ .. module:: pcapkit.vendor.http.error_code
6
+
7
+ This module contains the vendor crawler for **HTTP/2 Error Code**,
8
+ which is automatically generating :class:`pcapkit.const.http.error_code.ErrorCode`.
9
+
10
+ """
11
+
12
+ import csv
13
+ import re
14
+ import sys
15
+
16
+ from pcapkit.vendor.default import Vendor
17
+
18
+ __all__ = ['ErrorCode']
19
+
20
+
21
+ def hexlify(code: 'int') -> 'str':
22
+ """Convert code to hex form."""
23
+ # temp = hex(code)[2:].upper().zfill(8)
24
+ # return f'0x{temp[:4]}_{temp[4:]}'
25
+ return f'0x{hex(code)[2:].upper().zfill(8)}'
26
+
27
+
28
+ class ErrorCode(Vendor):
29
+ """HTTP/2 Error Code"""
30
+
31
+ #: Value limit checker.
32
+ FLAG = 'isinstance(value, int) and 0x00000000 <= value <= 0xFFFFFFFF'
33
+ #: Link to registry.
34
+ LINK = 'https://www.iana.org/assignments/http2-parameters/error-code.csv'
35
+
36
+ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
37
+ """Process CSV data.
38
+
39
+ Args:
40
+ data: CSV data.
41
+
42
+ Returns:
43
+ Enumeration fields and missing fields.
44
+
45
+ """
46
+ reader = csv.reader(data)
47
+ next(reader) # header
48
+
49
+ enum = [] # type: list[str]
50
+ miss = [] # type: list[str]
51
+ for item in reader:
52
+ name = item[1]
53
+ dscp = item[2]
54
+ rfcs = item[3]
55
+
56
+ temp = [] # type: list[str]
57
+ for rfc in filter(None, re.split(r'\[|\]', rfcs)):
58
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
59
+ #temp.append(f'[{rfc[:3]} {rfc[3:]}]')
60
+ temp_split = rfc[3:].split(', ', maxsplit=1)
61
+ if len(temp_split) > 1:
62
+ temp.append(f'[:rfc:`{temp_split[0]}#{temp_split[1].lower()}`]'.replace(' ', '-'))
63
+ else:
64
+ temp.append(f'[:rfc:`{temp_split[0]}`]')
65
+ else:
66
+ temp.append(f'[{rfc}]'.replace('_', ' '))
67
+ tmp1 = f" {''.join(temp)}" if rfcs else ''
68
+ dscp = f', {dscp}' if dscp else ''
69
+ desc = self.wrap_comment(f'{name}{dscp}{tmp1}')
70
+
71
+ try:
72
+ tmp2 = int(item[0], base=16)
73
+ code = hexlify(tmp2)
74
+ renm = self.rename(name, code)
75
+
76
+ pres = f'{renm} = {code}'
77
+ sufs = f'#: {desc}'
78
+
79
+ #if len(pres) > 74:
80
+ # sufs = f"\n{' '*80}{sufs}"
81
+
82
+ #enum.append(f'{pres.ljust(76)}{sufs}')
83
+ enum.append(f'{sufs}\n {pres}')
84
+ except ValueError:
85
+ start, stop = map(lambda s: int(s, base=16), item[0].split('-'))
86
+
87
+ miss.append(f'if {hexlify(start)} <= value <= {hexlify(stop)}:')
88
+ miss.append(f' #: {desc}')
89
+ miss.append(f' temp = hex(value)[2:].upper().zfill(8)')
90
+ miss.append(f" return extend_enum(cls, '{self.safe_name(name)}_0x%s' % (temp[:4]+'_'+temp[4:]), value)")
91
+ return enum, miss
92
+
93
+
94
+ if __name__ == '__main__':
95
+ sys.exit(ErrorCode()) # type: ignore[arg-type]
@@ -0,0 +1,91 @@
1
+ # -*- coding: utf-8 -*-
2
+ """HTTP/2 Frame Type
3
+ =======================
4
+
5
+ .. module:: pcapkit.vendor.http.frame
6
+
7
+ This module contains the vendor crawler for **HTTP/2 Frame Type**,
8
+ which is automatically generating :class:`pcapkit.const.http.frame.Frame`.
9
+
10
+ """
11
+
12
+ import csv
13
+ import re
14
+ import sys
15
+
16
+ from pcapkit.vendor.default import Vendor
17
+
18
+ __all__ = ['Frame']
19
+
20
+
21
+ def hexlify(code: 'int') -> 'str':
22
+ """Convert code to hex form."""
23
+ return f'0x{hex(code)[2:].upper().zfill(2)}'
24
+
25
+
26
+ class Frame(Vendor):
27
+ """HTTP/2 Frame Type"""
28
+
29
+ #: Value limit checker.
30
+ FLAG = 'isinstance(value, int) and 0x00 <= value <= 0xFF'
31
+ #: Link to registry.
32
+ LINK = 'https://www.iana.org/assignments/http2-parameters/frame-type.csv'
33
+
34
+ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
35
+ """Process CSV data.
36
+
37
+ Args:
38
+ data: CSV data.
39
+
40
+ Returns:
41
+ Enumeration fields and missing fields.
42
+
43
+ """
44
+ reader = csv.reader(data)
45
+ next(reader) # header
46
+
47
+ enum = [] # type: list[str]
48
+ miss = [] # type: list[str]
49
+ for item in reader:
50
+ name = item[1]
51
+ rfcs = item[2]
52
+
53
+ temp = [] # type: list[str]
54
+ for rfc in filter(None, re.split(r'\[|\]', rfcs)):
55
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
56
+ #temp.append(f'[{rfc[:3]} {rfc[3:]}]')
57
+ temp_split = rfc[3:].split(', ', maxsplit=1)
58
+ if len(temp_split) > 1:
59
+ temp.append(f'[:rfc:`{temp_split[0]}#{temp_split[1].lower()}`]'.replace(' ', '-'))
60
+ else:
61
+ temp.append(f'[:rfc:`{temp_split[0]}`]')
62
+ else:
63
+ temp.append(f'[{rfc}]'.replace('_', ' '))
64
+ desc = self.wrap_comment(re.sub(r'\r*\n', ' ', '``%s`` %s' % ( # pylint: disable=consider-using-f-string
65
+ name, ''.join(temp) if rfcs else '',
66
+ ), re.MULTILINE))
67
+
68
+ try:
69
+ tmp1 = int(item[0], base=16)
70
+ code = hexlify(tmp1)
71
+ renm = self.rename(name, code)
72
+
73
+ pres = f"{renm} = {code}"
74
+ sufs = f'#: {desc}'
75
+
76
+ #if len(pres) > 74:
77
+ # sufs = f"\n{' '*80}{sufs}"
78
+
79
+ #enum.append(f'{pres.ljust(76)}{sufs}')
80
+ enum.append(f'{sufs}\n {pres}')
81
+ except ValueError:
82
+ start, stop = map(lambda s: int(s, base=16), item[0].split('-'))
83
+
84
+ miss.append(f'if {hexlify(start)} <= value <= {hexlify(stop)}:')
85
+ miss.append(f' #: {desc}')
86
+ miss.append(f" return extend_enum(cls, '{name}_0x%s' % hex(value)[2:].upper().zfill(2), value)")
87
+ return enum, miss
88
+
89
+
90
+ if __name__ == '__main__':
91
+ sys.exit(Frame()) # type: ignore[arg-type]
@@ -0,0 +1,167 @@
1
+ # -*- coding: utf-8 -*-
2
+ """HTTP Method
3
+ =================
4
+
5
+ .. module:: pcapkit.vendor.http.method
6
+
7
+ This module contains the vendor crawler for **HTTP Method**,
8
+ which is automatically generating :class:`pcapkit.const.http.method.Method`.
9
+
10
+ """
11
+ import csv
12
+ import re
13
+ import sys
14
+ from typing import TYPE_CHECKING
15
+
16
+ from pcapkit.vendor.default import Vendor
17
+
18
+ if TYPE_CHECKING:
19
+ from typing import Callable
20
+
21
+ __all__ = ['Method']
22
+
23
+ #: Default constant template of enumerate registry from IANA CSV.
24
+ LINE = lambda NAME, DOCS, ENUM, MODL: f'''\
25
+ # -*- coding: utf-8 -*-
26
+ # pylint: disable=line-too-long,consider-using-f-string
27
+ """{(name := DOCS.split(' [', maxsplit=1)[0])}
28
+ {'=' * (len(name) + 6)}
29
+
30
+ .. module:: {MODL.replace('vendor', 'const')}
31
+
32
+ This module contains the constant enumeration for **{name}**,
33
+ which is automatically generated from :class:`{MODL}.{NAME}`.
34
+
35
+ """
36
+
37
+ from typing import TYPE_CHECKING
38
+
39
+ from aenum import StrEnum, extend_enum
40
+
41
+ if TYPE_CHECKING:
42
+ from typing import Optional, Type
43
+
44
+ __all__ = ['{NAME}']
45
+
46
+ class {NAME}(StrEnum):
47
+ """[{NAME}] {DOCS}"""
48
+
49
+ if TYPE_CHECKING:
50
+ #: Safe method.
51
+ safe: 'bool'
52
+ #: Idempotent method.
53
+ idempotent: 'bool'
54
+
55
+ def __new__(cls, value: 'str', safe: 'bool' = False,
56
+ idempotent: 'bool' = False) -> 'Type[{NAME}]':
57
+ obj = str.__new__(cls)
58
+ obj._value_ = value
59
+
60
+ obj.safe = safe
61
+ obj.idempotent = idempotent
62
+
63
+ return obj
64
+
65
+ def __repr__(self) -> 'str':
66
+ return "<%s.%s>" % (self.__class__.__name__, self._value_)
67
+
68
+ {ENUM}
69
+
70
+ @staticmethod
71
+ def get(key: 'str', default: 'Optional[str]' = None) -> '{NAME}':
72
+ """Backport support for original codes.
73
+
74
+ Args:
75
+ key: Key to get enum item.
76
+ default: Default value if not found.
77
+
78
+ :meta private:
79
+ """
80
+ if key not in {NAME}._member_map_: # pylint: disable=no-member
81
+ return extend_enum({NAME}, key.upper(), default if default is not None else key)
82
+ return {NAME}[key] # type: ignore[misc]
83
+
84
+ @classmethod
85
+ def _missing_(cls, value: 'str') -> '{NAME}':
86
+ """Lookup function used when value is not found.
87
+
88
+ Args:
89
+ value: Value to get enum item.
90
+
91
+ """
92
+ return extend_enum(cls, value.upper(), value)
93
+ '''.strip() # type: Callable[[str, str, str, str], str]
94
+
95
+
96
+ class Method(Vendor):
97
+ """HTTP Method"""
98
+
99
+ #: Link to registry.
100
+ LINK = 'https://www.iana.org/assignments/http-methods/methods.csv'
101
+
102
+ def process(self, data: 'list[str]') -> 'list[str]': # type: ignore[override]
103
+ """Process CSV data.
104
+
105
+ Args:
106
+ data: CSV data.
107
+
108
+ Returns:
109
+ Enumeration fields.
110
+
111
+ """
112
+ reader = csv.reader(data)
113
+ next(reader) # header
114
+
115
+ enum = [] # type: list[str]
116
+ for item in reader:
117
+ meth = item[0]
118
+ if meth == '*':
119
+ continue
120
+
121
+ safe = item[1]
122
+ idem = item[2]
123
+ rfcs = item[3]
124
+
125
+ temp = [] # type: list[str]
126
+ for rfc in filter(None, re.split(r'\[|\]', rfcs)):
127
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
128
+ #temp.append(f'[{rfc[:3]} {rfc[3:]}]')
129
+ temp_split = rfc[3:].split(', ', maxsplit=1)
130
+ if len(temp_split) > 1:
131
+ temp.append(f'[:rfc:`{temp_split[0]}#{temp_split[1].lower()}`]'.replace(' ', '-'))
132
+ else:
133
+ temp.append(f'[:rfc:`{temp_split[0]}`]')
134
+ else:
135
+ temp.append(f'[{rfc}]'.replace('_', ' '))
136
+ desc = self.wrap_comment(re.sub(r'\r*\n', ' ', '%s %s' % ( # pylint: disable=consider-using-f-string
137
+ meth, ''.join(temp) if rfcs else '',
138
+ ), re.MULTILINE))
139
+
140
+ name = self.safe_name(meth).upper()
141
+ safe_flag = 'True' if safe == 'yes' else 'False'
142
+ idem_flag = 'True' if idem == 'yes' else 'False'
143
+
144
+ pres = f"{name} = {meth!r}, {safe_flag}, {idem_flag}"
145
+ sufs = f'#: {desc}'
146
+
147
+ enum.append(f'{sufs}\n {pres}')
148
+ return enum
149
+
150
+ def context(self, data: 'list[str]') -> 'str':
151
+ """Generate constant context.
152
+
153
+ Args:
154
+ data: CSV data.
155
+
156
+ Returns:
157
+ Constant context.
158
+
159
+ """
160
+ enum = self.process(data)
161
+ ENUM = '\n\n '.join(map(lambda s: s.rstrip(), enum)).strip()
162
+
163
+ return LINE(self.NAME, self.DOCS, ENUM, self.__module__)
164
+
165
+
166
+ if __name__ == '__main__':
167
+ sys.exit(Method()) # type: ignore[arg-type]
@@ -0,0 +1,93 @@
1
+ # -*- coding: utf-8 -*-
2
+ """HTTP/2 Settings
3
+ =====================
4
+
5
+ .. module:: pcapkit.vendor.http.setting
6
+
7
+ This module contains the vendor crawler for **HTTP/2 Settings**,
8
+ which is automatically generating :class:`pcapkit.const.http.setting.Setting`.
9
+
10
+ """
11
+
12
+ import csv
13
+ import re
14
+ import sys
15
+
16
+ from pcapkit.vendor.default import Vendor
17
+
18
+ __all__ = ['Setting']
19
+
20
+
21
+ def hexlify(code: 'int') -> 'str':
22
+ """Convert code to hex form."""
23
+ return f'0x{hex(code)[2:].upper().zfill(4)}'
24
+
25
+
26
+ class Setting(Vendor):
27
+ """HTTP/2 Settings"""
28
+
29
+ #: Value limit checker.
30
+ FLAG = 'isinstance(value, int) and 0x0000 <= value <= 0xFFFF'
31
+ #: Link to registry.
32
+ LINK = 'https://www.iana.org/assignments/http2-parameters/settings.csv'
33
+
34
+ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
35
+ """Process CSV data.
36
+
37
+ Args:
38
+ data: CSV data.
39
+
40
+ Returns:
41
+ Enumeration fields and missing fields.
42
+
43
+ """
44
+ reader = csv.reader(data)
45
+ next(reader) # header
46
+
47
+ enum = [] # type: list[str]
48
+ miss = [] # type: list[str]
49
+ for item in reader:
50
+ name = item[1]
51
+ dscp = item[2]
52
+ rfcs = item[3]
53
+
54
+ temp = [] # type: list[str]
55
+ for rfc in filter(None, re.split(r'\[|\]', rfcs)):
56
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
57
+ #temp.append(f'[{rfc[:3]} {rfc[3:]}]')
58
+ temp_split = rfc[3:].split(', ', maxsplit=1)
59
+ if len(temp_split) > 1:
60
+ temp.append(f'[:rfc:`{temp_split[0]}#{temp_split[1].lower()}`]'.replace(' ', '-'))
61
+ else:
62
+ temp.append(f'[:rfc:`{temp_split[0]}`]')
63
+ else:
64
+ temp.append(f'[{rfc}]'.replace('_', ' '))
65
+ tmp1 = f" {''.join(temp)}" if rfcs else ''
66
+ subs = re.sub(r'\(|\)', '', dscp)
67
+ dscp = f' (Initial Value: {subs})' if subs else ''
68
+ desc = self.wrap_comment(f'``{name}``{tmp1}{dscp}')
69
+
70
+ try:
71
+ tmp2 = int(item[0], base=16)
72
+ code = hexlify(tmp2)
73
+ renm = self.rename(name, code)
74
+
75
+ pres = f"{renm} = {code}"
76
+ sufs = f'#: {desc}'
77
+
78
+ #if len(pres) > 74:
79
+ # sufs = f"\n{' '*80}{sufs}"
80
+
81
+ #enum.append(f'{pres.ljust(76)}{sufs}')
82
+ enum.append(f'{sufs}\n {pres}')
83
+ except ValueError:
84
+ start, stop = map(lambda s: int(s, base=16), item[0].split('-'))
85
+
86
+ miss.append(f'if {hexlify(start)} <= value <= {hexlify(stop)}:')
87
+ miss.append(f' #: {desc}')
88
+ miss.append(f" return extend_enum(cls, '{self.safe_name(name)}_0x%s' % hex(value)[2:].upper().zfill(4), value)") # pylint: disable=line-too-long
89
+ return enum, miss
90
+
91
+
92
+ if __name__ == '__main__':
93
+ sys.exit(Setting()) # type: ignore[arg-type]
@@ -0,0 +1,185 @@
1
+ # -*- coding: utf-8 -*-
2
+ """HTTP Status Code
3
+ ======================
4
+
5
+ .. module:: pcapkit.vendor.http.status_code
6
+
7
+ This module contains the vendor crawler for **HTTP Status Code**,
8
+ which is automatically generating :class:`pcapkit.const.http.status_code.StatusCode`.
9
+
10
+ """
11
+ import csv
12
+ import re
13
+ import sys
14
+ from typing import TYPE_CHECKING
15
+
16
+ from pcapkit.vendor.default import Vendor
17
+
18
+ if TYPE_CHECKING:
19
+ from typing import Callable
20
+
21
+ __all__ = ['StatusCode']
22
+
23
+
24
+ #: Default constant template of enumerate registry from IANA CSV.
25
+ LINE = lambda NAME, DOCS, FLAG, ENUM, MISS, MODL: f'''\
26
+ # -*- coding: utf-8 -*-
27
+ # mypy: disable-error-code=assignment
28
+ # pylint: disable=line-too-long,consider-using-f-string
29
+ """{(name := DOCS.split(' [', maxsplit=1)[0])}
30
+ {'=' * (len(name) + 6)}
31
+
32
+ .. module:: {MODL.replace('vendor', 'const')}
33
+
34
+ This module contains the constant enumeration for **{name}**,
35
+ which is automatically generated from :class:`{MODL}.{NAME}`.
36
+
37
+ """
38
+
39
+ from typing import TYPE_CHECKING
40
+
41
+ from aenum import IntEnum, extend_enum
42
+
43
+ if TYPE_CHECKING:
44
+ from typing import Type
45
+
46
+ __all__ = ['{NAME}']
47
+
48
+
49
+ class {NAME}(IntEnum):
50
+ """[{NAME}] {DOCS}"""
51
+
52
+ if TYPE_CHECKING:
53
+ #: Status message.
54
+ message: 'str'
55
+
56
+ def __new__(cls, value: 'int', message: 'str' = '(Unknown)') -> 'Type[{NAME}]':
57
+ obj = int.__new__(cls, value)
58
+ obj._value_ = value
59
+
60
+ obj.message = message
61
+
62
+ return obj
63
+
64
+ def __repr__(self) -> 'str':
65
+ return "<%s [%s]>" % (self.__class__.__name__, self._value_)
66
+
67
+ def __str__(self) -> 'str':
68
+ return "[%s] %s" % (self._value_, self.message)
69
+
70
+ {ENUM}
71
+
72
+ @staticmethod
73
+ def get(key: 'int | str', default: 'int' = -1) -> '{NAME}':
74
+ """Backport support for original codes.
75
+
76
+ Args:
77
+ key: Key to get enum item.
78
+ default: Default value if not found.
79
+
80
+ :meta private:
81
+ """
82
+ if isinstance(key, int):
83
+ return {NAME}(key)
84
+ if key not in {NAME}._member_map_: # pylint: disable=no-member
85
+ extend_enum({NAME}, key, default)
86
+ return {NAME}[key] # type: ignore[misc]
87
+
88
+ @classmethod
89
+ def _missing_(cls, value: 'int') -> '{NAME}':
90
+ """Lookup function used when value is not found.
91
+
92
+ Args:
93
+ value: Value to get enum item.
94
+
95
+ """
96
+ if not ({FLAG}):
97
+ raise ValueError('%r is not a valid %s' % (value, cls.__name__))
98
+ {MISS}
99
+ {'' if (test := ''.join(MISS.splitlines()[-1:])).startswith('return') or test[8:].startswith('return') else 'return super()._missing_(value)'}
100
+ '''.strip() # type: Callable[[str, str, str, str, str, str], str]
101
+
102
+
103
+ class StatusCode(Vendor):
104
+ """HTTP Status Code"""
105
+
106
+ #: Value limit checker.
107
+ FLAG = 'isinstance(value, int) and 100 <= value <= 599'
108
+ #: Link to registry.
109
+ LINK = 'https://www.iana.org/assignments/http-status-codes/http-status-codes-1.csv'
110
+
111
+ def process(self, data: 'list[str]') -> 'tuple[list[str], list[str]]':
112
+ """Process CSV data.
113
+
114
+ Args:
115
+ data: CSV data.
116
+
117
+ Returns:
118
+ Enumeration fields and missing fields.
119
+
120
+ """
121
+ reader = csv.reader(data)
122
+ next(reader)
123
+
124
+ enum = [] # type: list[str]
125
+ miss = [] # type: list[str]
126
+ for item in reader:
127
+ name = item[1]
128
+ rfcs = item[2]
129
+
130
+ temp = [] # type: list[str]
131
+ for rfc in filter(None, re.split(r'\[|\]', rfcs)):
132
+ if 'RFC' in rfc and re.match(r'\d+', rfc[3:]):
133
+ #temp.append(f'[{rfc[:3]} {rfc[3:]}]')
134
+ temp_split = rfc[3:].split(', ', maxsplit=1)
135
+ if len(temp_split) > 1:
136
+ temp.append(f'[:rfc:`{temp_split[0]}#{temp_split[1].lower()}`]'.replace(' ', '-'))
137
+ else:
138
+ temp.append(f'[:rfc:`{temp_split[0]}`]')
139
+ else:
140
+ temp.append(f'[{rfc}]'.replace('_', ' '))
141
+ desc = self.wrap_comment(re.sub(r'\r*\n', ' ', '%s %s' % ( # pylint: disable=consider-using-f-string
142
+ name, ''.join(temp) if rfcs else '',
143
+ ), re.MULTILINE))
144
+
145
+ try:
146
+ code, _ = item[0], int(item[0])
147
+ if name != '(Unused)':
148
+ name = re.sub(r'\(.*\)', '', name).strip()
149
+
150
+ pres = f'CODE_{code} = {code}, {name!r}'
151
+ sufs = f'#: {desc}'
152
+
153
+ #if len(pres) > 74:
154
+ # sufs = f"\n{' '*80}{sufs}"
155
+
156
+ #enum.append(f'{pres.ljust(76)}{sufs}')
157
+ enum.append(f'{sufs}\n {pres}')
158
+ except ValueError:
159
+ start, stop = item[0].split('-')
160
+
161
+ miss.append(f'if {start} <= value <= {stop}:')
162
+ miss.append(f' #: {desc}')
163
+ miss.append(f" return extend_enum(cls, 'CODE_%d' % value, value, {name!r})")
164
+ return enum, miss
165
+
166
+ def context(self, data: 'list[str]') -> 'str':
167
+ """Generate constant context.
168
+
169
+ Args:
170
+ data: CSV data.
171
+
172
+ Returns:
173
+ Constant context.
174
+
175
+ """
176
+ enum, miss = self.process(data)
177
+
178
+ ENUM = '\n\n '.join(map(lambda s: s.rstrip(), enum)).strip()
179
+ MISS = '\n '.join(map(lambda s: s.rstrip(), miss)).strip()
180
+
181
+ return LINE(self.NAME, self.DOCS, self.FLAG, ENUM, MISS, self.__module__)
182
+
183
+
184
+ if __name__ == '__main__':
185
+ sys.exit(StatusCode()) # type: ignore[arg-type]