你的应用向 CFNetwork 询问如何访问某个网站,得到的却是一个以 .pac 结尾的 URL。把这个主机名放进 socket 连接是走错了路:它标识的是一个配置脚本。

CFNetworkCopyProxiesForURL 为目标 URL 返回一个有序的字典数组。在读端点字段之前,先检查 kCFProxyTypeKey。类型为 kCFProxyTypeAutoConfigurationURL 的字典会提供 kCFProxyAutoConfigurationURLKey,这需要再进行一次求值。

  1. 获取当前系统代理设置,并请求通往真实目标 URL 的路由。
  2. 当结果引用某个 PAC URL 时,针对同一目标对该脚本求值。
  3. 读取得到的候选类型和端点。HTTP 代理、SOCKS 代理和直连路径需要不同的连接处理。
  4. 应用允许的失败与回退行为时,保持候选顺序。

CFNetworkExecuteProxyAutoConfigurationURL 会异步下载并求值该脚本。它的立即返回值是一个 run loop 源。请调度该源;工作完成后,回调会给出求值结果或错误。创建源后立刻读取空的结果变量不会等待任何东西。如果必须取消操作,请使该源失效。

让目标 URL 始终与查询绑定。PAC 脚本可以为两个主机选择不同的路由,因此把一次解析出的代理当作后续每个目标的答案,会改变脚本的策略。同样,直连候选是一条明确的路径,而不是缺失的代理主机名。

当自定义传输层需要解释系统设置时,这些 API 很有用。它们并不为该传输实现后续的代理协议,查询也不会从 Keychain 取回密码。在 macOS 上,需另行匹配 Keychain 中的代理凭据。

相关文章