普贤教程 › 包参考
cookiejar 包
会话 Cookie 管理(HTTP 客户端复用)
纯语言实现(dict/list 引用语义,jar 原地更新),编译/解释双模式一致。
| 项 | 值 |
|---|---|
| 包名 | cookiejar |
| 版本 | 0.2.0 |
| 可用版本 | 0.1.0 / 0.2.0 |
| 入口 | cookiejar.px |
| 分类 | Web 与 HTTP |
| 文件数 / 行数 | 1 / 299 |
安装与引入
bash
pxpkg init # 首次 pxpkg add cookiejar@0.2.0 pxpkg install
px
import cookiejar所属分类教程:Web 与 HTTP
公开接口
| 函数 | 参数 |
|---|---|
cj_new | |
cj_update | jar, headers |
cj_header | jar, url |
其余 14 个 def(内部与辅助,可直接调用但不属稳定接口)
| 函数 | 参数 |
|---|---|
cj_is_int | s |
cj_blank | |
cj_parse_setcookie | line |
cj_extract | headers |
cj_put | jar, c |
cj_remove | jar, domain, name, path |
cj_url_host | url |
cj_url_path | url |
cj_url_secure | url |
hx_url_find | s, needle |
cj_domain_match | host, domain |
cj_path_match | reqpath, cpath |
cj_len | jar |
cj_clean | jar, now_sec |
包内说明(源码头注释)
text
============================================================
普贤标准库:std.cookiejar —— 会话 Cookie 管理(HTTP 客户端复用)
------------------------------------------------------------
纯语言实现(dict/list 引用语义,jar 原地更新),编译/解释双模式一致。
面向「多次 http_request 保持会话」场景:把响应 Set-Cookie 收进 jar,
请求前按 URL 生成 Cookie 请求头。
jar = {"cookies": [cookie, ...]}(list;每条 cookie 为 dict)
cookie = {name, value, domain, path, secure, httponly, samesite, expires, max_age}
规则(RFC 6265 简化子集):
- 无 Domain 属性的会话 cookie:domain 记为 "*",匹配任意 host(仅限 path)
- 有 Domain 属性:host 精确等于或以其 "." + domain 结尾才匹配
- path 匹配:请求 path 以 cookie path 为前缀(path 缺省 "/")
- Max-Age=0 立删;expires 仅存原始串不判过期(最小实现,见文件尾注)
- secure cookie 仅 https 请求携带(url scheme 判断)
✅ 同名多值(M109 二期起):http_request 返回的 headers dict 中,同名头从**第二次出现**
起聚合为 list[str](键名沿用首次出现的拼写,大小写不敏感匹配);**单值仍是 str**。
故两个 Set-Cookie 会以 list[str] 到达 —— 本库的 list 分支即正常路径
(M109 二期之前该分支**不可达**:C 层是「后写覆盖前写」,多 Set-Cookie 只有最后一个可见)。
用法:
import std.cookiejar
var jar = cj_new()
var r1 = http_request(url_login, "POST", body)
cj_update(jar, r1["headers"])
var r2 = http_request(url_api, "GET", null,
{"Cookie": cj_header(jar, url_api)})
============================================================
---- M184:本地「十进制整数串」判定(与语言层严格 `int()` **同口径**)----
为什么需要它:M184 把 `int()`/`float()` 从 C atoi 式**宽容前缀解析**改成**严格解析**
(畸形输入 ⇒ `R1002`)。而本库的 `Max-Age` 值**直接来自 `Set-Cookie` 头**(外部输入)
⇒ 不加守卫的话,一个 `Max-Age=abc` 就能把服务端打成运行时错误(新攻击面)。
RFC 6265 §5.2.2 的容错口径 = 「非法 Max-Age 视为**无该属性**」⇒ 这里返回 false 即跳过。
⚠️ 通用能力(内置 `is_int_str` / `is_float_str`)排在 **M185**;本轮先给受影响的库
一个本地守卫,避免把"语言变严格"的代价转嫁给使用者。