BridgeIntecptor

//从url里面获取cookie
      //这个cookieJar是Okhttp上面设置的那个cookieJar
List<Cookie> cookies = cookieJar.loadForRequest(userRequest.url());
if (!cookies.isEmpty()) {
  //将所有的cookie添加到cookie头
  requestBuilder.header("Cookie", cookieHeader(cookies));
}

public final class BridgeInterceptor implements Interceptor {
  /**
   * 用来处理Cookie的保存和读取
   */
  private final CookieJar cookieJar;

可以看到是在构造方法里面传入的
  public BridgeInterceptor(CookieJar cookieJar) {
    this.cookieJar = cookieJar;
  }
image.png

可以看到是在RealCall中调用了这个构造方法

image.png

点击里面的cookieHeader看看

/** Returns a 'Cookie' HTTP request header with all cookies, like {@code a=b; c=d}. */
  //用来将所有的Coookie转换成,key1=value1; key2=value2,例如:a=b; c=d
  private String cookieHeader(List<Cookie> cookies) {
    StringBuilder cookieHeader = new StringBuilder();
//遍历cookies列表
      //相当于这个种形式 name=value;key=value
    for (int i = 0, size = cookies.size(); i < size; i++) {
      if (i > 0) {
        cookieHeader.append("; ");
      }
      Cookie cookie = cookies.get(i);
      cookieHeader.append(cookie.name()).append('=').append(cookie.value());
    }
    return cookieHeader.toString();
  }
    if (userRequest.header("User-Agent") == null) {
      requestBuilder.header("User-Agent", Version.userAgent());
    }

    //这里调用下一个拦截器(最后一个拦截器返回回来的网络数据了)
      //这段代码上面是处理器,下面是处理响应Response
    Response networkResponse = chain.proceed(requestBuilder.build());

//从网络的相应中获取Cookie,这个方法里面或保存
HttpHeaders.receiveHeaders(cookieJar, userRequest.url(), networkResponse.headers());

-->点击跳转:
    public static void receiveHeaders(CookieJar cookieJar, HttpUrl url, Headers headers) {
      //如果没有设置cookie的代理,就直接返回
      if (cookieJar == CookieJar.NO_COOKIES) return;
    
      //从header中解析出cookie
      List<Cookie> cookies = Cookie.parseAll(url, headers);
      if (cookies.isEmpty()) return;
    
      //然后调用保存方法
      cookieJar.saveFromResponse(url, cookies);
    }
-->点击跳转:查看Cookie.parseAll(url, headers)
    
      public static List<Cookie> parseAll(HttpUrl url, Headers headers) {
        List<String> cookieStrings = headers.values("Set-Cookie");
        List<Cookie> cookies = null;
    
        for (int i = 0, size = cookieStrings.size(); i < size; i++) {
          Cookie cookie = Cookie.parse(url, cookieStrings.get(i));
          if (cookie == null) continue;
          if (cookies == null) cookies = new ArrayList<>();
          cookies.add(cookie);
        }
    
        return cookies != null
            ? Collections.unmodifiableList(cookies)
            : Collections.<Cookie>emptyList();
      }

============================================
    //根据网络的响应创建一个Builder,这和前面从请求体创建一个Builder类似
    Response.Builder responseBuilder = networkResponse.newBuilder()
        .request(userRequest);

    if (transparentGzip
        && "gzip".equalsIgnoreCase(networkResponse.header("Content-Encoding"))
        && HttpHeaders.hasBody(networkResponse)) {
      //在这里处理响应体是gzip类型的工作
      //networkResponse.body().source():可以理解为就是输入流
      //这里其实是一个包装设计模式
      GzipSource responseBody = new GzipSource(networkResponse.body().source());
      Headers strippedHeaders = networkResponse.headers().newBuilder()
          .removeAll("Content-Encoding")
          .removeAll("Content-Length")
          .build();
      responseBuilder.headers(strippedHeaders);
      //这里用了一个包装类RealResponseBody,用来转换gzip响应体,这个后面再分析
      //Okio.buffer可以理解为包装后的输入流
      responseBuilder.body(new RealResponseBody(strippedHeaders, Okio.buffer(responseBody)));
    }

    //然后根据响应体Builder创建一个Response
    return responseBuilder.build();

-->点击跳转:RealResponseBody

    public final class RealResponseBody extends ResponseBody {
      private final Headers headers;
      private final BufferedSource source;
    
      public RealResponseBody(Headers headers, BufferedSource source) {
        this.headers = headers;
        this.source = source;
      }
    
      @Override public MediaType contentType() {
        String contentType = headers.get("Content-Type");
        return contentType != null ? MediaType.parse(contentType) : null;
      }
    
      @Override public long contentLength() {
        return HttpHeaders.contentLength(headers);
      }
    
      @Override public BufferedSource source() {
        return source;
      }
    }
responseBody-->new GzipSource(networkResponse.body().source());
也就是我们本地在读取这个Gzip响应的时候会调用这个GzipSource的read方法
在这个方法里面吧真实的流给拆出来了(原来的流是GZip的流,这里把它拆成真实的流了)
     public long read(Buffer sink, long byteCount) throws IOException {
        if (byteCount < 0L) {
            throw new IllegalArgumentException("byteCount < 0: " + byteCount);
        } else if (byteCount == 0L) {
            return 0L;
        } else {
            if (this.section == 0) {
                this.consumeHeader();
                this.section = 1;
            }

            if (this.section == 1) {
                long offset = sink.size;
                long result = this.inflaterSource.read(sink, byteCount);
                if (result != -1L) {
                    this.updateCrc(sink, offset, result);
                    return result;
                }

                this.section = 2;
            }

            if (this.section == 2) {
                this.consumeTrailer();
                this.section = 3;
                if (!this.source.exhausted()) {
                    throw new IOException("gzip finished without exhausting source");
                }
            }

            return -1L;
        }
    }
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,098评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,213评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 149,960评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,519评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,512评论 5 364
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,533评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,914评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,574评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,804评论 1 296
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,563评论 2 319
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,644评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,350评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,933评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,908评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,146评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,847评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,361评论 2 342