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.
- pcapkit/__init__.py +126 -0
- pcapkit/__main__.py +138 -0
- pcapkit/all.py +136 -0
- pcapkit/const/__init__.py +81 -0
- pcapkit/const/arp/__init__.py +25 -0
- pcapkit/const/arp/hardware.py +181 -0
- pcapkit/const/arp/operation.py +131 -0
- pcapkit/const/ftp/__init__.py +25 -0
- pcapkit/const/ftp/command.py +309 -0
- pcapkit/const/ftp/return_code.py +304 -0
- pcapkit/const/hip/__init__.py +94 -0
- pcapkit/const/hip/certificate.py +77 -0
- pcapkit/const/hip/cipher.py +65 -0
- pcapkit/const/hip/di.py +59 -0
- pcapkit/const/hip/ecdsa_curve.py +59 -0
- pcapkit/const/hip/ecdsa_low_curve.py +56 -0
- pcapkit/const/hip/eddsa_curve.py +65 -0
- pcapkit/const/hip/esp_transform_suite.py +98 -0
- pcapkit/const/hip/group.py +86 -0
- pcapkit/const/hip/hi_algorithm.py +86 -0
- pcapkit/const/hip/hit_suite.py +68 -0
- pcapkit/const/hip/nat_traversal.py +62 -0
- pcapkit/const/hip/notify_message.py +200 -0
- pcapkit/const/hip/packet.py +89 -0
- pcapkit/const/hip/parameter.py +377 -0
- pcapkit/const/hip/registration.py +68 -0
- pcapkit/const/hip/registration_failure.py +84 -0
- pcapkit/const/hip/suite.py +71 -0
- pcapkit/const/hip/transport.py +59 -0
- pcapkit/const/http/__init__.py +39 -0
- pcapkit/const/http/error_code.py +95 -0
- pcapkit/const/http/frame.py +95 -0
- pcapkit/const/http/method.py +184 -0
- pcapkit/const/http/setting.py +96 -0
- pcapkit/const/http/status_code.py +294 -0
- pcapkit/const/ipv4/__init__.py +57 -0
- pcapkit/const/ipv4/classification_level.py +64 -0
- pcapkit/const/ipv4/option_class.py +55 -0
- pcapkit/const/ipv4/option_number.py +137 -0
- pcapkit/const/ipv4/protection_authority.py +63 -0
- pcapkit/const/ipv4/qs_function.py +51 -0
- pcapkit/const/ipv4/router_alert.py +251 -0
- pcapkit/const/ipv4/tos_del.py +51 -0
- pcapkit/const/ipv4/tos_ecn.py +55 -0
- pcapkit/const/ipv4/tos_pre.py +63 -0
- pcapkit/const/ipv4/tos_rel.py +51 -0
- pcapkit/const/ipv4/tos_thr.py +51 -0
- pcapkit/const/ipv4/ts_flag.py +53 -0
- pcapkit/const/ipv6/__init__.py +53 -0
- pcapkit/const/ipv6/extension_header.py +66 -0
- pcapkit/const/ipv6/option.py +137 -0
- pcapkit/const/ipv6/option_action.py +55 -0
- pcapkit/const/ipv6/qs_function.py +51 -0
- pcapkit/const/ipv6/router_alert.py +266 -0
- pcapkit/const/ipv6/routing.py +80 -0
- pcapkit/const/ipv6/seed_id.py +55 -0
- pcapkit/const/ipv6/smf_dpd_mode.py +51 -0
- pcapkit/const/ipv6/tagger_id.py +62 -0
- pcapkit/const/ipx/__init__.py +27 -0
- pcapkit/const/ipx/packet.py +72 -0
- pcapkit/const/ipx/socket.py +104 -0
- pcapkit/const/l2tp/__init__.py +21 -0
- pcapkit/const/l2tp/type.py +51 -0
- pcapkit/const/mh/__init__.py +204 -0
- pcapkit/const/mh/access_type.py +92 -0
- pcapkit/const/mh/ack_status_code.py +71 -0
- pcapkit/const/mh/ani_suboption.py +74 -0
- pcapkit/const/mh/auth_subtype.py +53 -0
- pcapkit/const/mh/binding_ack_flag.py +66 -0
- pcapkit/const/mh/binding_error.py +51 -0
- pcapkit/const/mh/binding_revocation.py +59 -0
- pcapkit/const/mh/binding_update_flag.py +81 -0
- pcapkit/const/mh/cga_extension.py +66 -0
- pcapkit/const/mh/cga_sec.py +57 -0
- pcapkit/const/mh/cga_type.py +68 -0
- pcapkit/const/mh/dhcp_support_mode.py +53 -0
- pcapkit/const/mh/dns_status_code.py +65 -0
- pcapkit/const/mh/dsmip6_tls_packet.py +62 -0
- pcapkit/const/mh/dsmipv6_home_address.py +74 -0
- pcapkit/const/mh/enumerating_algorithm.py +56 -0
- pcapkit/const/mh/fb_ack_status.py +62 -0
- pcapkit/const/mh/fb_action.py +71 -0
- pcapkit/const/mh/fb_indication_trigger.py +65 -0
- pcapkit/const/mh/fb_type.py +59 -0
- pcapkit/const/mh/flow_id_status.py +77 -0
- pcapkit/const/mh/flow_id_suboption.py +71 -0
- pcapkit/const/mh/handoff_type.py +71 -0
- pcapkit/const/mh/handover_ack_flag.py +54 -0
- pcapkit/const/mh/handover_ack_status.py +92 -0
- pcapkit/const/mh/handover_initiate_flag.py +57 -0
- pcapkit/const/mh/handover_initiate_status.py +62 -0
- pcapkit/const/mh/home_address_reply.py +71 -0
- pcapkit/const/mh/lla_code.py +63 -0
- pcapkit/const/mh/lma_mag_suboption.py +59 -0
- pcapkit/const/mh/mn_group_id.py +59 -0
- pcapkit/const/mh/mn_id_subtype.py +77 -0
- pcapkit/const/mh/operator_id.py +63 -0
- pcapkit/const/mh/option.py +260 -0
- pcapkit/const/mh/packet.py +119 -0
- pcapkit/const/mh/qos_attribute.py +89 -0
- pcapkit/const/mh/revocation_status_code.py +83 -0
- pcapkit/const/mh/revocation_trigger.py +86 -0
- pcapkit/const/mh/status_code.py +232 -0
- pcapkit/const/mh/traffic_selector.py +62 -0
- pcapkit/const/mh/upa_status.py +71 -0
- pcapkit/const/mh/upn_reason.py +80 -0
- pcapkit/const/ospf/__init__.py +27 -0
- pcapkit/const/ospf/authentication.py +65 -0
- pcapkit/const/ospf/packet.py +71 -0
- pcapkit/const/pcapng/__init__.py +51 -0
- pcapkit/const/pcapng/block_type.py +152 -0
- pcapkit/const/pcapng/filter_type.py +48 -0
- pcapkit/const/pcapng/hash_algorithm.py +59 -0
- pcapkit/const/pcapng/option_type.py +233 -0
- pcapkit/const/pcapng/record_type.py +57 -0
- pcapkit/const/pcapng/secrets_type.py +56 -0
- pcapkit/const/pcapng/verdict_type.py +53 -0
- pcapkit/const/reg/__init__.py +34 -0
- pcapkit/const/reg/apptype.py +32702 -0
- pcapkit/const/reg/ethertype.py +714 -0
- pcapkit/const/reg/linktype.py +902 -0
- pcapkit/const/reg/transtype.py +523 -0
- pcapkit/const/tcp/__init__.py +35 -0
- pcapkit/const/tcp/checksum.py +55 -0
- pcapkit/const/tcp/flags.py +73 -0
- pcapkit/const/tcp/mp_tcp_option.py +80 -0
- pcapkit/const/tcp/option.py +198 -0
- pcapkit/const/vlan/__init__.py +23 -0
- pcapkit/const/vlan/priority_level.py +71 -0
- pcapkit/corekit/__init__.py +59 -0
- pcapkit/corekit/fields/__init__.py +45 -0
- pcapkit/corekit/fields/collections.py +282 -0
- pcapkit/corekit/fields/field.py +269 -0
- pcapkit/corekit/fields/ipaddress.py +274 -0
- pcapkit/corekit/fields/misc.py +722 -0
- pcapkit/corekit/fields/numbers.py +375 -0
- pcapkit/corekit/fields/strings.py +245 -0
- pcapkit/corekit/infoclass.py +394 -0
- pcapkit/corekit/io.py +506 -0
- pcapkit/corekit/module.py +39 -0
- pcapkit/corekit/multidict.py +626 -0
- pcapkit/corekit/protochain.py +263 -0
- pcapkit/corekit/version.py +33 -0
- pcapkit/dumpkit/__init__.py +15 -0
- pcapkit/dumpkit/common.py +199 -0
- pcapkit/dumpkit/null.py +77 -0
- pcapkit/dumpkit/pcap.py +144 -0
- pcapkit/foundation/__init__.py +45 -0
- pcapkit/foundation/engines/__init__.py +36 -0
- pcapkit/foundation/engines/dpkt.py +230 -0
- pcapkit/foundation/engines/engine.py +194 -0
- pcapkit/foundation/engines/pcap.py +188 -0
- pcapkit/foundation/engines/pcapng.py +310 -0
- pcapkit/foundation/engines/pyshark.py +166 -0
- pcapkit/foundation/engines/scapy.py +161 -0
- pcapkit/foundation/extraction.py +915 -0
- pcapkit/foundation/reassembly/__init__.py +49 -0
- pcapkit/foundation/reassembly/data/__init__.py +48 -0
- pcapkit/foundation/reassembly/data/ip.py +117 -0
- pcapkit/foundation/reassembly/data/tcp.py +145 -0
- pcapkit/foundation/reassembly/ip.py +192 -0
- pcapkit/foundation/reassembly/ipv4.py +50 -0
- pcapkit/foundation/reassembly/ipv6.py +50 -0
- pcapkit/foundation/reassembly/reassembly.py +389 -0
- pcapkit/foundation/reassembly/tcp.py +249 -0
- pcapkit/foundation/registry/__init__.py +41 -0
- pcapkit/foundation/registry/foundation.py +327 -0
- pcapkit/foundation/registry/protocols.py +885 -0
- pcapkit/foundation/traceflow/__init__.py +44 -0
- pcapkit/foundation/traceflow/data/__init__.py +30 -0
- pcapkit/foundation/traceflow/data/tcp.py +105 -0
- pcapkit/foundation/traceflow/tcp.py +159 -0
- pcapkit/foundation/traceflow/traceflow.py +390 -0
- pcapkit/interface/__init__.py +22 -0
- pcapkit/interface/core.py +185 -0
- pcapkit/interface/misc.py +120 -0
- pcapkit/protocols/__init__.py +85 -0
- pcapkit/protocols/application/NotImplemented/bgp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcp.py +0 -0
- pcapkit/protocols/application/NotImplemented/dhcpv6.py +0 -0
- pcapkit/protocols/application/NotImplemented/dns.py +0 -0
- pcapkit/protocols/application/NotImplemented/imap.py +0 -0
- pcapkit/protocols/application/NotImplemented/ldap.py +0 -0
- pcapkit/protocols/application/NotImplemented/mqtt.py +0 -0
- pcapkit/protocols/application/NotImplemented/nntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ntp.py +0 -0
- pcapkit/protocols/application/NotImplemented/onc_rpc.py +0 -0
- pcapkit/protocols/application/NotImplemented/pop.py +0 -0
- pcapkit/protocols/application/NotImplemented/rip.py +0 -0
- pcapkit/protocols/application/NotImplemented/rtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/sip.py +0 -0
- pcapkit/protocols/application/NotImplemented/smtp.py +0 -0
- pcapkit/protocols/application/NotImplemented/snmp.py +0 -0
- pcapkit/protocols/application/NotImplemented/ssh.py +0 -0
- pcapkit/protocols/application/NotImplemented/telnet.py +0 -0
- pcapkit/protocols/application/NotImplemented/tls.py +0 -0
- pcapkit/protocols/application/NotImplemented/xmpp.py +0 -0
- pcapkit/protocols/application/__init__.py +34 -0
- pcapkit/protocols/application/application.py +114 -0
- pcapkit/protocols/application/ftp.py +206 -0
- pcapkit/protocols/application/http.py +176 -0
- pcapkit/protocols/application/httpv1.py +320 -0
- pcapkit/protocols/application/httpv2.py +1255 -0
- pcapkit/protocols/data/__init__.py +192 -0
- pcapkit/protocols/data/application/__init__.py +57 -0
- pcapkit/protocols/data/application/ftp.py +59 -0
- pcapkit/protocols/data/application/httpv1.py +79 -0
- pcapkit/protocols/data/application/httpv2.py +293 -0
- pcapkit/protocols/data/data.py +25 -0
- pcapkit/protocols/data/internet/__init__.py +298 -0
- pcapkit/protocols/data/internet/ah.py +31 -0
- pcapkit/protocols/data/internet/hip.py +804 -0
- pcapkit/protocols/data/internet/hopopt.py +351 -0
- pcapkit/protocols/data/internet/ipv4.py +369 -0
- pcapkit/protocols/data/internet/ipv6.py +67 -0
- pcapkit/protocols/data/internet/ipv6_frag.py +29 -0
- pcapkit/protocols/data/internet/ipv6_opts.py +368 -0
- pcapkit/protocols/data/internet/ipv6_route.py +86 -0
- pcapkit/protocols/data/internet/ipx.py +56 -0
- pcapkit/protocols/data/internet/mh.py +509 -0
- pcapkit/protocols/data/link/__init__.py +33 -0
- pcapkit/protocols/data/link/arp.py +74 -0
- pcapkit/protocols/data/link/ethernet.py +28 -0
- pcapkit/protocols/data/link/l2tp.py +63 -0
- pcapkit/protocols/data/link/ospf.py +58 -0
- pcapkit/protocols/data/link/vlan.py +42 -0
- pcapkit/protocols/data/misc/__init__.py +109 -0
- pcapkit/protocols/data/misc/null.py +18 -0
- pcapkit/protocols/data/misc/pcap/__init__.py +18 -0
- pcapkit/protocols/data/misc/pcap/frame.py +56 -0
- pcapkit/protocols/data/misc/pcap/header.py +53 -0
- pcapkit/protocols/data/misc/pcapng.py +925 -0
- pcapkit/protocols/data/misc/raw.py +25 -0
- pcapkit/protocols/data/protocol.py +32 -0
- pcapkit/protocols/data/transport/__init__.py +71 -0
- pcapkit/protocols/data/transport/tcp.py +555 -0
- pcapkit/protocols/data/transport/udp.py +29 -0
- pcapkit/protocols/internet/NotImplemented/ecn.py +0 -0
- pcapkit/protocols/internet/NotImplemented/esp.py +97 -0
- pcapkit/protocols/internet/NotImplemented/icmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/icmpv6.py +0 -0
- pcapkit/protocols/internet/NotImplemented/igmp.py +0 -0
- pcapkit/protocols/internet/NotImplemented/shim6.py +0 -0
- pcapkit/protocols/internet/__init__.py +43 -0
- pcapkit/protocols/internet/ah.py +275 -0
- pcapkit/protocols/internet/hip.py +4727 -0
- pcapkit/protocols/internet/hopopt.py +1879 -0
- pcapkit/protocols/internet/internet.py +240 -0
- pcapkit/protocols/internet/ip.py +51 -0
- pcapkit/protocols/internet/ipsec.py +50 -0
- pcapkit/protocols/internet/ipv4.py +1782 -0
- pcapkit/protocols/internet/ipv6.py +361 -0
- pcapkit/protocols/internet/ipv6_frag.py +258 -0
- pcapkit/protocols/internet/ipv6_opts.py +1890 -0
- pcapkit/protocols/internet/ipv6_route.py +710 -0
- pcapkit/protocols/internet/ipx.py +230 -0
- pcapkit/protocols/internet/mh.py +2764 -0
- pcapkit/protocols/link/NotImplemented/dsl.py +0 -0
- pcapkit/protocols/link/NotImplemented/eapol.py +1 -0
- pcapkit/protocols/link/NotImplemented/fddi.py +0 -0
- pcapkit/protocols/link/NotImplemented/isdn.py +0 -0
- pcapkit/protocols/link/NotImplemented/ndp.py +0 -0
- pcapkit/protocols/link/NotImplemented/ppp.py +0 -0
- pcapkit/protocols/link/__init__.py +35 -0
- pcapkit/protocols/link/arp.py +421 -0
- pcapkit/protocols/link/ethernet.py +248 -0
- pcapkit/protocols/link/l2tp.py +267 -0
- pcapkit/protocols/link/link.py +140 -0
- pcapkit/protocols/link/ospf.py +342 -0
- pcapkit/protocols/link/rarp.py +82 -0
- pcapkit/protocols/link/vlan.py +225 -0
- pcapkit/protocols/misc/__init__.py +37 -0
- pcapkit/protocols/misc/null.py +129 -0
- pcapkit/protocols/misc/pcap/__init__.py +17 -0
- pcapkit/protocols/misc/pcap/frame.py +478 -0
- pcapkit/protocols/misc/pcap/header.py +358 -0
- pcapkit/protocols/misc/pcapng.py +5520 -0
- pcapkit/protocols/misc/raw.py +180 -0
- pcapkit/protocols/protocol.py +1216 -0
- pcapkit/protocols/schema/__init__.py +140 -0
- pcapkit/protocols/schema/application/__init__.py +40 -0
- pcapkit/protocols/schema/application/ftp.py +21 -0
- pcapkit/protocols/schema/application/httpv1.py +21 -0
- pcapkit/protocols/schema/application/httpv2.py +384 -0
- pcapkit/protocols/schema/internet/__init__.py +294 -0
- pcapkit/protocols/schema/internet/ah.py +40 -0
- pcapkit/protocols/schema/internet/hip.py +1184 -0
- pcapkit/protocols/schema/internet/hopopt.py +679 -0
- pcapkit/protocols/schema/internet/ipv4.py +576 -0
- pcapkit/protocols/schema/internet/ipv6.py +63 -0
- pcapkit/protocols/schema/internet/ipv6_frag.py +48 -0
- pcapkit/protocols/schema/internet/ipv6_opts.py +680 -0
- pcapkit/protocols/schema/internet/ipv6_route.py +198 -0
- pcapkit/protocols/schema/internet/ipx.py +40 -0
- pcapkit/protocols/schema/internet/mh.py +718 -0
- pcapkit/protocols/schema/link/__init__.py +19 -0
- pcapkit/protocols/schema/link/arp.py +39 -0
- pcapkit/protocols/schema/link/ethernet.py +51 -0
- pcapkit/protocols/schema/link/l2tp.py +88 -0
- pcapkit/protocols/schema/link/ospf.py +90 -0
- pcapkit/protocols/schema/link/vlan.py +69 -0
- pcapkit/protocols/schema/misc/__init__.py +108 -0
- pcapkit/protocols/schema/misc/null.py +18 -0
- pcapkit/protocols/schema/misc/pcap/__init__.py +10 -0
- pcapkit/protocols/schema/misc/pcap/frame.py +51 -0
- pcapkit/protocols/schema/misc/pcap/header.py +63 -0
- pcapkit/protocols/schema/misc/pcapng.py +1689 -0
- pcapkit/protocols/schema/misc/raw.py +24 -0
- pcapkit/protocols/schema/schema.py +809 -0
- pcapkit/protocols/schema/transport/__init__.py +69 -0
- pcapkit/protocols/schema/transport/tcp.py +928 -0
- pcapkit/protocols/schema/transport/udp.py +90 -0
- pcapkit/protocols/transport/NotImplemented/dccp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/rsvp.py +0 -0
- pcapkit/protocols/transport/NotImplemented/sctp.py +0 -0
- pcapkit/protocols/transport/__init__.py +27 -0
- pcapkit/protocols/transport/tcp.py +3025 -0
- pcapkit/protocols/transport/transport.py +158 -0
- pcapkit/protocols/transport/udp.py +214 -0
- pcapkit/py.typed +0 -0
- pcapkit/toolkit/__init__.py +57 -0
- pcapkit/toolkit/dpkt.py +306 -0
- pcapkit/toolkit/pcap.py +212 -0
- pcapkit/toolkit/pcapng.py +251 -0
- pcapkit/toolkit/pyshark.py +99 -0
- pcapkit/toolkit/scapy.py +297 -0
- pcapkit/utilities/__init__.py +20 -0
- pcapkit/utilities/compat.py +196 -0
- pcapkit/utilities/decorators.py +192 -0
- pcapkit/utilities/exceptions.py +365 -0
- pcapkit/utilities/logging.py +55 -0
- pcapkit/utilities/warnings.py +185 -0
- pcapkit/vendor/__init__.py +105 -0
- pcapkit/vendor/__main__.py +92 -0
- pcapkit/vendor/arp/__init__.py +27 -0
- pcapkit/vendor/arp/hardware.py +29 -0
- pcapkit/vendor/arp/operation.py +29 -0
- pcapkit/vendor/default.py +474 -0
- pcapkit/vendor/ftp/__init__.py +27 -0
- pcapkit/vendor/ftp/command.py +244 -0
- pcapkit/vendor/ftp/return_code.py +256 -0
- pcapkit/vendor/hip/__init__.py +94 -0
- pcapkit/vendor/hip/certificate.py +29 -0
- pcapkit/vendor/hip/cipher.py +29 -0
- pcapkit/vendor/hip/di.py +29 -0
- pcapkit/vendor/hip/ecdsa_curve.py +29 -0
- pcapkit/vendor/hip/ecdsa_low_curve.py +29 -0
- pcapkit/vendor/hip/eddsa_curve.py +85 -0
- pcapkit/vendor/hip/esp_transform_suite.py +29 -0
- pcapkit/vendor/hip/group.py +87 -0
- pcapkit/vendor/hip/hi_algorithm.py +29 -0
- pcapkit/vendor/hip/hit_suite.py +29 -0
- pcapkit/vendor/hip/nat_traversal.py +29 -0
- pcapkit/vendor/hip/notify_message.py +29 -0
- pcapkit/vendor/hip/packet.py +88 -0
- pcapkit/vendor/hip/parameter.py +88 -0
- pcapkit/vendor/hip/registration.py +29 -0
- pcapkit/vendor/hip/registration_failure.py +29 -0
- pcapkit/vendor/hip/suite.py +29 -0
- pcapkit/vendor/hip/transport.py +29 -0
- pcapkit/vendor/http/__init__.py +39 -0
- pcapkit/vendor/http/error_code.py +95 -0
- pcapkit/vendor/http/frame.py +91 -0
- pcapkit/vendor/http/method.py +167 -0
- pcapkit/vendor/http/setting.py +93 -0
- pcapkit/vendor/http/status_code.py +185 -0
- pcapkit/vendor/ipv4/__init__.py +57 -0
- pcapkit/vendor/ipv4/classification_level.py +91 -0
- pcapkit/vendor/ipv4/option_class.py +80 -0
- pcapkit/vendor/ipv4/option_number.py +105 -0
- pcapkit/vendor/ipv4/protection_authority.py +84 -0
- pcapkit/vendor/ipv4/qs_function.py +78 -0
- pcapkit/vendor/ipv4/router_alert.py +93 -0
- pcapkit/vendor/ipv4/tos_del.py +78 -0
- pcapkit/vendor/ipv4/tos_ecn.py +95 -0
- pcapkit/vendor/ipv4/tos_pre.py +84 -0
- pcapkit/vendor/ipv4/tos_rel.py +78 -0
- pcapkit/vendor/ipv4/tos_thr.py +77 -0
- pcapkit/vendor/ipv4/ts_flag.py +79 -0
- pcapkit/vendor/ipv6/__init__.py +53 -0
- pcapkit/vendor/ipv6/extension_header.py +171 -0
- pcapkit/vendor/ipv6/option.py +104 -0
- pcapkit/vendor/ipv6/option_action.py +90 -0
- pcapkit/vendor/ipv6/qs_function.py +78 -0
- pcapkit/vendor/ipv6/router_alert.py +93 -0
- pcapkit/vendor/ipv6/routing.py +87 -0
- pcapkit/vendor/ipv6/seed_id.py +81 -0
- pcapkit/vendor/ipv6/smf_dpd_mode.py +78 -0
- pcapkit/vendor/ipv6/tagger_id.py +81 -0
- pcapkit/vendor/ipx/__init__.py +37 -0
- pcapkit/vendor/ipx/packet.py +123 -0
- pcapkit/vendor/ipx/socket.py +125 -0
- pcapkit/vendor/l2tp/__init__.py +21 -0
- pcapkit/vendor/l2tp/type.py +78 -0
- pcapkit/vendor/mh/__init__.py +204 -0
- pcapkit/vendor/mh/access_type.py +87 -0
- pcapkit/vendor/mh/ack_status_code.py +88 -0
- pcapkit/vendor/mh/ani_suboption.py +88 -0
- pcapkit/vendor/mh/auth_subtype.py +83 -0
- pcapkit/vendor/mh/binding_ack_flag.py +148 -0
- pcapkit/vendor/mh/binding_error.py +78 -0
- pcapkit/vendor/mh/binding_revocation.py +87 -0
- pcapkit/vendor/mh/binding_update_flag.py +147 -0
- pcapkit/vendor/mh/cga_extension.py +91 -0
- pcapkit/vendor/mh/cga_sec.py +91 -0
- pcapkit/vendor/mh/cga_type.py +74 -0
- pcapkit/vendor/mh/dhcp_support_mode.py +77 -0
- pcapkit/vendor/mh/dns_status_code.py +87 -0
- pcapkit/vendor/mh/dsmip6_tls_packet.py +87 -0
- pcapkit/vendor/mh/dsmipv6_home_address.py +87 -0
- pcapkit/vendor/mh/enumerating_algorithm.py +82 -0
- pcapkit/vendor/mh/fb_ack_status.py +87 -0
- pcapkit/vendor/mh/fb_action.py +88 -0
- pcapkit/vendor/mh/fb_indication_trigger.py +87 -0
- pcapkit/vendor/mh/fb_type.py +88 -0
- pcapkit/vendor/mh/flow_id_status.py +87 -0
- pcapkit/vendor/mh/flow_id_suboption.py +87 -0
- pcapkit/vendor/mh/handoff_type.py +87 -0
- pcapkit/vendor/mh/handover_ack_flag.py +143 -0
- pcapkit/vendor/mh/handover_ack_status.py +87 -0
- pcapkit/vendor/mh/handover_initiate_flag.py +143 -0
- pcapkit/vendor/mh/handover_initiate_status.py +87 -0
- pcapkit/vendor/mh/home_address_reply.py +87 -0
- pcapkit/vendor/mh/lla_code.py +97 -0
- pcapkit/vendor/mh/lma_mag_suboption.py +88 -0
- pcapkit/vendor/mh/mn_group_id.py +87 -0
- pcapkit/vendor/mh/mn_id_subtype.py +87 -0
- pcapkit/vendor/mh/operator_id.py +87 -0
- pcapkit/vendor/mh/option.py +83 -0
- pcapkit/vendor/mh/packet.py +82 -0
- pcapkit/vendor/mh/qos_attribute.py +87 -0
- pcapkit/vendor/mh/revocation_status_code.py +87 -0
- pcapkit/vendor/mh/revocation_trigger.py +87 -0
- pcapkit/vendor/mh/status_code.py +91 -0
- pcapkit/vendor/mh/traffic_selector.py +87 -0
- pcapkit/vendor/mh/upa_status.py +87 -0
- pcapkit/vendor/mh/upn_reason.py +87 -0
- pcapkit/vendor/ospf/__init__.py +27 -0
- pcapkit/vendor/ospf/authentication.py +29 -0
- pcapkit/vendor/ospf/packet.py +29 -0
- pcapkit/vendor/pcapng/__init__.py +51 -0
- pcapkit/vendor/pcapng/block_type.py +94 -0
- pcapkit/vendor/pcapng/filter_type.py +77 -0
- pcapkit/vendor/pcapng/hash_algorithm.py +82 -0
- pcapkit/vendor/pcapng/option_type.py +287 -0
- pcapkit/vendor/pcapng/record_type.py +81 -0
- pcapkit/vendor/pcapng/secrets_type.py +81 -0
- pcapkit/vendor/pcapng/verdict_type.py +79 -0
- pcapkit/vendor/reg/__init__.py +34 -0
- pcapkit/vendor/reg/apptype.py +338 -0
- pcapkit/vendor/reg/ethertype.py +121 -0
- pcapkit/vendor/reg/linktype.py +110 -0
- pcapkit/vendor/reg/transtype.py +111 -0
- pcapkit/vendor/tcp/__init__.py +35 -0
- pcapkit/vendor/tcp/checksum.py +80 -0
- pcapkit/vendor/tcp/flags.py +149 -0
- pcapkit/vendor/tcp/mp_tcp_option.py +90 -0
- pcapkit/vendor/tcp/option.py +103 -0
- pcapkit/vendor/vlan/__init__.py +23 -0
- pcapkit/vendor/vlan/priority_level.py +97 -0
- pypcapkit-1.3.3.post1.dist-info/LICENSE +29 -0
- pypcapkit-1.3.3.post1.dist-info/METADATA +236 -0
- pypcapkit-1.3.3.post1.dist-info/RECORD +466 -0
- pypcapkit-1.3.3.post1.dist-info/WHEEL +5 -0
- pypcapkit-1.3.3.post1.dist-info/entry_points.txt +3 -0
- 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
|