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,263 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Protocol Chain
3
+ ====================
4
+
5
+ .. module:: pcapkit.corekit.protochain
6
+
7
+ :mod:`pcapkit.corekit.protochain` contains special protocol
8
+ collection class :class:`~pcapkit.corekit.protochain.ProtoChain`.
9
+
10
+ """
11
+ import collections.abc
12
+ import copy
13
+ from typing import TYPE_CHECKING, overload
14
+
15
+ from pcapkit.utilities.compat import cached_property
16
+ from pcapkit.utilities.exceptions import IndexNotFound
17
+
18
+ if TYPE_CHECKING:
19
+ from typing import Iterator, Optional, Type
20
+
21
+ from typing_extensions import Self
22
+
23
+ from pcapkit.protocols.protocol import ProtocolBase as Protocol
24
+
25
+ __all__ = ['ProtoChain']
26
+
27
+
28
+ class ProtoChain(collections.abc.Sequence):
29
+ """Protocols chain.
30
+
31
+ Args:
32
+ proto: New protocol class on the top stack.
33
+ alias: New protocol alias on the top stack.
34
+ basis: Original protocol chain as base stacks.
35
+
36
+ """
37
+
38
+ #: Internal data storage for protocol chain.
39
+ __data__: 'tuple[tuple[str, Type[Protocol]], ...]'
40
+
41
+ ##########################################################################
42
+ # Properties.
43
+ ##########################################################################
44
+
45
+ @cached_property
46
+ def protocols(self) -> 'tuple[Type[Protocol], ...]':
47
+ """List of protocols in the chain."""
48
+ return tuple(data[1] for data in self.__data__)
49
+
50
+ @cached_property
51
+ def aliases(self) -> 'tuple[str, ...]':
52
+ """Protocol names."""
53
+ return tuple(data[0] for data in self.__data__)
54
+
55
+ @property
56
+ def chain(self) -> 'str':
57
+ """Protocol chain string."""
58
+ return self.__str__()
59
+
60
+ ##########################################################################
61
+ # Methods.
62
+ ##########################################################################
63
+
64
+ @classmethod
65
+ def from_list(cls, data: 'list[Protocol | Type[Protocol]]') -> 'Self':
66
+ """Create a protocol chain from a list.
67
+
68
+ Args:
69
+ data: Protocol chain list.
70
+
71
+ """
72
+ from pcapkit.protocols.protocol import \
73
+ ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
74
+
75
+ temp_data = []
76
+ for proto in data:
77
+ if isinstance(proto, Protocol):
78
+ alias = proto.alias
79
+ proto = type(proto)
80
+
81
+ temp_data.append((alias, proto))
82
+
83
+ obj = cls.__new__(cls)
84
+ obj.__data__ = tuple(temp_data)
85
+ return obj
86
+
87
+ def index(self, value: 'str | Protocol | Type[Protocol]',
88
+ start: 'Optional[int]' = None, stop: 'Optional[int]' = None) -> 'int':
89
+ """First index of ``value``.
90
+
91
+ Args:
92
+ value: Value to search.
93
+ start: start offset.
94
+ stop: stop offset.
95
+
96
+ Raises:
97
+ IndexNotFound: If the value is not present.
98
+
99
+ """
100
+ if start is None:
101
+ start = 0
102
+ elif start < 0:
103
+ start = max(len(self) + start, 0)
104
+
105
+ if stop is not None and stop < 0:
106
+ stop += len(self)
107
+
108
+ # prepare comparison values
109
+ from pcapkit.protocols.protocol import \
110
+ ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
111
+ comp = Protocol.expand_comp(value)
112
+
113
+ pool = self.__data__[start:stop]
114
+ for idx, (alias, proto) in enumerate(pool):
115
+ test_comp = (proto, alias.upper(), *(name.upper() for name in proto.id()))
116
+ for test in comp:
117
+ if test in test_comp:
118
+ return start + idx
119
+ raise IndexNotFound(f'{value!r} is not in {self.__class__.__name__!r}')
120
+
121
+ def count(self, value: 'str | Protocol | Type[Protocol]') -> int:
122
+ """Number of occurrences of ``value``.
123
+
124
+ Args:
125
+ value: Value to search.
126
+
127
+ """
128
+ # prepare comparison values
129
+ from pcapkit.protocols.protocol import \
130
+ ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
131
+ comp = Protocol.expand_comp(value)
132
+
133
+ cnt = 0
134
+ for alias, proto in self.__data__:
135
+ test_comp = (proto, alias.upper(), *(name.upper() for name in proto.id()))
136
+ for test in comp:
137
+ if test in test_comp:
138
+ cnt += 1
139
+ break
140
+ return cnt
141
+
142
+ ##########################################################################
143
+ # Data models.
144
+ ##########################################################################
145
+
146
+ def __init__(self, proto: 'Protocol | Type[Protocol]', alias: 'Optional[str]' = None, *,
147
+ basis: 'Optional[ProtoChain]' = None):
148
+ """Initialisation.
149
+
150
+ Args:
151
+ proto: New protocol class on the top stack.
152
+ alias: New protocol alias on the top stack.
153
+ basis: Original protocol chain as base stacks.
154
+
155
+ """
156
+ from pcapkit.protocols.protocol import \
157
+ ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
158
+ if isinstance(proto, Protocol):
159
+ if alias is None:
160
+ alias = proto.alias
161
+ proto = type(proto)
162
+
163
+ if alias is None:
164
+ alias = proto.__name__
165
+
166
+ temp_data = [(alias, proto)]
167
+ if basis is not None:
168
+ temp_data.extend(basis)
169
+ self.__data__ = tuple(temp_data)
170
+
171
+ def __repr__(self) -> 'str':
172
+ """Returns representation of protocol chain data.
173
+
174
+ Example:
175
+ >>> protochain
176
+ ProtoChain(Ethernet, IPv6, Raw)
177
+
178
+ """
179
+ return f"ProtoChain({', '.join(map(lambda p: p[1].__name__, self.__data__))})"
180
+
181
+ def __str__(self) -> 'str':
182
+ """Returns formatted hex representation of source data stream.
183
+
184
+ Example:
185
+ >>> protochain
186
+ ProtoChain(Ethernet, IPv6, Raw)
187
+ >>> print(protochain)
188
+ Ethernet:IPv6:Raw
189
+
190
+ """
191
+ return ':'.join(map(lambda p: p[0], self.__data__))
192
+
193
+ def __contains__(self, name: 'str | Protocol | Type[Protocol]') -> 'bool': # type: ignore[override]
194
+ """Returns if ``name`` is in the chain.
195
+
196
+ Args:
197
+ name: Name to search.
198
+
199
+ Returns:
200
+ Whether ``name`` is in the chain.
201
+
202
+ """
203
+ from pcapkit.protocols.protocol import \
204
+ ProtocolBase as Protocol # pylint: disable=import-outside-toplevel
205
+ comp = Protocol.expand_comp(name)
206
+
207
+ for alias, proto in self.__data__:
208
+ test_comp = (proto, alias.upper(), *(name.upper() for name in proto.id()))
209
+ for test in comp:
210
+ if test in test_comp:
211
+ return True
212
+ return False
213
+
214
+ @overload
215
+ def __getitem__(self, index: 'int') -> 'str': ...
216
+ @overload
217
+ def __getitem__(self, index: 'slice') -> 'tuple[str, ...]': ...
218
+
219
+ def __getitem__(self, index: 'int | slice') -> 'str | tuple[str, ...]':
220
+ """Subscription (``getitem``) support.
221
+
222
+ Args:
223
+ index: Indexing key.
224
+
225
+ Returns:
226
+ Protocol alias at such index.
227
+
228
+ """
229
+ if isinstance(index, slice):
230
+ return tuple(data[0] for data in self.__data__[index])
231
+ return self.__data__[index][0]
232
+
233
+ def __iter__(self) -> 'Iterator[tuple[str, Type[Protocol]]]':
234
+ """Iterator support.
235
+
236
+ Returns:
237
+ Iterator of protocol alias and class.
238
+
239
+ """
240
+ return iter(self.__data__)
241
+
242
+ def __len__(self) -> 'int':
243
+ """Length support.
244
+
245
+ Returns:
246
+ Length of protocol chain.
247
+
248
+ """
249
+ return len(self.__data__)
250
+
251
+ def __add__(self, other: 'ProtoChain') -> 'ProtoChain':
252
+ """Merge protocol chain by appending protocols from ``other``.
253
+
254
+ Args:
255
+ other: Protocol chain to be merged.
256
+
257
+ Returns:
258
+ Merged protocol chain.
259
+
260
+ """
261
+ new = copy.copy(self)
262
+ new.__data__ += other.__data__
263
+ return new
@@ -0,0 +1,33 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Version Info
3
+ ==================
4
+
5
+ .. module:: pcapkit.corekit.version
6
+
7
+ :mod:`pcapkit.corekit.version` contains :obj:`tuple`
8
+ like class :class:`~pcapkit.corekit.version.VersionInfo`,
9
+ which is originally designed alike :class:`sys.version_info`.
10
+
11
+ """
12
+ import collections
13
+
14
+ __all__ = ['VersionInfo']
15
+
16
+
17
+ class VersionInfo(collections.namedtuple('VersionInfo', ['major', 'minor'])):
18
+ """VersionInfo is alike :class:`sys.version_info`."""
19
+
20
+ __slots__ = ()
21
+
22
+ #: Major version.
23
+ major: int
24
+ #: Minor version.
25
+ minor: int
26
+
27
+ @property
28
+ def version(self) -> 'str':
29
+ """Return version string."""
30
+ return f'{self.major}.{self.minor}'
31
+
32
+ def __str__(self) -> 'str':
33
+ return f'{self.major}.{self.minor}'
@@ -0,0 +1,15 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Dump Utilities
3
+ ====================
4
+
5
+ .. module:: pcapkit.dumpkit
6
+
7
+ :mod:`pcapkit.dumpkit` is the collection of dumpers for
8
+ :mod:`pcapkit` implementation, which is alike those described
9
+ in :mod:`dictdumper`.
10
+
11
+ """
12
+ from pcapkit.dumpkit.null import NotImplementedIO
13
+ from pcapkit.dumpkit.pcap import PCAPIO
14
+
15
+ __all__ = ['PCAPIO', 'NotImplementedIO']
@@ -0,0 +1,199 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Common Utilities
3
+ ======================
4
+
5
+ .. module:: pcapkit.dumpkit.common
6
+
7
+ :mod:`pcapkit.dumpkit.common` is the collection of common utility
8
+ functions for :mod:`pcapkit.dumpkit` implementation, which is
9
+ generally the customised hooks for :class:`dictdumper.Dumper`
10
+ classes.
11
+
12
+ """
13
+ import collections
14
+ import datetime
15
+ import decimal
16
+ import enum
17
+ import ipaddress
18
+ import tempfile
19
+ from typing import TYPE_CHECKING
20
+
21
+ import aenum
22
+ import dictdumper.dumper
23
+
24
+ from pcapkit.corekit.infoclass import Info
25
+ from pcapkit.corekit.multidict import MultiDict, OrderedMultiDict
26
+ from pcapkit.protocols.schema.schema import Schema
27
+ from pcapkit.utilities.logging import logger
28
+
29
+ __all__ = ['make_dumper']
30
+
31
+ if TYPE_CHECKING:
32
+ from typing import Any, DefaultDict, Optional, TextIO, Type
33
+
34
+ from dictdumper.dumper import Dumper as ABCDumper
35
+ from typing_extensions import Literal
36
+
37
+
38
+ class DumperBase(dictdumper.dumper.Dumper):
39
+ """Base :class:`~dictdumper.dumper.Dumper` object.
40
+
41
+ Note:
42
+ This class is for internal use only. For customisation, please use
43
+ :class:`Dumper` instead.
44
+
45
+ """
46
+
47
+
48
+ class Dumper(DumperBase):
49
+ """Base :class:`~dictdumper.dumper.Dumper` object.
50
+
51
+ This class is a customised :class:`~dictdumper.dumper.Dumper` for the
52
+ :mod:`pcapkit.dumpkit` implementation, which is generally customised
53
+ for automatic registration to the
54
+ :class:`~pcapkit.foundation.extraction.Extractor` and
55
+ :class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow` output
56
+ dumper registries.
57
+
58
+ """
59
+
60
+ def __init_subclass__(cls, /, fmt: 'Optional[str]' = None,
61
+ ext: 'Optional[str]' = None, *args: 'Any', **kwargs: 'Any') -> 'None':
62
+ """Initialise subclass.
63
+
64
+ This method is used to register the subclass to the
65
+ :class:`~pcapkit.foundation.extraction.Extraction` and
66
+ :class:`~pcapkit.foundation.traceflow.traceflow.TraceFlow`
67
+ output dumper registries.
68
+
69
+ Args:
70
+ fmt: Output format to register.
71
+ ext: Output file extension.
72
+ *args: Arbitrary positional arguments.
73
+ **kwargs: Arbitrary keyword arguments.
74
+
75
+ If the ``fmt`` is not provided, we will try to get it from the
76
+ :attr:`~dictdumper.dumper.Dumper.kind` property of the subclass.
77
+ And if the ``ext`` is not provided, we will infer it from the
78
+ ``fmt``.
79
+
80
+ See Also:
81
+ - :func:`pcapkit.foundation.registry.foundation.register_dumper`
82
+ - :func:`pcapkit.foundation.registry.foundation.register_extractor_dumper`
83
+ - :func:`pcapkit.foundation.registry.foundation.register_traceflow_dumper`
84
+ - :meth:`pcapkit.foundation.extraction.Extractor.register_dumper`
85
+ - :meth:`pcapkit.foundation.traceflow.traceflow.TraceFlow.register_dumper`
86
+
87
+ """
88
+ if fmt is None:
89
+ with tempfile.NamedTemporaryFile() as temp:
90
+ fmt = cls(temp.name).kind
91
+ fmt = fmt.lower()
92
+
93
+ if ext is None:
94
+ ext = f'.{fmt}'
95
+
96
+ from pcapkit.foundation.extraction import Extractor
97
+ Extractor.register_dumper(fmt, cls, ext)
98
+
99
+ from pcapkit.foundation.traceflow.traceflow import TraceFlow
100
+ TraceFlow.register_dumper(fmt, cls, ext)
101
+
102
+ return super().__init_subclass__()
103
+
104
+
105
+ def make_dumper(output: 'Type[ABCDumper]') -> 'Type[ABCDumper]':
106
+ """Create a customised :class:`~dictdumper.dumper.Dumper` object.
107
+
108
+ Args:
109
+ output: Output class to customise.
110
+
111
+ Returns:
112
+ Customised :class:`~dictdumper.dumper.Dumper` object.
113
+
114
+ """
115
+ class DictDumper(output):
116
+ """Customised :class:`~dictdumper.dumper.Dumper` object."""
117
+
118
+ def object_hook(self, o: 'Any') -> 'Any':
119
+ """Convert content for function call.
120
+
121
+ Args:
122
+ self: Dumper instance.
123
+ o: object to convert
124
+
125
+ Returns:
126
+ Converted object.
127
+
128
+ """
129
+ if isinstance(o, decimal.Decimal):
130
+ return str(o)
131
+ if isinstance(o, datetime.timedelta):
132
+ return o.total_seconds()
133
+ if isinstance(o, (Info, Schema)):
134
+ return o.to_dict()
135
+ if isinstance(o, (ipaddress.IPv4Address, ipaddress.IPv6Address)):
136
+ return str(o)
137
+ if isinstance(o, (MultiDict, OrderedMultiDict)):
138
+ temp = collections.defaultdict(list) # type: DefaultDict[str, list[Any]]
139
+ for key, val in o.items(multi=True):
140
+ if isinstance(key, (enum.Enum, aenum.Enum)):
141
+ key = f'{type(key).__name__}::{key.name} [{key.value}]'
142
+ temp[key].append(val)
143
+ return temp
144
+ if isinstance(o, (enum.Enum, aenum.Enum)):
145
+ addon = {key: val for key, val in o.__dict__.items() if not key.startswith('_')}
146
+ if addon:
147
+ return {
148
+ 'enum': f'{type(o).__name__}::{o.name} [{o.value}]',
149
+ **addon,
150
+ }
151
+ return f'{type(o).__name__}::{o.name} [{o.value}]'
152
+ return super(type(self), self).object_hook(o) # type: ignore[unreachable]
153
+
154
+ def default(self, o: 'Any') -> 'Literal["fallback"]': # pylint: disable=unused-argument
155
+ """Check content type for function call.
156
+
157
+ Args:
158
+ self: Dumper instance.
159
+ o: Object to check.
160
+
161
+ Returns:
162
+ Fallback string.
163
+
164
+ Notes:
165
+ This function is a fallback for :meth:`dictdumper.dumper.Dumper.default`.
166
+ It will be called when :meth:`dictdumper.dumper.Dumper.default` fails
167
+ to find a suitable function for dumping and it should pair with
168
+ :func:`pcapkit.dumpkit.common._append_fallback` for use.
169
+
170
+ """
171
+ return 'fallback'
172
+
173
+ def _append_fallback(self, value: 'Any', file: 'TextIO') -> 'None':
174
+ """Fallback function for dumping.
175
+
176
+ Args:
177
+ self: Dumper instance.
178
+ value: Value to dump.
179
+ file: File object to write.
180
+
181
+ Notes:
182
+ This function is a fallback for :meth:`dictdumper.dumper.Dumper.default`.
183
+ It will be called when :meth:`dictdumper.dumper.Dumper.default` fails
184
+ to find a suitable function for dumping and it should pair with
185
+ :func:`pcapkit.dumpkit.common.default` for use.
186
+
187
+ """
188
+ if hasattr(value, '__slots__'):
189
+ new_value = {key: getattr(value, key) for key in value.__slots__}
190
+ elif hasattr(value, '__dict__'):
191
+ new_value = vars(value)
192
+ else:
193
+ logger.warning('unsupported object type: %s', type(value))
194
+ new_value = str(value) # type: ignore[assignment]
195
+
196
+ func = self._encode_func(new_value)
197
+ func(new_value, file)
198
+
199
+ return DictDumper
@@ -0,0 +1,77 @@
1
+ # -*- coding: utf-8 -*-
2
+ """Null Dumper
3
+ =================
4
+
5
+ .. module:: pcapkit.dumper.null
6
+
7
+ :mod:`pcapkit.dumpkit.null` is the dumper for :mod:`pcapkit` implementation,
8
+ specifically for **NotImplemented** format, which is alike those described in
9
+ :mod:`dictdumper`.
10
+
11
+ Notes:
12
+ This dumper is used when the given format is not supported, as a fallback.
13
+ It shall not produce any output.
14
+
15
+ """
16
+ from typing import TYPE_CHECKING
17
+
18
+ from pcapkit.dumpkit.common import DumperBase as Dumper
19
+
20
+ if TYPE_CHECKING:
21
+ from typing import IO, Any, Optional
22
+
23
+ from typing_extensions import Literal
24
+
25
+ __all__ = ['NotImplementedIO']
26
+
27
+
28
+ class NotImplementedIO(Dumper):
29
+ """Unspecified output format."""
30
+
31
+ ##########################################################################
32
+ # Properties.
33
+ ##########################################################################
34
+
35
+ @property
36
+ def kind(self) -> 'Literal["null"]':
37
+ """File format of current dumper."""
38
+ return 'null'
39
+
40
+ ##########################################################################
41
+ # Data models.
42
+ ##########################################################################
43
+
44
+ def __call__(self, value: 'dict[str, Any]', name: 'Optional[str]' = None) -> 'NotImplementedIO': # pylint: disable=unused-argument
45
+ """Dump a new frame.
46
+
47
+ Args:
48
+ value: content to be dumped
49
+ name: name of current content block
50
+
51
+ Returns:
52
+ The dumper class itself (to support chain calling).
53
+
54
+ """
55
+ return self
56
+
57
+ ##########################################################################
58
+ # Utilities.
59
+ ##########################################################################
60
+
61
+ def _dump_header(self, **kwargs: 'Any') -> 'None': # pylint: disable=unused-argument
62
+ """Initially dump file heads and tails.
63
+
64
+ Args:
65
+ **kwargs: arbitrary keyword arguments
66
+
67
+ """
68
+
69
+ def _append_value(self, value: 'dict[str, Any]', file: 'IO[bytes]', name: 'str') -> 'None': # pylint: disable=unused-argument
70
+ """Call this function to write contents.
71
+
72
+ Args:
73
+ value: content to be dumped
74
+ file: output file
75
+ name: name of current content block
76
+
77
+ """