NSURLProtocol - 处理HTTPS请求(NSURLProtocol - handle

2019-10-21 21:12发布

这是canInitWithRequestNSURLProtocol

+ (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配置的登录请求的。 在上面的函数, 返回,但是当登录请求被调用时,我得到的日志此错误:

误差区域= NSURLErrorDomain代码= -1004“无法连接到服务器。”

但是,如果我删除HTTPS的检查中canInitWithRequest ,我没有得到任何错误。
我使用RNCachingURLProtocol缓存请求。
我怎么可能做到这一点。

Answer 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 ,那就是防御性的编码。



Answer 2:

“无法连接到服务器”是指您处于离线状态,但您请求的URL在缓存中没有被发现。

看在startLoading 。 检查URL的绝对字符串。 请确保您高速缓存的一个恰恰是一样的,你现在正在申请的一个。 如果你把任何变化的数据在你的URL,那么它不会匹配。

我只注意到了很多的小问题我想我会固定在这个代码实际上是挂起引入请求。 所以,我现在已经合并的大多数人。 特别是,我的散列URL的方式是很容易发生碰撞。 这是固定的。 和更新的代码添加非HTTP支持。 (但你的错误仍然暗示的URL不匹配。)



文章来源: NSURLProtocol - handle https request