NSURLProtocol - 处理https请求

时间:2015-02-13 12:31:03

标签: ios objective-c nsurlprotocol

这是canInitWithRequest中的NSURLProtocol

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
  // only handle http requests we haven't marked with our header.
  if ([[[request URL] scheme] isEqualToString:@"http"] &&
      ([request valueForHTTPHeaderField:RNCachingURLHeader] == nil)) {
    return YES;
  }
  return NO;
}  

但我希望NSURLProtocol也允许 https 请求 我试过这个,但所有请求在调用时都失败了:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
  // only handle http requests we haven't marked with our header.
  if (([[[request URL] scheme] isEqualToString:@"http"] || [[[request URL] scheme] isEqualToString:@"https"]) &&
      ([request valueForHTTPHeaderField:RNCachingURLHeader] == nil)) {
    return YES;
  }
  return NO;

}

一个示例是具有 https 方案的登录请求。在上面的函数中,返回 YES ,但是当调用登录请求时,我在日志中收到此错误:

错误域名= NSURLErrorDomain代码= -1004"无法连接到服务器。"

但是,如果我删除了canInitWithRequest https 的检查,我就不会收到任何错误。
我正在使用RNCachingURLProtocol来缓存请求 我怎样才能做到这一点。

2 个答案:

答案 0 :(得分:1)

只是为了测试和理解重构你的代码:

+ (BOOL)canInitWithRequest:(NSURLRequest *)request
{
    NSString *scheme = [[[request URL] scheme] lowercaseString];
    BOOL supportedScheme = [scheme isEqualToString:@"http"] || [scheme isEqualToString:@"https"];

    NSString *header = [request valueForHTTPHeaderField:RNCachingURLHeader];
    BOOL validHeader = header == nil;

    BOOL canInit = supportedScheme && validHeader;

    return canInit;
}

请注意lowercaseString,即防御性编码。

答案 1 :(得分:0)

"无法连接到服务器"意味着您已离线,但在缓存中找不到您请求的网址。

查看startLoading。检查URL的绝对字符串。确保您缓存的那个与您现在请求的那个完全相同。如果您在网址中添加了任何可更改的数据,那么它就不会匹配。

我刚刚注意到,我认为我在此代码中修复的许多小问题实际上是待处理的拉请求。 So I've merged most of those now.特别是,我的哈希URL方式非常容易发生冲突。那是固定的。更新后的代码增加了对非http的支持。 (但是您的错误仍然表明网址不匹配。)

相关问题