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,176 @@
1
+ # -*- coding: utf-8 -*-
2
+ """HTTP - Hypertext Transfer Protocol
3
+ ========================================
4
+
5
+ .. module:: pcapkit.protocols.application.http
6
+
7
+ :mod:`pcapkit.protocols.application.http` contains
8
+ :class:`~pcapkit.protocols.application.http.HTTP`
9
+ only, which is a base class for Hypertext Transfer
10
+ Protocol (HTTP) [*]_ family, eg.
11
+ :class:`HTTP/1.* <pcapkit.protocols.application.application.httpv1>`
12
+ and :class:`HTTP/2 <pcapkit.protocols.application.application.httpv2>`.
13
+
14
+ .. [*] https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
15
+
16
+ """
17
+ import contextlib
18
+ from typing import TYPE_CHECKING, Generic
19
+
20
+ from pcapkit.protocols.application.application import Application
21
+ from pcapkit.protocols.protocol import _PT, _ST
22
+ from pcapkit.utilities.exceptions import ProtocolError
23
+
24
+ if TYPE_CHECKING:
25
+ from typing import Any, Optional
26
+
27
+ from typing_extensions import Literal
28
+
29
+ __all__ = ['HTTP']
30
+
31
+
32
+ class HTTP(Application[_PT, _ST], Generic[_PT, _ST]):
33
+ """This class implements all protocols in HTTP family.
34
+
35
+ - Hypertext Transfer Protocol (HTTP/1.1) [:rfc:`7230`]
36
+ - Hypertext Transfer Protocol version 2 (HTTP/2) [:rfc:`7540`]
37
+
38
+ """
39
+
40
+ if TYPE_CHECKING:
41
+ #: Saved subclass protocol data (only for HTTP base class).
42
+ _http: 'HTTP[_PT, _ST]'
43
+
44
+ ##########################################################################
45
+ # Properties.
46
+ ##########################################################################
47
+
48
+ @property
49
+ def name(self) -> 'Literal["Hypertext Transfer Protocol"]':
50
+ """Name of current protocol."""
51
+ return 'Hypertext Transfer Protocol'
52
+
53
+ @property
54
+ def alias(self) -> 'Literal["HTTP/0.9", "HTTP/1.0", "HTTP/1.1", "HTTP/2"]':
55
+ """Acronym of current protocol."""
56
+ return f'HTTP/{self.version}' # type: ignore[return-value]
57
+
58
+ @property
59
+ def length(self) -> 'int':
60
+ """Header length of current protocol."""
61
+ return self._length
62
+
63
+ @property
64
+ def version(self) -> 'Literal["0.9", "1.0", "1.1", "2"]':
65
+ """Version of current protocol."""
66
+ return self._version
67
+
68
+ ##########################################################################
69
+ # Methods.
70
+ ##########################################################################
71
+
72
+ @classmethod
73
+ def id(cls) -> 'tuple[Literal["HTTP"], Literal["HTTPv1"], Literal["HTTPv2"]]':
74
+ """Index ID of the protocol."""
75
+ return ('HTTP', 'HTTPv1', 'HTTPv2')
76
+
77
+ def read(self, length: 'Optional[int]' = None, *,
78
+ version: 'Optional[Literal[1, 2]]' = None, **kwargs: 'Any') -> '_PT':
79
+ """Read (parse) packet data.
80
+
81
+ Args:
82
+ length: Length of packet data.
83
+ version: Version of HTTP.
84
+ **kwargs: Arbitrary keyword arguments.
85
+
86
+ Returns:
87
+ Parsed packet data.
88
+
89
+ """
90
+ if length is None:
91
+ length = len(self)
92
+
93
+ if version is None:
94
+ http = self._guess_version(length, **kwargs)
95
+ else:
96
+ if version == 1:
97
+ from pcapkit.protocols.application.httpv1 import HTTP as protocol # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
98
+ elif version == 2:
99
+ from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[assignment] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
100
+ else:
101
+ raise ProtocolError(f"invalid HTTP version: {version}")
102
+
103
+ http = protocol(self._file, length, **kwargs)
104
+
105
+ self._version = http.version
106
+ self._length = http.length
107
+ self._http = http
108
+ return http.info
109
+
110
+ def make(self,
111
+ version: 'Literal[1, 2]' = 1,
112
+ **kwargs: 'Any') -> '_ST':
113
+ """Make (construct) packet data.
114
+
115
+ Args:
116
+ version: Version of HTTP.
117
+ **kwargs: Arbitrary keyword arguments.
118
+
119
+ Returns:
120
+ bytes: Constructed packet data.
121
+
122
+ """
123
+ if version == 1:
124
+ from pcapkit.protocols.application.httpv1 import HTTP as protocol # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
125
+ elif version == 2:
126
+ from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[assignment] # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
127
+ else:
128
+ raise ProtocolError(f"invalid HTTP version: {version}")
129
+ return protocol.make(**kwargs) # type: ignore[return-value]
130
+
131
+ ##########################################################################
132
+ # Utilities.
133
+ ##########################################################################
134
+
135
+ @classmethod
136
+ def _make_data(cls, data: '_PT') -> 'dict[str, Any]': # type: ignore[override]
137
+ """Create key-value pairs from ``data`` for protocol construction.
138
+
139
+ Args:
140
+ data: protocol data
141
+
142
+ Returns:
143
+ Key-value pairs for protocol construction.
144
+
145
+ """
146
+ version = data.get('version', 0)
147
+ if version == 1:
148
+ from pcapkit.protocols.application.httpv1 import HTTP as protocol
149
+ elif version == 2:
150
+ from pcapkit.protocols.application.httpv2 import HTTP as protocol # type: ignore[assignment] # isort: skip
151
+ else:
152
+ raise ProtocolError(f"invalid HTTP version: {version}")
153
+ return protocol._make_data(data) # type: ignore[arg-type]
154
+
155
+ def _guess_version(self, length: 'int', **kwargs: 'Any') -> 'HTTP':
156
+ """Guess HTTP version.
157
+
158
+ Args:
159
+ length: Length of packet data.
160
+
161
+ Keyword Args:
162
+ **kwargs: Arbitrary keyword arguments.
163
+
164
+ Returns:
165
+ Parsed packet data.
166
+
167
+ """
168
+ from pcapkit.protocols.application.httpv1 import HTTP as HTTPv1 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
169
+ with contextlib.suppress(ProtocolError):
170
+ return HTTPv1(self._data, length, **kwargs)
171
+
172
+ from pcapkit.protocols.application.httpv2 import HTTP as HTTPv2 # isort: skip # pylint: disable=line-too-long,import-outside-toplevel
173
+ with contextlib.suppress(ProtocolError):
174
+ return HTTPv2(self._data, length, **kwargs)
175
+
176
+ raise ProtocolError("unknown HTTP version")
@@ -0,0 +1,320 @@
1
+ # -*- coding: utf-8 -*-
2
+ r"""HTTP/1.* - Hypertext Transfer Protocol
3
+ ============================================
4
+
5
+ .. module:: pcapkit.protocols.application.httpv1
6
+
7
+ :mod:`pcapkit.protocols.application.httpv1` contains
8
+ :class:`~pcapkit.protocols.application.httpv1.HTTP`
9
+ only, which implements extractor for Hypertext Transfer
10
+ Protocol (HTTP/1.*) [*]_, whose structure is described
11
+ as below:
12
+
13
+ .. code-block:: text
14
+
15
+ METHOD URL HTTP/VERSION\r\n :==: REQUEST LINE
16
+ <key> : <value>\r\n :==: REQUEST HEADER
17
+ ............ (Ellipsis) :==: REQUEST HEADER
18
+ \r\n :==: REQUEST SEPARATOR
19
+ <body> :==: REQUEST BODY (optional)
20
+
21
+ HTTP/VERSION CODE DESP \r\n :==: RESPONSE LINE
22
+ <key> : <value>\r\n :==: RESPONSE HEADER
23
+ ............ (Ellipsis) :==: RESPONSE HEADER
24
+ \r\n :==: RESPONSE SEPARATOR
25
+ <body> :==: RESPONSE BODY (optional)
26
+
27
+ .. [*] https://en.wikipedia.org/wiki/Hypertext_Transfer_Protocol
28
+
29
+ """
30
+ import re
31
+ from typing import TYPE_CHECKING
32
+
33
+ from pcapkit.const.http.method import Method as Enum_Method
34
+ from pcapkit.const.http.status_code import StatusCode as Enum_StatusCode
35
+ from pcapkit.corekit.multidict import OrderedMultiDict
36
+ from pcapkit.protocols.application.http import HTTP as HTTPBase
37
+ from pcapkit.protocols.data.application.httpv1 import HTTP as Data_HTTP
38
+ from pcapkit.protocols.data.application.httpv1 import RequestHeader as Data_RequestHeader
39
+ from pcapkit.protocols.data.application.httpv1 import ResponseHeader as Data_ResponseHeader
40
+ from pcapkit.protocols.schema.application.httpv1 import HTTP as Schema_HTTP
41
+ from pcapkit.utilities.compat import StrEnum
42
+ from pcapkit.utilities.exceptions import ProtocolError
43
+
44
+ if TYPE_CHECKING:
45
+ from enum import IntEnum as StdlibEnum
46
+ from typing import Any, Optional
47
+ from typing import Type as _Type
48
+
49
+ from aenum import IntEnum as AenumEnum
50
+ from typing_extensions import Literal
51
+
52
+ from pcapkit.protocols.data.application.httpv1 import Header as Data_Header
53
+
54
+ __all__ = ['HTTP']
55
+
56
+ # Regular expression to match HTTP methods.
57
+ _RE_METHOD = re.compile(rb"(?P<method>[A-Z][A-Z-]*)") # RFC 9110, section 16.1.1, 9.1, 5.6.2
58
+ # Regular expression to match HTTP version string.
59
+ _RE_VERSION = re.compile(rb"HTTP/(?P<version>\d\.\d)")
60
+ # Regular expression to match HTTP status code.
61
+ _RE_STATUS = re.compile(rb'\d{3}')
62
+
63
+
64
+ class Type(StrEnum):
65
+ """HTTP packet type."""
66
+
67
+ #: Request packet.
68
+ REQUEST = 'request'
69
+ #: Response packet.
70
+ RESPONSE = 'response'
71
+
72
+
73
+ class HTTP(HTTPBase[Data_HTTP, Schema_HTTP],
74
+ data=Data_HTTP, schema=Schema_HTTP):
75
+ """This class implements Hypertext Transfer Protocol (HTTP/1.*)."""
76
+
77
+ ##########################################################################
78
+ # Defaults.
79
+ ##########################################################################
80
+
81
+ #: Type: Type of HTTP receipt.
82
+ _receipt: 'Type'
83
+
84
+ ##########################################################################
85
+ # Properties.
86
+ ##########################################################################
87
+
88
+ @property
89
+ def alias(self) -> 'Literal["HTTP/0.9", "HTTP/1.0", "HTTP/1.1"]':
90
+ """Acronym of current protocol."""
91
+ return f'HTTP/{self.version}' # type: ignore[return-value]
92
+
93
+ @property
94
+ def version(self) -> 'Literal["0.9", "1.0", "1.1"]':
95
+ """Version of current protocol."""
96
+ return self._info.receipt.version # type: ignore[attr-defined]
97
+
98
+ ##########################################################################
99
+ # Methods.
100
+ ##########################################################################
101
+
102
+ def read(self, length: 'Optional[int]' = None, **kwargs: 'Any') -> 'Data_HTTP': # pylint: disable=unused-argument
103
+ """Read Hypertext Transfer Protocol (HTTP/1.*).
104
+
105
+ Structure of HTTP/1.* packet [:rfc:`7230`]:
106
+
107
+ .. code-block:: text
108
+
109
+ HTTP-message :==: start-line
110
+ *( header-field CRLF )
111
+ CRLF
112
+ [ message-body ]
113
+
114
+
115
+ Args:
116
+ length: Length of packet data.
117
+ **kwargs: Arbitrary keyword arguments.
118
+
119
+ Returns:
120
+ Parsed packet data.
121
+
122
+ Raises:
123
+ ProtocolError: If the packet is malformed.
124
+
125
+ """
126
+ if length is None:
127
+ length = len(self)
128
+ schema = self.__header__
129
+
130
+ packet = schema.data
131
+ header, body = packet.split(b'\r\n\r\n', maxsplit=1)
132
+
133
+ header_line, header_unpacked = self._read_http_header(header)
134
+ body_unpacked = self._read_http_body(body, headers=header_unpacked) or None
135
+
136
+ http = Data_HTTP(
137
+ receipt=header_line,
138
+ header=header_unpacked,
139
+ body=body_unpacked,
140
+ )
141
+ self._receipt = header_line.type
142
+ self._version = header_line.version # type: ignore[attr-defined]
143
+ self._length = len(header)
144
+
145
+ return http
146
+
147
+ def make(self, # type: ignore[override]
148
+ http_version: 'Literal["0.9", "1.0", "1.1", b"0.9", b"1.0", b"1.1"]' = '1.1',
149
+ method: 'Optional[Enum_Method | str | bytes]' = None,
150
+ uri: 'Optional[str | bytes]' = None,
151
+ status: 'Optional[Enum_StatusCode | str | bytes | int]' = None,
152
+ status_default: 'Optional[int]' = None,
153
+ status_namespace: 'Optional[dict[str, int] | dict[int, str] | _Type[StdlibEnum] | _Type[AenumEnum]]' = None, # pylint: disable=line-too-long
154
+ status_reversed: 'bool' = False,
155
+ message: 'Optional[str | bytes]' = None,
156
+ headers: 'Optional[OrderedMultiDict[str, str]]' = None,
157
+ body: 'bytes' = b'',
158
+ **kwargs: 'Any') -> 'Schema_HTTP':
159
+ """Make (construct) packet data.
160
+
161
+ Args:
162
+ http_version: HTTP version.
163
+ method: HTTP method.
164
+ uri: HTTP request URI.
165
+ status: HTTP status code.
166
+ status_default: Default HTTP status code.
167
+ status_namespace: Namespace of HTTP status code.
168
+ status_reversed: Whether to reverse the namespace.
169
+ message: HTTP status message.
170
+ headers: HTTP headers.
171
+ body: HTTP body.
172
+ **kwargs: Arbitrary keyword arguments.
173
+
174
+ Returns:
175
+ Constructed packet data.
176
+
177
+ """
178
+ version = http_version.encode() if isinstance(http_version, str) else http_version
179
+ if method is not None and status is None:
180
+ if uri is None:
181
+ raise ProtocolError('HTTP request must have URI.')
182
+
183
+ if isinstance(method, bytes):
184
+ meth = method
185
+ elif isinstance(method, str):
186
+ meth = method.encode()
187
+ else:
188
+ meth = method.value.encode()
189
+ uri_val = uri.encode() if isinstance(uri, str) else uri
190
+
191
+ header_line = b'%s %s HTTP/%s\r\n' % (meth, uri_val, version)
192
+ elif method is None and status is not None:
193
+ status_code = self._make_index(status, status_default, namespace=status_namespace,
194
+ reversed=status_reversed, pack=False)
195
+ status_code_val = int(status_code)
196
+
197
+ if message is None:
198
+ msg = getattr(status_code, 'message', b'') or b''
199
+ else:
200
+ msg = message.encode() if isinstance(message, str) else message
201
+
202
+ header_line = b'HTTP/%s %s %s\r\n' % (version, str(status_code_val).encode(), msg)
203
+
204
+ header_fields = [] # type: list[bytes]
205
+ if headers is not None:
206
+ header_fields = []
207
+ for key, value in headers.items(multi=True):
208
+ header_fields.append(b'%s: %s\r\n' % (key.encode(), value.encode()))
209
+
210
+ return Schema_HTTP(
211
+ data=header_line + b''.join(header_fields) + b'\r\n' + body,
212
+ )
213
+
214
+ @classmethod
215
+ def id(cls) -> 'tuple[Literal["HTTP"], Literal["HTTPv1"]]': # type: ignore[override]
216
+ """Index ID of the protocol.
217
+
218
+ Returns:
219
+ Index ID of the protocol.
220
+
221
+ """
222
+ return (cls.__name__, 'HTTPv1') # type: ignore[return-value]
223
+
224
+ ##########################################################################
225
+ # Utilities.
226
+ ##########################################################################
227
+
228
+ @classmethod
229
+ def _make_data(cls, data: 'Data_HTTP') -> 'dict[str, Any]': # type: ignore[override]
230
+ """Create key-value pairs from ``data`` for protocol construction.
231
+
232
+ Args:
233
+ data: protocol data
234
+
235
+ Returns:
236
+ Key-value pairs for protocol construction.
237
+
238
+ """
239
+ return {
240
+ 'http_version': data.receipt.version, # type: ignore[attr-defined]
241
+ 'method': getattr(data.receipt, 'method', None),
242
+ 'uri': getattr(data.receipt, 'uri', None),
243
+ 'status': getattr(data.receipt, 'status', None),
244
+ 'message': getattr(data.receipt, 'message', None),
245
+ 'headers': data.header,
246
+ 'body': data.body,
247
+ }
248
+
249
+ def _read_http_header(self, header: 'bytes') -> 'tuple[Data_Header, OrderedMultiDict[str, str]]':
250
+ """Read HTTP/1.* header.
251
+
252
+ Structure of HTTP/1.* header [:rfc:`7230`]:
253
+
254
+ .. code-block:: text
255
+
256
+ start-line :==: request-line / status-line
257
+ request-line :==: method SP request-target SP HTTP-version CRLF
258
+ status-line :==: HTTP-version SP status-code SP reason-phrase CRLF
259
+ header-field :==: field-name ":" OWS field-value OWS
260
+
261
+ Args:
262
+ header: HTTP header data.
263
+
264
+ Returns:
265
+ Parsed packet data.
266
+
267
+ Raises:
268
+ ProtocolError: If the packet is malformed.
269
+
270
+ """
271
+ startline, headerfield = header.split(b'\r\n', 1)
272
+ para1, para2, para3 = re.split(rb'\s+', startline, 2)
273
+ fields = headerfield.split(b'\r\n')
274
+ lists = (re.split(rb'\s*:\s*', field, 1) for field in fields)
275
+
276
+ if TYPE_CHECKING:
277
+ header_line: 'Data_Header'
278
+
279
+ match1 = re.match(_RE_METHOD, para1)
280
+ match2 = re.match(_RE_VERSION, para3)
281
+ match3 = re.match(_RE_VERSION, para1)
282
+ match4 = re.match(_RE_STATUS, para2)
283
+ if match1 and match2:
284
+ header_line = Data_RequestHeader(
285
+ type=Type.REQUEST,
286
+ method=Enum_Method.get(self.decode(para1)),
287
+ uri=self.decode(para2),
288
+ version=self.decode(match2.group('version')),
289
+ )
290
+ elif match3 and match4:
291
+ header_line = Data_ResponseHeader(
292
+ type=Type.RESPONSE,
293
+ version=self.decode(match3.group('version')),
294
+ status=Enum_StatusCode.get(int(para2)),
295
+ message=self.decode(para3),
296
+ )
297
+ else:
298
+ raise ProtocolError('HTTP: invalid format')
299
+
300
+ header_fields = OrderedMultiDict() # type: OrderedMultiDict[str, str]
301
+ for item in lists:
302
+ key = self.decode(item[0].strip())
303
+ value = self.decode(item[1].strip())
304
+ header_fields.add(key, value)
305
+
306
+ return header_line, header_fields
307
+
308
+ def _read_http_body(self, body: 'bytes', *,
309
+ headers: 'OrderedMultiDict[str, str]') -> 'Any':
310
+ """Read HTTP/1.* body.
311
+
312
+ Args:
313
+ body: HTTP body data.
314
+ headers: HTTP header fields.
315
+
316
+ Returns:
317
+ Raw HTTP body.
318
+
319
+ """
320
+ return body