3636import okhttp3 .OkHttpClient ;
3737import okhttp3 .Request ;
3838import okhttp3 .Response ;
39+ import okhttp3 .internal .http2 .Header ;
3940
4041/**
4142 * ================================================
@@ -73,6 +74,7 @@ public final class ProgressManager {
7374 public static final int DEFAULT_REFRESH_TIME = 150 ;
7475 public static final String IDENTIFICATION_NUMBER = "?JessYan=" ;
7576 public static final String IDENTIFICATION_HEADER = "JessYan" ;
77+ public static final String LOCATION_HEADER = "Location" ;
7678
7779
7880 static {
@@ -209,13 +211,22 @@ public Request wrapRequestBody(Request request) {
209211 return request ;
210212 }
211213
214+ /**
215+ * 如果 {@code url} 中含有 {@link #addDiffResponseListenerOnSameUrl(String, String, ProgressListener)}
216+ * 或 {@link #addDiffRequestListenerOnSameUrl(String, String, ProgressListener)} 加入的标识符,则将加入标识符
217+ * 从 {code url} 中删除掉,继续使用 {@code originUrl} 进行请求
218+ *
219+ * @param url {@code url} 地址
220+ * @param request 原始 {@link Request}
221+ * @return 返回可能被修改过的 {@link Request}
222+ */
212223 private Request pruneIdentification (String url , Request request ) {
213224 boolean needPrune = url .contains (IDENTIFICATION_NUMBER );
214225 if (!needPrune )
215226 return request ;
216227 return request .newBuilder ()
217- .url (url .substring (0 , url .indexOf (IDENTIFICATION_NUMBER )))
218- .header (IDENTIFICATION_HEADER , url )
228+ .url (url .substring (0 , url .indexOf (IDENTIFICATION_NUMBER ))) //删除掉标识符
229+ .header (IDENTIFICATION_HEADER , url ) //将有标识符的 url 加入 header中, 便于wrapResponseBody(Response) 做处理
219230 .build ();
220231 }
221232
@@ -231,13 +242,14 @@ public Response wrapResponseBody(Response response) {
231242 return response ;
232243
233244 String key = response .request ().url ().toString ();
234- if (!TextUtils .isEmpty (response .request ().header (IDENTIFICATION_HEADER ))) {
245+ if (!TextUtils .isEmpty (response .request ().header (IDENTIFICATION_HEADER ))) { //从 header 中拿出有标识符的 url
235246 key = response .request ().header (IDENTIFICATION_HEADER );
236247 }
237248
238249 if (haveRedirect (response )) {
239250 resolveRedirect (mRequestListeners , response , key );
240- resolveRedirect (mResponseListeners , response , key );
251+ String location = resolveRedirect (mResponseListeners , response , key );
252+ response = modifyLocation (response , location );
241253 return response ;
242254 }
243255
@@ -253,11 +265,27 @@ public Response wrapResponseBody(Response response) {
253265 return response ;
254266 }
255267
268+ /**
269+ * 查看 location 是否被加入了标识符, 如果是, 则放入 {@link Header} 中重新定义 {@link Response}
270+ *
271+ * @param response 原始的 {@link Response}
272+ * @param location {@code location} 重定向地址
273+ * @return 返回可能被修改过的 {@link Response}
274+ */
275+ private Response modifyLocation (Response response , String location ) {
276+ if (!TextUtils .isEmpty (location ) && location .contains (IDENTIFICATION_NUMBER )) { //将被加入标识符的新的 location 放入 header 中
277+ response = response .newBuilder ()
278+ .header (LOCATION_HEADER , location )
279+ .build ();
280+ }
281+ return response ;
282+ }
283+
256284 /**
257285 * 当出现需要使用同一个 {@code url} 根据 Post 请求参数的不同而下载不同资源的情况
258286 * 请使用 {@link #addDiffResponseListenerOnSameUrl(String, ProgressListener)} 代替 {@link #addResponseListener}
259287 * {@link #addDiffResponseListenerOnSameUrl(String, ProgressListener)} 会返回一个加入了时间戳的新的 {@code url}
260- * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行下载的请求即可
288+ * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行下载的请求即可 (当实际请求时依然使用 {@code originUrl} 进行网络请求)
261289 * <p>
262290 * {@link #addDiffResponseListenerOnSameUrl(String, ProgressListener)} 与 {@link #addDiffResponseListenerOnSameUrl(String, String, ProgressListener)}
263291 * 的区别在于:
@@ -277,7 +305,7 @@ public String addDiffResponseListenerOnSameUrl(String originUrl, ProgressListene
277305 * 当出现需要使用同一个 {@code url} 根据 Post 请求参数的不同而下载不同资源的情况
278306 * 请使用 {@link #addDiffResponseListenerOnSameUrl(String, String, ProgressListener)} 代替 {@link #addResponseListener}
279307 * 请使用 {@link #addDiffResponseListenerOnSameUrl(String, String, ProgressListener)} 会返回一个 {@code originUrl} 结合 {@code key} 生成的新的 {@code url}
280- * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行下载的请求即可
308+ * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行下载的请求即可 (当实际请求时依然使用 {@code originUrl} 进行网络请求)
281309 * <p>
282310 * {@link #addDiffResponseListenerOnSameUrl(String, ProgressListener)} 与 {@link #addDiffResponseListenerOnSameUrl(String, String, ProgressListener)}
283311 * 的区别在于:
@@ -322,7 +350,7 @@ public String addDiffResponseListenerOnSameUrl(String originUrl, String key, Pro
322350 * 当出现需要使用同一个 {@code url} 根据 Post 请求参数的不同而上传不同资源的情况
323351 * 请使用 {@link #addDiffRequestListenerOnSameUrl(String, ProgressListener)} 代替 {@link #addRequestListener}
324352 * {@link #addDiffRequestListenerOnSameUrl(String, ProgressListener)} 会返回一个加入了时间戳的新的 {@code url}
325- * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行上传的请求即可
353+ * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行上传的请求即可 (当实际请求时依然使用 {@code originUrl} 进行网络请求)
326354 * <p>
327355 * {@link #addDiffRequestListenerOnSameUrl(String, ProgressListener)} 与 {@link #addDiffRequestListenerOnSameUrl(String, String, ProgressListener)}
328356 * 的区别在于:
@@ -343,7 +371,7 @@ public String addDiffRequestListenerOnSameUrl(String originUrl, ProgressListener
343371 * 当出现需要使用同一个 {@code url} 根据 Post 请求参数的不同而上传不同资源的情况
344372 * 请使用 {@link #addDiffRequestListenerOnSameUrl(String, ProgressListener)} 代替 {@link #addRequestListener}
345373 * {@link #addDiffRequestListenerOnSameUrl(String, ProgressListener)} 会返回一个 {@code originUrl} 结合 {@code key} 生成的新的 {@code url}
346- * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行上传的请求即可
374+ * 请使用这个新的 {@code url} 去代替 {@code originUrl} 进行上传的请求即可 (当实际请求时依然使用 {@code originUrl} 进行网络请求)
347375 * <p>
348376 * {@link #addDiffRequestListenerOnSameUrl(String, ProgressListener)} 与 {@link #addDiffRequestListenerOnSameUrl(String, String, ProgressListener)}
349377 * 的区别在于:
@@ -410,11 +438,15 @@ private boolean haveRedirect(Response response) {
410438 * @param response 原始的 {@link Response}
411439 * @param url {@code url} 地址
412440 */
413- private void resolveRedirect (Map <String , List <ProgressListener >> map , Response response , String url ) {
441+ private String resolveRedirect (Map <String , List <ProgressListener >> map , Response response , String url ) {
442+ String location = null ;
414443 List <ProgressListener > progressListeners = map .get (url ); //查看此重定向 url ,是否已经注册过监听器
415444 if (progressListeners != null && progressListeners .size () > 0 ) {
416- String location = response .header ("Location" );// 重定向地址
445+ location = response .header (LOCATION_HEADER );// 重定向地址
417446 if (!TextUtils .isEmpty (location )) {
447+ if (url .contains (IDENTIFICATION_NUMBER ) && !location .contains (IDENTIFICATION_NUMBER )) { //如果 url 有标识符,那也将标识符加入用于重定向的 location
448+ location += url .substring (url .indexOf (IDENTIFICATION_NUMBER ), url .length ());
449+ }
418450 if (!map .containsKey (location )) {
419451 map .put (location , progressListeners ); //将需要重定向地址的监听器,提供给重定向地址,保证重定向后也可以监听进度
420452 } else {
@@ -427,6 +459,7 @@ private void resolveRedirect(Map<String, List<ProgressListener>> map, Response r
427459 }
428460 }
429461 }
462+ return location ;
430463 }
431464
432465
0 commit comments