Summary

  • RFC 9585 为长时间运行的 IMAP 命令定义了未标记的 INPROGRESS 通知。它可能报告处理进度,也可能只是在防止客户端超时断线。
  • 真正结束命令的仍是带原命令标签的 OK、NO 或 BAD;搜索结果、复制状态和业务后果都需要各自的证据,不能由 PROGRESS 或 GOAL 代替。

看到“已处理 999,目标 1,000”时,人很容易把剩下的一个单位当成唯一的不确定性。自动化系统更危险:它可能把 99.9% 写成一个条件,提前启动下一步。

RFC 9585 并没有承诺只剩一个对象,也没有承诺命令最终成功。目标可以变化,进度可以倒退,已经发出多次通知的命令仍可能以失败结束。那两个数字只是服务器用于描述当前工作量的一种模型。

标准真正解决的是长命令的沉默。IMAP 搜索、复制或其他操作可能耗时很久,客户端无法区分“服务器还在做事”和“连接已经失去响应”。过去服务器可以发送一行自然语言安慰客户端,但软件无法可靠解析。2024 年 5 月发布的 RFC 9585 增加 INPROGRESS 能力与响应码,让活动信号有统一语法。

第一层是能力声明。支持扩展的服务器必须在 CAPABILITY 响应里列出 INPROGRESS。这只说明服务器理解并会发出这种通知,不代表每个命令都会收到它。若命令在建议的首次通知时间之前完成,整个过程可以一条进度通知都没有。

第二层是连接保活。服务器可以发送 INPROGRESS,仅仅为了避免客户端超时关闭连接。RFC 建议在选择发送时每 10 至 15 秒通知一次。最弱形式没有任何明细;命令标签、进度和目标全部按 NIL 解释。它能证明的,是服务器在该连接上发出了一次状态脉冲。

第三层才是可计量进度。可选元组依次包含 CMD-TAG、PROGRESS 和 GOAL。进度是已经处理的非负数量;目标是可选的正数,表示命令完成后预期到达的总量。若工作无法用对象数表达,服务器可以把目标设为 100,用 0 至 99 表示百分比。

这些字段允许未知。没有进度时,进度和目标都必须是 NIL。知道已处理多少却不知道总量时,目标可以是 NIL。命令标签不可用,或原标签含有 ] 时,标签也必须变成 NIL。只有一个命令在飞时,匿名脉冲仍可能有用;多个命令并发时,它就无法可靠指出自己属于哪一项工作。

即使三个字段齐全,也不是一张时间表。标准说进度通常应该单调增加,目标通常不应变化;同时又要求客户端必须处理反例。目标变化或进度回退时,推荐解释是:旧目标已经完成,但服务器发现了更多耗时工作。这个解释帮助客户端继续运行,却不使旧目标成为完整工作量,也不使新比例成为 ETA。

IMAP 的语法把边界划得更硬。RFC 9051 规定,以 * 开头的未标记响应承载数据或不结束命令的状态;完成结果则带回发起命令时的标签,用 OK 表示成功、NO 表示失败、BAD 表示协议错误。因此 INPROGRESS 必须嵌在未标记的 OK 中,不能出现在带标签响应里。带标签结果出现时,命令已经结束,再报告进度没有意义。

这也意味着,一连串看起来健康的数字可以走向三种完成状态中的任何一种。活动不是成功的预付款。客户端不能因为进度达到某个阈值,就把依赖成功的动作提前提交。

搜索示例揭示了另一层区别。服务器先两次报告处理计数,随后通过未标记的 SEARCH 响应给出匹配的邮件编号,最后才用带标签 OK 完成命令。GOAL 不是匹配数,PROGRESS 不是结果集,而 OK 也不包含搜索究竟找到了什么。三种证据分别回答工作是否仍在推进、结果是什么、命令是否成功结束。

RFC 9585 明文禁止把进度值用于其他权威用途,并特别说明不能拿 GOAL 代替 SEARCH 的正常输出,去推断文件夹中有多少邮件。同样的纪律也适用于 COPY:已处理数量不证明目标端持久保存了多少对象,更不能证明后续索引、复制、归档或通知已经完成。

“没有信号”也容易被夸大。在服务器第一次通知前,客户端必须把进度视为零、目标视为未知。快速成功的命令可能根本不通知。因此沉默不能证明服务器没有工作;反过来,持续保活也不能证明服务器做了有效工作。

安全要求说明这些数字不能直接喂给界面或自动化。恶意服务器可能发送导致算术异常、比例失真或资源消耗的值。标准要求忽略目标为零或负数、极端数值、进度大于目标等无效通知。实现还应保留原始序列,对多命令场景中的匿名通知维持歧义,而不是替服务器猜一个归属。

可靠的客户端需要一台小型状态机。先记录能力是否声明,再把每次通知与连接、认证会话和命令标签绑定。单独保存进度序列与目标修订,单独收集命令输出。只有收到相同标签的最终完成响应,才能离开“执行中”。若命令结果还会触达别的系统,成功之后仍要对目标状态进行核对。

最后这一步不能省。带标签 OK 是服务器在 IMAP 协议内给出的成功回执,不是所有业务后果的统一证明。COPY 成功并不自动证明归档系统完成索引、法律保全系统看到对象、跨区副本收敛或客户通知已经发出。每增加一个系统,就增加一张必须单独取得的回执。

RFC 9585 的价值来自这种克制。它让长任务更可观察,也减少误断连接。它同时提醒运营者:能力不是使用,保活不是计量,计量不是完成,完成不是结果数量,协议成功更不是全部下游现实。

进度条可以移动。决定下一步的权威仍在别处。

Sources