Squid Web Cache Wiki

Squid Web Cache 文档

🔗 重构转发链

目前 Squid 在我们可以请求的协议之间存在混淆

以及我们拥有服务器实现的协议

以及我们拥有客户端实现的协议

有一个 补丁 用于分离服务器实现 - HTTPS, HTTP, ICP, HTCP。这可能需要更多工作才能真正完善,并计划在 3.1 中发布。

在将我们可以请求的协议分离成一组干净的类、使其模块化方面已经做了一些工作,但尚未完成 - 而且在分离我们实现客户端的协议以及请求对象与实际将其移交给外部服务器之间的连接之前,可能无法完成。

此提案试图提供一个一致的 API 来实现这一点,这将允许

🔗 设计

Squid 内处理请求有三种主要方式

每个请求的 scheme 字段是一个相当好的驱动此操作的键:scheme->startFetch() 将请求处理移交给模块想要做的任何事情。模块将负责在此点正确地确保错误等发生。

内部处理的 URL 方案将自行实现 startFetch。然而,大多数方案不是内部的,而是 ForwardableURLScheme 的子类。ForwardableURLScheme 在其 startFetch 方法中,创建一个 FwdState 并启动现有的 FwdState 进程。

也就是说,一组对等体被选中,基于对等体的配置数据 - ACL、netdb,以及我们关于对等体的数据 - 缓存摘要等,并且可能通过线路上到缓存的 ICP 查询。

我们将稍微修改此查找。首先,我们将为 URLScheme 添加一个方法 - request->scheme 的类型 - 称为 'protocolClientAvailable'。此方法仅当 Squid 具有该协议的原生实现时才返回 true。如果返回 false,我们将要求它通过对等体转发。(例如,考虑 WAIS,我们不原生实现它。我们只能通过实现 WAIS 的对等体来满足 WAIS。)

此时我们有一组要尝试的对等体。对于每个对等体(如果允许,包括直接访问的那个)

🔗 示例

🔗 CONNECT

ConnectURLScheme 将是 ForwardableURLScheme 的子类。Connect 将对 protocolClientAvailable() 调用返回 true。connect 的 protocolClientFactory 将直接进入隧道模式,并告知 forward state 它正在向客户端发送数据,并且无法重新转发。没有 CONNECT 对等体类型。

🔗 HTTP

HTTPUrlScheme 将是 ForwardableURLScheme 的子类。HTTPUrlScheme 将对 protocolClientAvailable() 调用返回 true。http 的 protocolClientFactory 将是 HTTPClientFactory 的实例。这将返回一个 HTTPClient,它大致相当于今天的 HTTPServerState,但只有线路级别方面。

将有一个 HTTP Peer 子类。其 protocolClientFactory 属性默认情况下将与 HTTPUrlScheme 的相同。

🔗 HTTPS

HTTPSUrlScheme 将是 ForwardableURLSche,e 的子类。HTTPUrlSchceme 将对 protocolClientAvailable() 调用返回 true。HTTPSUrlScheme 将仅在启用 SSL 支持时编译。protocolClientFactory 将是 SSLClientFactory,并使用 HTTPClientFactory 实例进行参数化。SSLClientFactory 接受一个套接字并执行 SSL 握手,之后它们调用它们被参数化的工厂 - 因此序列是

  1. aSSLClientFactory(fd, ProtocolClientRequest *requestor)
  2. 创建 SSLClientEndpoint(fd)
  3. 创建 SSLConnectionRequest(this, requestor)
  4. 调用 endpointer->connect(theSSLConnectionRequest)
  5. 进行握手
  6. 握手完成时调用 theSSLConnectionRequest->connected(),或者如果握手失败则调用 ->failed()。
  7. 发生错误时,我们创建一个全局实例 - FailedSSLProtocolClient,它将生成错误。
  8. 连接成功后,我们调用 this->nestedProtocolClientFactory(theSSLClientEndpoint->fd, theSSLConnectionRequest)。这将创建嵌套的 ProtocolClient - 即,对于 HTTPS,这将创建实际连接到 SSL 客户端的 HTTPClient。
  9. SSLClientEndpoint 被赋予 HTTPClient 来拥有引用,就像 Socket 拥有 SSLClientEndpoint 一样。
  10. SSLClientEndpoint 然后将原始请求者与 HTTPClient 联系起来。

不会有 HTTPSPeer 子类。相反,HTTPS 对等体会是 HTTPPeer 的实例,其 protocolClientFactory 设置为 SSLClientFactory 的实例,并使用 HTTPClientFactory 进行参数化。

这意味着只有一条代码路径会为客户端创建 HTTPS 包装器。这也意味着我们可以对任何协议执行 Gophers 或其他此类 TLS 操作。

🔗 Gopher

GopherURLScheme 将是 ForwardableURLScheme 的子类。Connect 将对 protocolClientAvailable() 调用返回 true。gopher 的 protocolClientFactory 将返回一个 GopherClient 对象。没有 Gopher 对等体类型,因为我们的 gopher 实现无法转发其他协议。

分类: WantedFeature

导航:站点搜索站点页面类别🔼 向上