好的,所以我读过的所有地方和我交谈过的每个人都说 NSURLConnection 在异步模式下使用时应该自动使用 OSX 的系统代理设置。
这是我所做的:
- 通过基本身份验证的端口 8080 在另一台主机上设置 squid 代理。
- 在我的 Mac 上的系统代理设置中设置此代理。
- 设置 NSURLConnection 代码来处理异步通信所需的 NSURLConnectionDelegate 方法。我在所有委托方法中都有断点,包括 challengeAuthentication 。代码尝试连接的 http 地址是http://api.box.com地址。
结果:
- 我所有的 OSX/Mac 机器的流量都成功地通过了我的代理,我可以通过 squid 的访问日志看到它通过。
- 我的 NSURLConnection 代码完全绕过代理。据我所知,它完全忽略了它。我接到 3 个代表电话:
- willSendRequestForAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge -> 保护空间中连接挑战的主机是api.box.com(不是代理)
- didReceiveResponse:(NSURLResponse *)response
- didReceiveData:(NSData )数据
- didFinishloading:(NSURLConnection )连接
这些都运行得很好,从 api.box.com 获取他们的数据,但是当参考我的代理的访问日志时......这些调用都不是通过代理进行的......只有直接的。
我通过使用wireshark 验证了这一点,我可以看到几乎所有来自我的Mac 的连接都通过我的代理,但没有任何通过我的代码到box.com 的连接。
我已将缓存策略设置为不在 squid 和 NSURLMutableRequest 上缓存,但均无济于事。
到底是怎么回事 ?我是否在某处遗漏了一些明显愚蠢的东西?
感谢您能想到的任何帮助或任何想法。
谢谢。
更新
所以关于 http 与 https 的评论让我很好奇,所以我尝试了一个随机 URL,它是 http 而不是 https,它通过代理就好了!!!
然后我对 squid 上的访问日志进行了一些更好的关注,我看到一些证书请求被拒绝:
1371072911.976 1 192.168.10.41 TCP_DENIED/407 3676 POST http://ocsp.digicert.com/ - HIER_NONE/- text/html
1371072911.991 1 192.168.10.41 TCP_DENIED/407 3641 GET http://crl3.digicert.com/ca3-g20.crl - HIER_NONE/- text/html
1371072912.101 1 192.168.10.41 TCP_DENIED/407 3641 GET http://crl3.digicert.com/ca3-g20.crl - HIER_NONE/- text/html
1371072912.199 1 192.168.10.41 TCP_DENIED/407 3641 GET http://crl4.digicert.com/ca3-g20.crl - HIER_NONE/- text/html
1371072912.209 1 192.168.10.41 TCP_DENIED/407 3641 GET http://crl4.digicert.com/ca3-g20.crl - HIER_NONE/- text/html
1371072912.219 1 192.168.10.41 TCP_DENIED/407 3729 GET http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl - HIER_NONE/- text/html
1371072912.230 1 192.168.10.41 TCP_DENIED/407 3729 GET http://crl3.digicert.com/DigiCertHighAssuranceEVRootCA.crl - HIER_NONE/- text/html
1371072912.240 1 192.168.10.41 TCP_DENIED/407 3729 GET http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl - HIER_NONE/- text/html
1371072912.347 1 192.168.10.41 TCP_DENIED/407 3729 GET http://crl4.digicert.com/DigiCertHighAssuranceEVRootCA.crl - HIER_NONE/- text/html
所以也许当我试图连接到https://api.box.com时,它无法连接证书或其他东西?也许这实际上是一个 https / squid 问题而不是 NSURLConnection。