🔗 Client Streams
🔗 简介
clientStream 是一个单向松耦合的管道。每个节点包含四个方法 - read、callback、detach 和 status,以及流的内部管理变量(一个 dlink 节点和指向列表头部的指针)、节点的上下文数据以及读取请求参数 - readbuf、readlen 和 readoff(在主体中)。clientStream 是调度的基本单元,clientStreamRead 和 clientStreamCallback 调用允许根据需要进行延迟调度活动。关于流操作的理论
- 某个东西会创建一个管道。至少需要一个具有 status 方法和 read 方法的头部,以及一个具有 callback 方法和有效初始读取请求的尾部。
- 其他节点可以添加到管道中。
- 调用尾部前一个节点的 read 方法。
- 对于管道中的每个节点,该节点要么
- 满足读取请求,或者
- 在其上方插入一个新节点并调用 clientStreamRead,或者
- 调用 clientStreamRead
不同节点的 Read 参数之间没有强制的对应关系,只要提供的回调是正确的即可。
- 第一个满足读取请求的节点必须生成一个 httpReply,以便向下传递给管道。主体数据可以提供。
- 在第一次回调时,一个节点可以进一步在管道中插入下游节点,但之后不可以。
- 回调沿着管道向下进行,直到一个节点进行进一步读取而不是满足回调(转到 4),或者到达管道末端,在那里可以安排新的读取序列。
🔗 实现说明
ClientStreams 已实现客户端回复逻辑,以客户端套接字(列表尾部为 clientSocketRecipient)或自定义处理程序(用于 in-squid 请求)开始,管道头部为 clientGetMoreData,它使用 clientSendMoreData 将数据向下发送到管道。客户端 POST 主体目前不使用管道,它们使用之前的代码来发送数据。这将在时间允许时完成。
🔗 节点包含什么
每个节点必须包含
- read 方法 - 允许管道中的松耦合。(因此,读取器可能会在管道改变时改变,即使在流动过程中)。
- callback 方法 - 同理。
- status 方法 - 同理。
- detach 方法 - 用于确保所有资源都得到妥善清理。
- dlink head 指针 - 允许从节点内部进行列表插入和删除。
- context 数据 - 允许被调用的节点维护其私有信息。
- read 请求参数 - 出于两个原因
- 允许节点动态确定请求的数据偏移量、长度和目标缓冲区。同样,这是为了促进松耦合。
- 由于 Squid 的回调性质,每个节点无论如何都必须在其上下文中保留这些参数,因此这减少了程序员的开销。
🔗 方法详情
第一个参数始终是客户端流的“this”引用,它是一个 clientStreamNode *。
🔗 Read
参数
- clientHttpRequest * - 请求数据的超集,随着时间推移被精简。不得为 NULL。
- offset, length, buffer - 什么、多少以及在哪里。
副作用:触发对满足 httpClientRequest 元信息以及(如果适用)offset、length 和 buffer 参数的数据的读取。
🔗 Callback
参数
- clientHttpRequest * - 请求数据的超集,随着时间推移被精简。不得为 NULL。
- httpReply * - 仅在第一次回调时不为 NULL。所有权向下传递给管道。每个节点可以酌情修改回复。
- buffer, length - 在哪里以及多少。
副作用:将数据返回到流中的下一个节点。数据可以立即返回,也可以延迟到后续调度周期。
🔗 Detach
参数
- clienthttpRequest * - 不得为 NULL。
副作用
- 将此节点从 clientStream 中移除。流基础设施负责移除。此节点必须已清理所有上下文数据,除非计划的回调会负责。
- 通知列表中此节点之前的节点已分离。
🔗 Status
参数
- clienthttpRequest * - 不得为 NULL。
副作用:允许节点查询上游节点
- stream ABORTS - 由于某种原因请求已取消。上游将不再接受读取。
- stream COMPLETION - 上游已完成,将不再接受读取。
- stream UNPLANNED COMPLETION - 上游已完成,但不在预定位置(用于 keepalive 检查),并且将不再接受读取。
- stream NONE - 无特殊状态,允许进一步读取。
🔗 Abort
参数
- clienthttpRequest * - 不得为 NULL。
副作用:分离流的尾部。目前不清理尾部节点数据 - 这必须单独完成。因此,Abort 只能由尾部节点调用。
导航:网站搜索,网站页面,分类,🔼 向上