1

我正在寻找一种将 NSMutableURLRequest 与应用程序级 proxyHost/Port 设置一起使用的方法,本质上是用 proxyHost/proxyPort 替代 ASIHTTPRequest 库。我尝试修改 CFReadStream(来自 NSURLRequest HTTPBodyStream),但在设置代理设置时它会发出 SIGSEG。我宁愿不必用 CFNetworking 重写我的应用程序,而且看起来 AFNetwork 库也不包含此功能。

有没有人用 NSMutableURLRequest 成功地做到了这一点?

4

1 回答 1

0

真正的答案似乎是创建一个自定义的 NSURLProtocol。应该是直接派生,并将适当的 proxyHost/proxyPort 添加到请求中(以及任何其他值,例如自定义的用户代理字符串)。然后,据推测,所有请求都将通过此自定义协议进行路由(包括 UIWebView requests..direct 或派生的)。

相关样本:

https://developer.apple.com/library/ios/samplecode/CustomHTTPProtocol/Introduction/Intro.html#//apple_ref/doc/uid/DTS40013653

http://eng.42go.com/customizing-uiwebview-requests-with-nsurlprotocol/

当我有东西运行时,我会发布更多。

此实现的注意事项。

  1. 最初开始在我的自定义 NSURLPProtocol 中使用 CFNetworking 作为“楔子”,但很快发现我正在重写与 ASIHTTPRequest 中相同的代码。所以我刚刚用 ASIHTTPRequest 实现了楔形。
  2. 没有很好地(或根本没有)记录的项目是 UIWebView 与 NSURLProtocol 回调的交互,与 NSURLRequest/Conenction 与 NSURLProtocol 的交互。一些发现:

    • a) 所有依赖的页面资源都是由 UIWebView 自动加载的(我们知道),它们都经过 NSURLProtocol,所以这是一个很好的放置代码来修改所有请求的地方。

    • b) UIWebView 设置Referer 标头。在重定向时,让 UIWebView 将其引用者从原始 URL 更新到新的重定向 URL 的唯一方法是使用[[self client] URLProtocol:self wasRedirectedToRequest:redirectRequest redirectResponse:tmpHttpResponse];回调。

    • c) 当 UIWebView 接收到上述重定向回调时,它会
      生成一个新的 NSURLRequest(本质上是你发回给
      它的那个)。因此,如果您有一个喜欢在
      内部进行重定向的楔子,您必须取消它尝试发出的请求,以支持来自 UIWebView 的新请求。

  3. 您必须小心从 ASIHTTPRequestDelegate 实现的回调。例如,实施didReceiveData将禁用内置的 gzip 处理。 willRedirectToURL禁用大多数内置重定向处理(即使您[request redirectToURL:newURL];按照评论中的建议调用)。

于 2013-09-30T22:49:17.730 回答