1
17 package okhttp3.internal.http;
18
19 import java.io.IOException;
20 import java.util.List;
21 import okhttp3.Cookie;
22 import okhttp3.CookieJar;
23 import okhttp3.Headers;
24 import okhttp3.Interceptor;
25 import okhttp3.MediaType;
26 import okhttp3.Request;
27 import okhttp3.RequestBody;
28 import okhttp3.Response;
29 import okhttp3.internal.Version;
30 import okio.GzipSource;
31 import okio.Okio;
32
33 import static okhttp3.internal.Util.hostHeader;
34
35
40 public final class BridgeInterceptor implements Interceptor {
41 private final CookieJar cookieJar;
42
43 public BridgeInterceptor(CookieJar cookieJar) {
44 this.cookieJar = cookieJar;
45 }
46
47 @Override public Response intercept(Chain chain) throws IOException {
48 Request userRequest = chain.request();
49 Request.Builder requestBuilder = userRequest.newBuilder();
50
51 RequestBody body = userRequest.body();
52 if (body != null) {
53 MediaType contentType = body.contentType();
54 if (contentType != null) {
55 requestBuilder.header("Content-Type", contentType.toString());
56 }
57
58 long contentLength = body.contentLength();
59 if (contentLength != -1) {
60 requestBuilder.header("Content-Length", Long.toString(contentLength));
61 requestBuilder.removeHeader("Transfer-Encoding");
62 } else {
63 requestBuilder.header("Transfer-Encoding", "chunked");
64 requestBuilder.removeHeader("Content-Length");
65 }
66 }
67
68 if (userRequest.header("Host") == null) {
69 requestBuilder.header("Host", hostHeader(userRequest.url(), false));
70 }
71
72 if (userRequest.header("Connection") == null) {
73 requestBuilder.header("Connection", "Keep-Alive");
74 }
75
76
77
78 boolean transparentGzip = false;
79 if (userRequest.header("Accept-Encoding") == null && userRequest.header("Range") == null) {
80 transparentGzip = true;
81 requestBuilder.header("Accept-Encoding", "gzip");
82 }
83
84 List<Cookie> cookies = cookieJar.loadForRequest(userRequest.url());
85 if (!cookies.isEmpty()) {
86 requestBuilder.header("Cookie", cookieHeader(cookies));
87 }
88
89 if (userRequest.header("User-Agent") == null) {
90 requestBuilder.header("User-Agent", Version.userAgent());
91 }
92
93 Response networkResponse = chain.proceed(requestBuilder.build());
94
95 HttpHeaders.receiveHeaders(cookieJar, userRequest.url(), networkResponse.headers());
96
97 Response.Builder responseBuilder = networkResponse.newBuilder()
98 .request(userRequest);
99
100 if (transparentGzip
101 && "gzip".equalsIgnoreCase(networkResponse.header("Content-Encoding"))
102 && HttpHeaders.hasBody(networkResponse)) {
103 GzipSource responseBody = new GzipSource(networkResponse.body().source());
104 Headers strippedHeaders = networkResponse.headers().newBuilder()
105 .removeAll("Content-Encoding")
106 .removeAll("Content-Length")
107 .build();
108 responseBuilder.headers(strippedHeaders);
109 String contentType = networkResponse.header("Content-Type");
110 responseBuilder.body(new RealResponseBody(contentType, -1L, Okio.buffer(responseBody)));
111 }
112
113 return responseBuilder.build();
114 }
115
116
117 private String cookieHeader(List<Cookie> cookies) {
118 StringBuilder cookieHeader = new StringBuilder();
119 for (int i = 0, size = cookies.size(); i < size; i++) {
120 if (i > 0) {
121 cookieHeader.append("; ");
122 }
123 Cookie cookie = cookies.get(i);
124 cookieHeader.append(cookie.name()).append('=').append(cookie.value());
125 }
126 return cookieHeader.toString();
127 }
128 }
129