ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

jc 项目 http-headers 解析器:把 HTTP 请求/响应头转换为结构化 JSON

jc 项目 http-headers 解析器:把 HTTP 请求/响应头转换为结构化 JSON 开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载本篇技术指南围绕 jcJSON Convert项目中的http_headers解析器展开介绍如何将 HTTP 请求行、状态行与各类请求/响应头文本一键转换为可直接交给 jq、Python 脚本处理的 JSON 字典列表。读完本文你将掌握jc --http-headers的 CLI 与模块两种用法、完整输出 Schema、well-known 头字段的聚合与类型转换规则以及它与curl-head解析器的配合方式。解析器定位面向原始头文本的通用转换http_headers是 jc 项目中面向通用 HTTP 头文本的解析器定义见 jc/parsers/http_headers.py。它的输入是已经抓取到文件或管道中的原始头文本输出是字典列表——每个请求/响应报文对应一个字典元素报文内部的每个头字段被规范化为字典键值。它在 jc 解析器体系中属于standard、file类别见 info 类并同时支持 linux、darwin、cygwin、win32、aix、freebsd 等平台。处理依据主要参考 HTTP 头规范如 RFC 2616、RFC 7231 以及 MDN 的 HTTP Headers 文档对 well-known 头做了专门的聚合与类型化处理允许同一头出现多个实例多个值被聚合为数组以逗号分隔的值会被拆分、去空白后并入数组规范中定义为整型、浮点型的头被转换为对应数值类型规范中定义为 HTTP 日期格式的头如Date、Expires除保留原字符串外还额外生成*_epoch_utc字段。如果输入来自curl -v的verbose 输出则不应直接使用本解析器而应使用curl-head解析器jc/parsers/curl_head.py它会剥掉、前缀并删除以*开头的非头行——这一点在文档与源码的 docstring 中均有明确提示。安装与两种用法安装 jc 后即可使用该解析器安装方式见项目 README.mdCLI 用法$ cat headers.txt | jc --http-headers其中headers.txt是包含原始 HTTP 头的文本文件。打印可读化 JSON$ cat headers.txt | jc --http-headers -p输出原始未类型化处理字符串结果$ cat headers.txt | jc --http-headers -p -r模块用法import jc result jc.parse(http_headers, http_headers_output) # result: List[Dict[str, Any]]parse函数签名与文档一致见 parse 定义def parse( data: str, raw: bool False, quiet: bool False ) - List[JSONDictType]参数类型说明datastr待解析的 HTTP 头文本rawbool为 True 时返回未加工unprocessed的字符串形态输出quietbool为 True 时抑制兼容性等警告信息返回值为字典列表List of DictionariesrawTrue返回原始结构化数据否则返回符合 Schema 的处理后数据。输入格式一次可包含多个请求/响应报文解析器按行处理文本识别三类起始行并据此决定新报文从哪里开始请求行形如METHOD URI HTTP/version方法取自GET/POST/HEAD/PUT/DELETE/PATCH/OPTIONS/TRACE/CONNECT源码中的METHODS集合jc/parsers/http_headers.py#L321状态行形如HTTP/1.1 200 OK以小写http/开头即可识别普通头行形如Header-Name: value。测试固件 tests/fixtures/generic/http_headers--example-com.out 展示了同时包含一个请求和一个响应的输入样例HEAD / HTTP/1.1 Host: example.com User-Agent: curl/8.1.2 Accept: */* HTTP/1.1 200 OK Accept-Ranges: bytes Age: 140203 Cache-Control: max-age604800 Content-Type: text/html; charsetUTF-8 Date: Sun, 04 Feb 2024 02:25:07 GMT Etag: 3147526947 Expires: Sun, 11 Feb 2024 02:25:07 GMT Last-Modified: Thu, 17 Oct 2019 07:18:26 GMT Server: ECS (sac/252F) X-Cache: HIT Content-Length: 1256重定向场景下的多响应报文同样支持见 tests/fixtures/generic/http_headers--google-com.out其中包含301 Moved Permanently与200 OK两个状态行解析后得到两个字典元素。输出 Schema报文元数据 常规头 well-known 头解析结果为数组每个元素结构如下完整 Schema 见 docs/parsers/http_headers.md[ { _type: string, # request 或 response _request_method: string, # 请求方法 _request_uri: string, # 请求 URI _request_version: string, # 请求 HTTP 版本 _response_version: string, # 响应 HTTP 版本 _response_status: integer, # 响应状态码 _response_reason: string or null, # 状态短语 header: string, # 非 well-known 头字符串值 # well-known 头见下方分类 } ]以 example.com 固件为例解析结果tests/fixtures/generic/http_headers--example-com.json包含两个元素[ { _type: request, _request_method: HEAD, _request_uri: /, _request_version: HTTP/1.1, host: example.com, user-agent: curl/8.1.2, accept: [*/*] }, { _type: response, _response_version: HTTP/1.1, _response_status: 200, _response_reason: [OK], accept-ranges: [bytes], age: 140203, cache-control: [max-age604800], content-type: text/html; charsetUTF-8, date: Sun, 04 Feb 2024 02:25:07 GMT, etag: \3147526947\, expires: Sun, 11 Feb 2024 02:25:07 GMT, last-modified: Thu, 17 Oct 2019 07:18:26 GMT, server: [ECS (sac/252F)], x-cache: HIT, content-length: 1256, date_epoch_utc: 1707013507, expires_epoch_utc: 1707618307, last-modified_epoch_utc: 1571296706 } ]值得注意的细节状态行中的原因短语OK在结果里表现为数组形态[OK]这与状态行解析采用version, status, *reason line.split(maxsplit2)的实现有关——reason 被拆分为单词列表无原因短语时为null源码 jc/parsers/http_headers.py#L502-L507非 well-known 头如host、user-agent、etag、x-cache保持字符串键名统一转为小写well-known 头字段名统一转为小写字典键。well-known 头的三类处理规则源码中用五组集合定义 well-known 头的处理方式jc/parsers/http_headers.py#L323-L4111. 数值型INT_HEADERS/FLOAT_HEADERS解析后转换为int/float。类型头字段integeraccept-ch-lifetime、access-control-max-age、age、content-dpr、content-length、device-memory、downlink、dpr、large-allocation、max-forwards、rtt、upgrade-insecure-requestsfloatx-content-duration整数数组x-cache-hits每个数组元素单独转 int见 特殊处理2. 日期时间型DT_HEADERS/DT_OR_INT_HEADERS/DT_OR_STR_HEADERS保留原始字符串同时追加*_epoch_utc整型字段Unix 秒级时间戳通过jc.utils.timestamp(...)计算DT_HEADERS固定日期date、if-modified-since、if-unmodified-since、last-modified、memento-datetimeDT_OR_INT_HEADERS日期或整数如Expires、Retry-After能解析出日期则生成*_epoch_utc若值本身是纯数字则同时转为intDT_OR_STR_HEADERSif-range同样追加*_epoch_utc。例如响应中的date字符串Sun, 04 Feb 2024 02:25:07 GMT对应date_epoch_utc: 1707013507。3. 多值/逗号拆分型SPLIT_AND_MULTI_HEADERS与MULTI_HEADERSSPLIT_AND_MULTI_HEADERS约 40 个含accept、accept-encoding、cache-control、server、vary、warning、x-cache-hits等同一头出现多次时累积进同一数组值内含逗号时按逗号拆分并strip去空白。例如Cache-Control: public, max-age2592000会得到[public, max-age2592000]见 google 固件MULTI_HEADERScontent-security-policy、content-security-policy-report-only、cookie、set-cookie——多次出现时聚合为数组但不按逗号拆分cookie 值内含逗号/分号拆分会破坏语义。google 固件中三个Set-Cookie头被聚合成三项数组即是此规则的结果。源码级解析流程parse 函数 的整体流程如下依次调用jc.utils.compatibility()平台兼容检查、jc.utils.input_type_check()输入类型校验与jc.utils.has_data()空数据判断逐行扫描data.splitlines()取每行第一个词去掉尾部冒号、转小写作为识别依据命中METHODS集合 → 开始新请求报文解析method / uri / version若存在上一个未收尾的报文则先追加进结果以小写http/开头 → 开始新响应报文解析version / status / reason命中SPLIT_AND_MULTI_HEADERS→ 按:拆分键值、逗号拆分值并累积数组命中MULTI_HEADERS→ 按:拆分键值、直接 append 数组其余行 → 按:拆分为普通键值对收尾时把最后一个报文追加进结果rawFalse时调用_process()jc/parsers/http_headers.py#L413-L450执行数值转换、时间戳生成与x-cache-hits特例处理。rawTrue即-r参数时跳过第 4 步所有值保持原始字符串形态——例如age显示为140203、content-length显示为1256、且不再生成*_epoch_utc字段对比文档示例中的-r输出。与 curl-head 解析器的协作文档明确指出如果头文本来自curl的 verbose 输出、、*前缀行应改用curl-head解析器。从源码看curl_head并不重复实现头解析而是复用本解析器其 parse 函数 先用_remove_extra_chars()剥掉、前缀并清空*行verbose 模式下其余非头行也置空随后直接调用headers_parser.parse(data_str, raw, quiet)并共享同一份 Schema 与 well-known 头规则。典型用法$ curl --head www.example.com | jc --curl-head $ curl -Ivs www.example.com 21 | jc --curl-head # verbose 输出需重定向 STDERR $ jc curl --head www.example.com # 魔法语法或模块方式jc.parse(curl_head, curl_head_command_output)。测试验证与固件该解析器由 tests/test_http_headers.py 覆盖包含两个测试点test_http_headers_nodata空输入场景预期返回空列表test_http_headers_all_fixtures遍历固件目录将.out输入与同名.json期望输出比对。相关固件位于 tests/fixtures/generic/http_headers--example-com.out/.json请求 响应混合样例覆盖age、content-length的整型转换及三个日期头的*_epoch_utc生成http_headers--google-com.out/.json301 200 双响应样例覆盖cache-control逗号拆分、set-cookie多值聚合、transfer-encoding数组化等行为。使用建议与边界头文本来源优先使用curl --head/-I配合curl-head解析器若手中已有干净的纯头文本文件直接用--http-headers即可raw 模式需要保留字符串原貌如做签名校验、日志回放时使用-r类型注意_response_reason是单词列表形态expires、retry-after这类日期或秒数字段在日期可解析时生成*_epoch_utc纯数字时则转为整数大小写所有头键统一小写输出处理时头名匹配不区分大小写首词先rstrip(:)再lower()平台兼容性与 jc 多数解析器一致兼容 linux、darwin、cygwin、win32、aix、freebsd可在各类环境下放心用于日志解析与自动化脚本。综合来看http_headers是 jc 中文件类解析器的一个典型实现以规范驱动 well-known 头字段的类型化与聚合同时保持通用头的透明字符串传递配合curl-head可形成完整的 HTTP 头抓取→结构化→管道处理的自动化链路。赞分享开发工具【免费下载链接】jcCLI tool and python library that converts the output of popular command-line tools, file-types, and common strings to JSON, YAML, or Dictionaries. This allows piping of output to tools like jq and simplifying automation scripts.项目地址https://gitcode.com/gh_mirrors/jc/jc点击查看免费下载相关推荐AndroidIndex项目中的HTTP请求头与响应头详解AndroidIndex项目中的HTTP请求头与响应头详解 HTTP头部概述 HTTP协议作为现代互联网通信的基础其请求和响应过程中都依赖于各种头部信息来传递jc lsmod 解析器详解把 Linux 内核模块清单转为结构化 JSONjc lsmod 解析器详解把 Linux 内核模块清单转为结构化 JSON 本篇技术指南围绕 jc 项目中的 lsmod 解析器展开覆盖命令行调用方式、P开发工具jc lspci 解析器把 PCI 设备清单输出转换为结构化 JSON 的完整解析机制jc lspci 解析器把 PCI 设备清单输出转换为结构化 JSON 的完整解析机制 本文以 jc 仓库中的 lspci 解析器为核心完整讲解它支持的三种开发工具上一篇攻克学术翻译痛点Zotero PDF Translate如何实现专业公式的精准渲染下一篇PrimeFlex配置与定制打造专属你的CSS工具集创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表