RetryAndFollowUpInterceptor

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_21727627/article/details/79028898

这个拦截作用是:失败重连和重定向 直接上码 :

public Response intercept(Chain chain) throws IOException {
		Request request = chain.request();
		RealInterceptorChain realChain = (RealInterceptorChain) chain;
		Call call = realChain.call();
		EventListener eventListener = realChain.eventListener();
		// 创建网络资源如:HttpCodec Socket RealConnection或者释放 
		streamAllocation = new StreamAllocation(client.connectionPool(), createAddress
				(request.url()),
				call, eventListener, callStackTrace);

		int followUpCount = 0;//重连了几次
		Response priorResponse = null;
		while (true) {
			if (canceled) {
				streamAllocation.release(); //请求中取消 将抛出IO
				throw new IOException("Canceled");
			}

			Response response;
			boolean releaseConnection = true;
			try {
				response = realChain.proceed(request, streamAllocation, null, null);// 
				// 调用下一个拦截器
				releaseConnection = false;
			} catch (RouteException e) {
				// The attempt to connect via a route failed. The request will not have 
				// been sent.
				//recover 判断各种条件是否可以重连,true 继续,false throw 出异常
				if (!recover(e.getLastConnectException(), false, request)) {
					throw e.getLastConnectException();
				}
				releaseConnection = false;
				continue;
			} catch (IOException e) {

				//recover 判断是否各种条件是否可以重连,true 继续,false throw 出异常
				// An attempt to communicate with a server failed. The request may have 
				// been sent.
				boolean requestSendStarted = !(e instanceof ConnectionShutdownException);
				if (!recover(e, requestSendStarted, request)) throw e;
				releaseConnection = false;
				continue;
			} finally { // We're throwing an unchecked exception. Release any resources. 
				if (releaseConnection) { //能执行到这里 说明 proceed和catch 都抛出了异常
					streamAllocation.streamFailed(null);
					streamAllocation.release();
				}
			}
			// Attach the prior response if it exists. Such responses never have a body. 
			if (priorResponse != null) { //能执行到这里说明 必然循环一次因为 在方法的后面才复制 
				response = response.newBuilder()
						.priorResponse(priorResponse.newBuilder()如果 响应体 body 为null 将抛异常
								.body(null).build())
						.build();
			}
			Request followUp = followUpRequest(response);// 通过 响应吗 去执行相应对的操作 
			if (followUp == null) {
				if (!forWebSocket) {
					streamAllocation.release();
				}
				return response; // good bye 
				}
				closeQuietly(response.body());
				if (++followUpCount > MAX_FOLLOW_UPS) {
					//重连次数超过时 将抛异常
					streamAllocation.release();
					throw new ProtocolException("Too many follow-up requests: " + 
							followUpCount);
				}
				if (followUp.body() instanceof UnrepeatableRequestBody) {
					streamAllocation.release();
					throw new HttpRetryException("Cannot retry streamed HTTP body", 
							response.code());
				}
				if (!sameConnection(response, followUp.url())) { //判断url和port是否相同 相同good
					// bye 不是重新分配资源
					streamAllocation.release();
					streamAllocation = new StreamAllocation(client.connectionPool(),
							createAddress(followUp.url()), call, eventListener, 
							callStackTrace);
				} else if (streamAllocation.codec() != null) {
					throw new IllegalStateException("Closing the body of " + response + 
							" didn't close its backing stream. Bad interceptor?");
				}
				request = followUp;
				priorResponse = response; ///这里才赋值 } 
			}



猜你喜欢

转载自blog.csdn.net/qq_21727627/article/details/79028898