mirror of
https://github.com/square/okhttp.git
synced 2026-01-18 20:40:58 +03:00
Merge pull request #730 from square/jwilson_0419_status_line_is_not_a_thing
Scrub StatusLine from the public API.
This commit is contained in:
@@ -23,6 +23,7 @@ import com.squareup.okhttp.OkHttpClient;
|
||||
import com.squareup.okhttp.Protocol;
|
||||
import com.squareup.okhttp.Request;
|
||||
import com.squareup.okhttp.Response;
|
||||
import com.squareup.okhttp.internal.http.StatusLine;
|
||||
import io.airlift.command.Arguments;
|
||||
import io.airlift.command.Command;
|
||||
import io.airlift.command.HelpOption;
|
||||
@@ -127,7 +128,7 @@ public class Main extends HelpOption implements Runnable {
|
||||
try {
|
||||
Response response = client.execute(request);
|
||||
if (showHeaders) {
|
||||
System.out.println(response.statusLine());
|
||||
System.out.println(StatusLine.get(response));
|
||||
Headers headers = response.headers();
|
||||
for (int i = 0, count = headers.size(); i < count; i++) {
|
||||
System.out.println(headers.name(i) + ": " + headers.value(i));
|
||||
|
||||
@@ -68,7 +68,7 @@ public final class OkApacheClient implements HttpClient {
|
||||
|
||||
private static HttpResponse transformResponse(Response response) {
|
||||
int code = response.code();
|
||||
String message = response.statusMessage();
|
||||
String message = response.message();
|
||||
BasicHttpResponse httpResponse = new BasicHttpResponse(HTTP_1_1, code, message);
|
||||
|
||||
Response.Body body = response.body();
|
||||
|
||||
@@ -40,7 +40,9 @@ public final class HeadersTest {
|
||||
SpdyTransport.readNameValueBlock(headerBlock, Protocol.SPDY_3).request(request).build();
|
||||
Headers headers = response.headers();
|
||||
assertEquals(4, headers.size());
|
||||
assertEquals("HTTP/1.1 200 OK", response.statusLine());
|
||||
assertEquals(Protocol.HTTP_1_1, response.protocol());
|
||||
assertEquals(200, response.code());
|
||||
assertEquals("OK", response.message());
|
||||
assertEquals("no-cache, no-store", headers.get("cache-control"));
|
||||
assertEquals("Cookie2", headers.get("set-cookie"));
|
||||
assertEquals(Protocol.SPDY_3.toString(), headers.get(OkHeaders.SELECTED_PROTOCOL));
|
||||
|
||||
@@ -20,6 +20,7 @@ import com.squareup.okhttp.Handshake;
|
||||
import com.squareup.okhttp.Headers;
|
||||
import com.squareup.okhttp.MediaType;
|
||||
import com.squareup.okhttp.OkHttpClient;
|
||||
import com.squareup.okhttp.Protocol;
|
||||
import com.squareup.okhttp.Request;
|
||||
import com.squareup.okhttp.Response;
|
||||
import com.squareup.okhttp.internal.SslContextBuilder;
|
||||
@@ -183,7 +184,9 @@ public class JavaApiConverterTest {
|
||||
assertEquals("GET", request.method());
|
||||
|
||||
// Check the response
|
||||
assertEquals(statusLine, response.statusLine());
|
||||
assertEquals(Protocol.HTTP_1_1, response.protocol());
|
||||
assertEquals(200, response.code());
|
||||
assertEquals("Fantastic", response.message());
|
||||
Headers okResponseHeaders = response.headers();
|
||||
assertEquals("baz", okResponseHeaders.get("xyzzy"));
|
||||
assertEquals(body, response.body().string());
|
||||
@@ -225,7 +228,9 @@ public class JavaApiConverterTest {
|
||||
Response response = JavaApiConverter.createOkResponse(request, cacheResponse);
|
||||
assertSame(request, response.request());
|
||||
|
||||
assertNotNullAndEquals(statusLine, response.statusLine());
|
||||
assertEquals(Protocol.HTTP_1_1, response.protocol());
|
||||
assertEquals(200, response.code());
|
||||
assertEquals("Fantastic", response.message());
|
||||
Headers okResponseHeaders = response.headers();
|
||||
assertEquals("baz", okResponseHeaders.get("xyzzy"));
|
||||
assertEquals("HelloWorld", response.body().string());
|
||||
@@ -283,7 +288,9 @@ public class JavaApiConverterTest {
|
||||
Response response = JavaApiConverter.createOkResponse(request, cacheResponse);
|
||||
assertSame(request, response.request());
|
||||
|
||||
assertNotNullAndEquals(statusLine, response.statusLine());
|
||||
assertEquals(Protocol.HTTP_1_1, response.protocol());
|
||||
assertEquals(200, response.code());
|
||||
assertEquals("Fantastic", response.message());
|
||||
Headers okResponseHeaders = response.headers();
|
||||
assertEquals("baz", okResponseHeaders.get("xyzzy"));
|
||||
assertEquals("HelloWorld", response.body().string());
|
||||
@@ -425,11 +432,12 @@ public class JavaApiConverterTest {
|
||||
}
|
||||
|
||||
@Test public void createJavaUrlConnection_responseHeadersOk() throws Exception {
|
||||
final String statusLine = "HTTP/1.1 200 Fantastic";
|
||||
Response.Body responseBody = createResponseBody("BodyText");
|
||||
Response okResponse = new Response.Builder()
|
||||
.request(createArbitraryOkRequest())
|
||||
.statusLine(statusLine)
|
||||
.protocol(Protocol.HTTP_1_1)
|
||||
.code(200)
|
||||
.message("Fantastic")
|
||||
.addHeader("A", "c")
|
||||
.addHeader("B", "d")
|
||||
.addHeader("A", "e")
|
||||
@@ -443,20 +451,20 @@ public class JavaApiConverterTest {
|
||||
assertEquals(responseBody.contentLength(), httpUrlConnection.getContentLength());
|
||||
|
||||
// Check retrieval by string key.
|
||||
assertEquals(statusLine, httpUrlConnection.getHeaderField(null));
|
||||
assertEquals("HTTP/1.1 200 Fantastic", httpUrlConnection.getHeaderField(null));
|
||||
assertEquals("e", httpUrlConnection.getHeaderField("A"));
|
||||
// The RI and OkHttp supports case-insensitive matching for this method.
|
||||
assertEquals("e", httpUrlConnection.getHeaderField("a"));
|
||||
|
||||
// Check retrieval using a Map.
|
||||
Map<String, List<String>> responseHeaders = httpUrlConnection.getHeaderFields();
|
||||
assertEquals(Arrays.asList(statusLine), responseHeaders.get(null));
|
||||
assertEquals(Arrays.asList("HTTP/1.1 200 Fantastic"), responseHeaders.get(null));
|
||||
assertEquals(newSet("c", "e"), newSet(responseHeaders.get("A")));
|
||||
// OkHttp supports case-insensitive matching here. The RI does not.
|
||||
assertEquals(newSet("c", "e"), newSet(responseHeaders.get("a")));
|
||||
|
||||
// Check the Map iterator contains the expected mappings.
|
||||
assertHeadersContainsMapping(responseHeaders, null, statusLine);
|
||||
assertHeadersContainsMapping(responseHeaders, null, "HTTP/1.1 200 Fantastic");
|
||||
assertHeadersContainsMapping(responseHeaders, "A", "c", "e");
|
||||
assertHeadersContainsMapping(responseHeaders, "B", "d");
|
||||
|
||||
@@ -474,7 +482,7 @@ public class JavaApiConverterTest {
|
||||
|
||||
// Check retrieval of headers by index.
|
||||
assertEquals(null, httpUrlConnection.getHeaderFieldKey(0));
|
||||
assertEquals(statusLine, httpUrlConnection.getHeaderField(0));
|
||||
assertEquals("HTTP/1.1 200 Fantastic", httpUrlConnection.getHeaderField(0));
|
||||
// After header zero there may be additional entries provided at the beginning or end by the
|
||||
// implementation. It's probably important that the relative ordering of the headers is
|
||||
// preserved, particularly if there are multiple value for the same key.
|
||||
@@ -578,9 +586,10 @@ public class JavaApiConverterTest {
|
||||
.url("http://insecure/request")
|
||||
.method("GET", null)
|
||||
.build();
|
||||
String statusLine = "HTTP/1.1 200 Fantastic";
|
||||
Response okResponse = createArbitraryOkResponse(okRequest).newBuilder()
|
||||
.statusLine(statusLine)
|
||||
.protocol(Protocol.HTTP_1_1)
|
||||
.code(200)
|
||||
.message("Fantastic")
|
||||
.addHeader("key1", "value1_1")
|
||||
.addHeader("key2", "value2")
|
||||
.addHeader("key1", "value1_2")
|
||||
@@ -590,7 +599,7 @@ public class JavaApiConverterTest {
|
||||
assertFalse(javaCacheResponse instanceof SecureCacheResponse);
|
||||
Map<String, List<String>> javaHeaders = javaCacheResponse.getHeaders();
|
||||
assertEquals(Arrays.asList("value1_1", "value1_2"), javaHeaders.get("key1"));
|
||||
assertEquals(Arrays.asList(statusLine), javaHeaders.get(null));
|
||||
assertEquals(Arrays.asList("HTTP/1.1 200 Fantastic"), javaHeaders.get(null));
|
||||
assertNull(javaCacheResponse.getBody());
|
||||
}
|
||||
|
||||
@@ -600,10 +609,11 @@ public class JavaApiConverterTest {
|
||||
.url("http://insecure/request")
|
||||
.method("POST", createRequestBody("RequestBody"))
|
||||
.build();
|
||||
String statusLine = "HTTP/1.1 200 Fantastic";
|
||||
Response.Body responseBody = createResponseBody("ResponseBody");
|
||||
Response okResponse = createArbitraryOkResponse(okRequest).newBuilder()
|
||||
.statusLine(statusLine)
|
||||
.protocol(Protocol.HTTP_1_1)
|
||||
.code(200)
|
||||
.message("Fantastic")
|
||||
.addHeader("key1", "value1_1")
|
||||
.addHeader("key2", "value2")
|
||||
.addHeader("key1", "value1_2")
|
||||
@@ -613,7 +623,7 @@ public class JavaApiConverterTest {
|
||||
assertFalse(javaCacheResponse instanceof SecureCacheResponse);
|
||||
Map<String, List<String>> javaHeaders = javaCacheResponse.getHeaders();
|
||||
assertEquals(Arrays.asList("value1_1", "value1_2"), javaHeaders.get("key1"));
|
||||
assertEquals(Arrays.asList(statusLine), javaHeaders.get(null));
|
||||
assertEquals(Arrays.asList("HTTP/1.1 200 Fantastic"), javaHeaders.get(null));
|
||||
assertEquals("ResponseBody", readAll(javaCacheResponse.getBody()));
|
||||
}
|
||||
|
||||
@@ -623,12 +633,13 @@ public class JavaApiConverterTest {
|
||||
.url("https://secure/request")
|
||||
.method("POST", createRequestBody("RequestBody") )
|
||||
.build();
|
||||
String statusLine = "HTTP/1.1 200 Fantastic";
|
||||
Response.Body responseBody = createResponseBody("ResponseBody");
|
||||
Handshake handshake = Handshake.get("SecureCipher", Arrays.<Certificate>asList(SERVER_CERT),
|
||||
Arrays.<Certificate>asList(LOCAL_CERT));
|
||||
Response okResponse = createArbitraryOkResponse(okRequest).newBuilder()
|
||||
.statusLine(statusLine)
|
||||
.protocol(Protocol.HTTP_1_1)
|
||||
.code(200)
|
||||
.message("Fantastic")
|
||||
.addHeader("key1", "value1_1")
|
||||
.addHeader("key2", "value2")
|
||||
.addHeader("key1", "value1_2")
|
||||
@@ -639,7 +650,7 @@ public class JavaApiConverterTest {
|
||||
(SecureCacheResponse) JavaApiConverter.createJavaCacheResponse(okResponse);
|
||||
Map<String, List<String>> javaHeaders = javaCacheResponse.getHeaders();
|
||||
assertEquals(Arrays.asList("value1_1", "value1_2"), javaHeaders.get("key1"));
|
||||
assertEquals(Arrays.asList(statusLine), javaHeaders.get(null));
|
||||
assertEquals(Arrays.asList("HTTP/1.1 200 Fantastic"), javaHeaders.get(null));
|
||||
assertEquals("ResponseBody", readAll(javaCacheResponse.getBody()));
|
||||
assertEquals(handshake.cipherSuite(), javaCacheResponse.getCipherSuite());
|
||||
assertEquals(handshake.localCertificates(), javaCacheResponse.getLocalCertificateChain());
|
||||
@@ -752,7 +763,9 @@ public class JavaApiConverterTest {
|
||||
private static Response createArbitraryOkResponse(Request request) {
|
||||
return new Response.Builder()
|
||||
.request(request)
|
||||
.statusLine("HTTP/1.1 200 Arbitrary")
|
||||
.protocol(Protocol.HTTP_1_1)
|
||||
.code(200)
|
||||
.message("Arbitrary")
|
||||
.build();
|
||||
}
|
||||
|
||||
|
||||
@@ -28,19 +28,19 @@ public final class StatusLineTest {
|
||||
String message = "Temporary Redirect";
|
||||
int version = 1;
|
||||
int code = 200;
|
||||
StatusLine statusLine = new StatusLine("HTTP/1." + version + " " + code + " " + message);
|
||||
assertEquals(message, statusLine.message());
|
||||
assertEquals(Protocol.HTTP_1_1, statusLine.protocol());
|
||||
assertEquals(code, statusLine.code());
|
||||
StatusLine statusLine = StatusLine.parse("HTTP/1." + version + " " + code + " " + message);
|
||||
assertEquals(message, statusLine.message);
|
||||
assertEquals(Protocol.HTTP_1_1, statusLine.protocol);
|
||||
assertEquals(code, statusLine.code);
|
||||
}
|
||||
|
||||
@Test public void emptyMessage() throws IOException {
|
||||
int version = 1;
|
||||
int code = 503;
|
||||
StatusLine statusLine = new StatusLine("HTTP/1." + version + " " + code + " ");
|
||||
assertEquals("", statusLine.message());
|
||||
assertEquals(Protocol.HTTP_1_1, statusLine.protocol());
|
||||
assertEquals(code, statusLine.code());
|
||||
StatusLine statusLine = StatusLine.parse("HTTP/1." + version + " " + code + " ");
|
||||
assertEquals("", statusLine.message);
|
||||
assertEquals(Protocol.HTTP_1_1, statusLine.protocol);
|
||||
assertEquals(code, statusLine.code);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -51,18 +51,18 @@ public final class StatusLineTest {
|
||||
@Test public void emptyMessageAndNoLeadingSpace() throws IOException {
|
||||
int version = 1;
|
||||
int code = 503;
|
||||
StatusLine statusLine = new StatusLine("HTTP/1." + version + " " + code);
|
||||
assertEquals("", statusLine.message());
|
||||
assertEquals(Protocol.HTTP_1_1, statusLine.protocol());
|
||||
assertEquals(code, statusLine.code());
|
||||
StatusLine statusLine = StatusLine.parse("HTTP/1." + version + " " + code);
|
||||
assertEquals("", statusLine.message);
|
||||
assertEquals(Protocol.HTTP_1_1, statusLine.protocol);
|
||||
assertEquals(code, statusLine.code);
|
||||
}
|
||||
|
||||
// https://github.com/square/okhttp/issues/386
|
||||
@Test public void shoutcast() throws IOException {
|
||||
StatusLine statusLine = new StatusLine("ICY 200 OK");
|
||||
assertEquals("OK", statusLine.message());
|
||||
assertEquals(Protocol.HTTP_1_0, statusLine.protocol());
|
||||
assertEquals(200, statusLine.code());
|
||||
StatusLine statusLine = StatusLine.parse("ICY 200 OK");
|
||||
assertEquals("OK", statusLine.message);
|
||||
assertEquals(Protocol.HTTP_1_0, statusLine.protocol);
|
||||
assertEquals(200, statusLine.code);
|
||||
}
|
||||
|
||||
@Test public void missingProtocol() throws IOException {
|
||||
@@ -110,7 +110,7 @@ public final class StatusLineTest {
|
||||
|
||||
private void assertInvalid(String statusLine) throws IOException {
|
||||
try {
|
||||
new StatusLine(statusLine);
|
||||
StatusLine.parse(statusLine);
|
||||
fail();
|
||||
} catch (ProtocolException expected) {
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ import com.squareup.okhttp.internal.http.HttpURLConnectionImpl;
|
||||
import com.squareup.okhttp.internal.http.HttpsURLConnectionImpl;
|
||||
import com.squareup.okhttp.internal.http.JavaApiConverter;
|
||||
import com.squareup.okhttp.internal.http.OkHeaders;
|
||||
import com.squareup.okhttp.internal.http.StatusLine;
|
||||
import java.io.BufferedWriter;
|
||||
import java.io.ByteArrayInputStream;
|
||||
import java.io.File;
|
||||
@@ -387,7 +388,9 @@ public final class HttpResponseCache extends ResponseCache implements OkResponse
|
||||
private final String url;
|
||||
private final Headers varyHeaders;
|
||||
private final String requestMethod;
|
||||
private final String statusLine;
|
||||
private final Protocol protocol;
|
||||
private final int code;
|
||||
private final String message;
|
||||
private final Headers responseHeaders;
|
||||
private final Handshake handshake;
|
||||
|
||||
@@ -452,7 +455,10 @@ public final class HttpResponseCache extends ResponseCache implements OkResponse
|
||||
}
|
||||
varyHeaders = varyHeadersBuilder.build();
|
||||
|
||||
statusLine = source.readUtf8LineStrict();
|
||||
StatusLine statusLine = StatusLine.parse(source.readUtf8LineStrict());
|
||||
protocol = statusLine.protocol;
|
||||
code = statusLine.code;
|
||||
message = statusLine.message;
|
||||
Headers.Builder responseHeadersBuilder = new Headers.Builder();
|
||||
int responseHeaderLineCount = readInt(source);
|
||||
for (int i = 0; i < responseHeaderLineCount; i++) {
|
||||
@@ -481,7 +487,9 @@ public final class HttpResponseCache extends ResponseCache implements OkResponse
|
||||
this.url = response.request().urlString();
|
||||
this.varyHeaders = OkHeaders.varyHeaders(response);
|
||||
this.requestMethod = response.request().method();
|
||||
this.statusLine = response.statusLine();
|
||||
this.protocol = response.protocol();
|
||||
this.code = response.code();
|
||||
this.message = response.message();
|
||||
this.responseHeaders = response.headers();
|
||||
this.handshake = response.handshake();
|
||||
}
|
||||
@@ -503,7 +511,7 @@ public final class HttpResponseCache extends ResponseCache implements OkResponse
|
||||
writer.write('\n');
|
||||
}
|
||||
|
||||
writer.write(statusLine);
|
||||
writer.write(new StatusLine(protocol, code, message).toString());
|
||||
writer.write('\n');
|
||||
writer.write(Integer.toString(responseHeaders.size()));
|
||||
writer.write('\n');
|
||||
@@ -572,7 +580,9 @@ public final class HttpResponseCache extends ResponseCache implements OkResponse
|
||||
String contentLength = responseHeaders.get("Content-Length");
|
||||
return new Response.Builder()
|
||||
.request(request)
|
||||
.statusLine(statusLine)
|
||||
.protocol(protocol)
|
||||
.code(code)
|
||||
.message(message)
|
||||
.headers(responseHeaders)
|
||||
.body(new CacheResponseBody(snapshot, contentType, contentLength))
|
||||
.handshake(handshake)
|
||||
|
||||
@@ -16,7 +16,6 @@
|
||||
package com.squareup.okhttp;
|
||||
|
||||
import com.squareup.okhttp.internal.http.OkHeaders;
|
||||
import com.squareup.okhttp.internal.http.StatusLine;
|
||||
import java.io.Closeable;
|
||||
import java.io.IOException;
|
||||
import java.io.InputStream;
|
||||
@@ -36,7 +35,9 @@ import static com.squareup.okhttp.internal.Util.UTF_8;
|
||||
*/
|
||||
public final class Response {
|
||||
private final Request request;
|
||||
private final StatusLine statusLine;
|
||||
private final Protocol protocol;
|
||||
private final int code;
|
||||
private final String message;
|
||||
private final Handshake handshake;
|
||||
private final Headers headers;
|
||||
private final Body body;
|
||||
@@ -46,7 +47,9 @@ public final class Response {
|
||||
|
||||
private Response(Builder builder) {
|
||||
this.request = builder.request;
|
||||
this.statusLine = builder.statusLine;
|
||||
this.protocol = builder.protocol;
|
||||
this.code = builder.code;
|
||||
this.message = builder.message;
|
||||
this.handshake = builder.handshake;
|
||||
this.headers = builder.headers.build();
|
||||
this.body = builder.body;
|
||||
@@ -69,20 +72,22 @@ public final class Response {
|
||||
return request;
|
||||
}
|
||||
|
||||
public String statusLine() {
|
||||
return statusLine.getStatusLine();
|
||||
}
|
||||
|
||||
public int code() {
|
||||
return statusLine.code();
|
||||
}
|
||||
|
||||
public String statusMessage() {
|
||||
return statusLine.message();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the HTTP protocol, such as {@link Protocol#HTTP_1_1} or {@link
|
||||
* Protocol#HTTP_1_0}.
|
||||
*/
|
||||
public Protocol protocol() {
|
||||
return statusLine.protocol();
|
||||
return protocol;
|
||||
}
|
||||
|
||||
/** Returns the HTTP status code or -1 if it is unknown. */
|
||||
public int code() {
|
||||
return code;
|
||||
}
|
||||
|
||||
/** Returns the HTTP status message or null if it is unknown. */
|
||||
public String message() {
|
||||
return message;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -229,7 +234,9 @@ public final class Response {
|
||||
|
||||
public static class Builder {
|
||||
private Request request;
|
||||
private StatusLine statusLine;
|
||||
private Protocol protocol;
|
||||
private int code = -1;
|
||||
private String message;
|
||||
private Handshake handshake;
|
||||
private Headers.Builder headers;
|
||||
private Body body;
|
||||
@@ -241,7 +248,9 @@ public final class Response {
|
||||
|
||||
private Builder(Response response) {
|
||||
this.request = response.request;
|
||||
this.statusLine = response.statusLine;
|
||||
this.protocol = response.protocol;
|
||||
this.code = response.code;
|
||||
this.message = response.message;
|
||||
this.handshake = response.handshake;
|
||||
this.headers = response.headers.newBuilder();
|
||||
this.body = response.body;
|
||||
@@ -253,18 +262,19 @@ public final class Response {
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder statusLine(StatusLine statusLine) {
|
||||
if (statusLine == null) throw new IllegalArgumentException("statusLine == null");
|
||||
this.statusLine = statusLine;
|
||||
public Builder protocol(Protocol protocol) {
|
||||
this.protocol = protocol;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder statusLine(String statusLine) {
|
||||
try {
|
||||
return statusLine(new StatusLine(statusLine));
|
||||
} catch (IOException e) {
|
||||
throw new IllegalArgumentException(e);
|
||||
}
|
||||
public Builder code(int code) {
|
||||
this.code = code;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder message(String message) {
|
||||
this.message = message;
|
||||
return this;
|
||||
}
|
||||
|
||||
public Builder handshake(Handshake handshake) {
|
||||
@@ -308,7 +318,7 @@ public final class Response {
|
||||
|
||||
// TODO: move out of public API
|
||||
public Builder setResponseSource(ResponseSource responseSource) {
|
||||
return header(OkHeaders.RESPONSE_SOURCE, responseSource + " " + statusLine.code());
|
||||
return header(OkHeaders.RESPONSE_SOURCE, responseSource + " " + code);
|
||||
}
|
||||
|
||||
public Builder redirectedBy(Response redirectedBy) {
|
||||
@@ -318,7 +328,8 @@ public final class Response {
|
||||
|
||||
public Response build() {
|
||||
if (request == null) throw new IllegalStateException("request == null");
|
||||
if (statusLine == null) throw new IllegalStateException("statusLine == null");
|
||||
if (protocol == null) throw new IllegalStateException("protocol == null");
|
||||
if (code < 0) throw new IllegalStateException("code < 0: " + code);
|
||||
return new Response(this);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,11 +2,11 @@ package com.squareup.okhttp.internal.http;
|
||||
|
||||
import com.squareup.okhttp.CacheControl;
|
||||
import com.squareup.okhttp.MediaType;
|
||||
import com.squareup.okhttp.Protocol;
|
||||
import com.squareup.okhttp.Request;
|
||||
import com.squareup.okhttp.Response;
|
||||
import com.squareup.okhttp.ResponseSource;
|
||||
import com.squareup.okhttp.internal.Util;
|
||||
import java.io.IOException;
|
||||
import java.net.HttpURLConnection;
|
||||
import java.util.Date;
|
||||
import okio.BufferedSource;
|
||||
@@ -35,15 +35,6 @@ public final class CacheStrategy {
|
||||
}
|
||||
};
|
||||
|
||||
private static final StatusLine GATEWAY_TIMEOUT_STATUS_LINE;
|
||||
static {
|
||||
try {
|
||||
GATEWAY_TIMEOUT_STATUS_LINE = new StatusLine("HTTP/1.1 504 Gateway Timeout");
|
||||
} catch (IOException e) {
|
||||
throw new AssertionError();
|
||||
}
|
||||
}
|
||||
|
||||
public final Request request;
|
||||
public final Response response;
|
||||
public final ResponseSource source;
|
||||
@@ -166,7 +157,9 @@ public final class CacheStrategy {
|
||||
// We're forbidden from using the network, but the cache is insufficient.
|
||||
Response noneResponse = new Response.Builder()
|
||||
.request(candidate.request)
|
||||
.statusLine(GATEWAY_TIMEOUT_STATUS_LINE)
|
||||
.protocol(Protocol.HTTP_1_1)
|
||||
.code(504)
|
||||
.message("Gateway Timeout")
|
||||
.setResponseSource(ResponseSource.NONE)
|
||||
.body(EMPTY_BODY)
|
||||
.build();
|
||||
|
||||
@@ -183,18 +183,19 @@ public final class HttpConnection {
|
||||
}
|
||||
|
||||
while (true) {
|
||||
String statusLineString = source.readUtf8LineStrict();
|
||||
StatusLine statusLine = new StatusLine(statusLineString);
|
||||
StatusLine statusLine = StatusLine.parse(source.readUtf8LineStrict());
|
||||
|
||||
Response.Builder responseBuilder = new Response.Builder()
|
||||
.statusLine(statusLine);
|
||||
.protocol(statusLine.protocol)
|
||||
.code(statusLine.code)
|
||||
.message(statusLine.message);
|
||||
|
||||
Headers.Builder headersBuilder = new Headers.Builder();
|
||||
readHeaders(headersBuilder);
|
||||
headersBuilder.add(OkHeaders.SELECTED_PROTOCOL, statusLine.protocol().toString());
|
||||
headersBuilder.add(OkHeaders.SELECTED_PROTOCOL, statusLine.protocol.toString());
|
||||
responseBuilder.headers(headersBuilder.build());
|
||||
|
||||
if (statusLine.code() != HTTP_CONTINUE) {
|
||||
if (statusLine.code != HTTP_CONTINUE) {
|
||||
state = STATE_OPEN_RESPONSE_BODY;
|
||||
return responseBuilder;
|
||||
}
|
||||
|
||||
@@ -158,7 +158,9 @@ public class HttpURLConnectionImpl extends HttpURLConnection {
|
||||
@Override public final String getHeaderField(String fieldName) {
|
||||
try {
|
||||
Response response = getResponse().getResponse();
|
||||
return fieldName == null ? response.statusLine() : response.headers().get(fieldName);
|
||||
return fieldName == null
|
||||
? StatusLine.get(response).toString()
|
||||
: response.headers().get(fieldName);
|
||||
} catch (IOException e) {
|
||||
return null;
|
||||
}
|
||||
@@ -175,7 +177,7 @@ public class HttpURLConnectionImpl extends HttpURLConnection {
|
||||
@Override public final Map<String, List<String>> getHeaderFields() {
|
||||
try {
|
||||
Response response = getResponse().getResponse();
|
||||
return OkHeaders.toMultimap(response.headers(), response.statusLine());
|
||||
return OkHeaders.toMultimap(response.headers(), StatusLine.get(response).toString());
|
||||
} catch (IOException e) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
@@ -488,7 +490,7 @@ public class HttpURLConnectionImpl extends HttpURLConnection {
|
||||
}
|
||||
|
||||
@Override public String getResponseMessage() throws IOException {
|
||||
return getResponse().getResponse().statusMessage();
|
||||
return getResponse().getResponse().message();
|
||||
}
|
||||
|
||||
@Override public final int getResponseCode() throws IOException {
|
||||
|
||||
@@ -67,8 +67,10 @@ public final class JavaApiConverter {
|
||||
okResponseBuilder.request(okRequest);
|
||||
|
||||
// Status line
|
||||
String statusLine = extractStatusLine(httpUrlConnection);
|
||||
okResponseBuilder.statusLine(statusLine);
|
||||
StatusLine statusLine = StatusLine.parse(extractStatusLine(httpUrlConnection));
|
||||
okResponseBuilder.protocol(statusLine.protocol);
|
||||
okResponseBuilder.code(statusLine.code);
|
||||
okResponseBuilder.message(statusLine.message);
|
||||
|
||||
// Response headers
|
||||
Headers okHeaders = extractOkResponseHeaders(httpUrlConnection);
|
||||
@@ -115,7 +117,10 @@ public final class JavaApiConverter {
|
||||
okResponseBuilder.request(request);
|
||||
|
||||
// Status line: Java has this as one of the headers.
|
||||
okResponseBuilder.statusLine(extractStatusLine(javaResponse));
|
||||
StatusLine statusLine = StatusLine.parse(extractStatusLine(javaResponse));
|
||||
okResponseBuilder.protocol(statusLine.protocol);
|
||||
okResponseBuilder.code(statusLine.code);
|
||||
okResponseBuilder.message(statusLine.message);
|
||||
|
||||
// Response headers
|
||||
Headers okHeaders = extractOkHeaders(javaResponse);
|
||||
@@ -218,7 +223,7 @@ public final class JavaApiConverter {
|
||||
@Override
|
||||
public Map<String, List<String>> getHeaders() throws IOException {
|
||||
// Java requires that the entry with a null key be the status line.
|
||||
return OkHeaders.toMultimap(headers, response.statusLine());
|
||||
return OkHeaders.toMultimap(headers, StatusLine.get(response).toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -232,7 +237,7 @@ public final class JavaApiConverter {
|
||||
@Override
|
||||
public Map<String, List<String>> getHeaders() throws IOException {
|
||||
// Java requires that the entry with a null key be the status line.
|
||||
return OkHeaders.toMultimap(headers, response.statusLine());
|
||||
return OkHeaders.toMultimap(headers, StatusLine.get(response).toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -474,19 +479,21 @@ public final class JavaApiConverter {
|
||||
throw new IllegalArgumentException("Invalid header index: " + position);
|
||||
}
|
||||
if (position == 0) {
|
||||
return response.statusLine();
|
||||
return StatusLine.get(response).toString();
|
||||
}
|
||||
return response.headers().value(position - 1);
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getHeaderField(String fieldName) {
|
||||
return fieldName == null ? response.statusLine() : response.headers().get(fieldName);
|
||||
return fieldName == null
|
||||
? StatusLine.get(response).toString()
|
||||
: response.headers().get(fieldName);
|
||||
}
|
||||
|
||||
@Override
|
||||
public Map<String, List<String>> getHeaderFields() {
|
||||
return OkHeaders.toMultimap(response.headers(), response.statusLine());
|
||||
return OkHeaders.toMultimap(response.headers(), StatusLine.get(response).toString());
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -496,7 +503,7 @@ public final class JavaApiConverter {
|
||||
|
||||
@Override
|
||||
public String getResponseMessage() throws IOException {
|
||||
return response.statusMessage();
|
||||
return response.message();
|
||||
}
|
||||
|
||||
@Override
|
||||
|
||||
@@ -202,8 +202,11 @@ public final class SpdyTransport implements Transport {
|
||||
if (status == null) throw new ProtocolException("Expected ':status' header not present");
|
||||
if (version == null) throw new ProtocolException("Expected ':version' header not present");
|
||||
|
||||
StatusLine statusLine = StatusLine.parse(version + " " + status);
|
||||
return new Response.Builder()
|
||||
.statusLine(new StatusLine(version + " " + status))
|
||||
.protocol(statusLine.protocol)
|
||||
.code(statusLine.code)
|
||||
.message(statusLine.message)
|
||||
.headers(headersBuilder.build());
|
||||
}
|
||||
|
||||
|
||||
@@ -1,21 +1,31 @@
|
||||
package com.squareup.okhttp.internal.http;
|
||||
|
||||
import com.squareup.okhttp.Protocol;
|
||||
import com.squareup.okhttp.Response;
|
||||
import java.io.IOException;
|
||||
import java.net.ProtocolException;
|
||||
|
||||
/** An HTTP response status line like "HTTP/1.1 200 OK". */
|
||||
public final class StatusLine {
|
||||
/** Numeric status code, 307: Temporary Redirect. */
|
||||
public static final int HTTP_TEMP_REDIRECT = 307;
|
||||
public static final int HTTP_CONTINUE = 100;
|
||||
|
||||
private final String statusLine;
|
||||
private final Protocol protocol;
|
||||
private final int responseCode;
|
||||
private final String responseMessage;
|
||||
public final Protocol protocol;
|
||||
public final int code;
|
||||
public final String message;
|
||||
|
||||
/** Sets the response status line (like "HTTP/1.0 200 OK"). */
|
||||
public StatusLine(String statusLine) throws IOException {
|
||||
public StatusLine(Protocol protocol, int code, String message) {
|
||||
this.protocol = protocol;
|
||||
this.code = code;
|
||||
this.message = message;
|
||||
}
|
||||
|
||||
public static StatusLine get(Response response) {
|
||||
return new StatusLine(response.protocol(), response.code(), response.message());
|
||||
}
|
||||
|
||||
public static StatusLine parse(String statusLine) throws IOException {
|
||||
// H T T P / 1 . 1 2 0 0 T e m p o r a r y R e d i r e c t
|
||||
// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
|
||||
|
||||
@@ -47,45 +57,33 @@ public final class StatusLine {
|
||||
if (statusLine.length() < codeStart + 3) {
|
||||
throw new ProtocolException("Unexpected status line: " + statusLine);
|
||||
}
|
||||
int responseCode;
|
||||
int code;
|
||||
try {
|
||||
responseCode = Integer.parseInt(statusLine.substring(codeStart, codeStart + 3));
|
||||
code = Integer.parseInt(statusLine.substring(codeStart, codeStart + 3));
|
||||
} catch (NumberFormatException e) {
|
||||
throw new ProtocolException("Unexpected status line: " + statusLine);
|
||||
}
|
||||
|
||||
// Parse an optional response message like "OK" or "Not Modified". If it
|
||||
// exists, it is separated from the response code by a space.
|
||||
String responseMessage = "";
|
||||
String message = "";
|
||||
if (statusLine.length() > codeStart + 3) {
|
||||
if (statusLine.charAt(codeStart + 3) != ' ') {
|
||||
throw new ProtocolException("Unexpected status line: " + statusLine);
|
||||
}
|
||||
responseMessage = statusLine.substring(codeStart + 4);
|
||||
message = statusLine.substring(codeStart + 4);
|
||||
}
|
||||
|
||||
this.responseMessage = responseMessage;
|
||||
this.responseCode = responseCode;
|
||||
this.statusLine = statusLine;
|
||||
this.protocol = protocol;
|
||||
return new StatusLine(protocol, code, message);
|
||||
}
|
||||
|
||||
public String getStatusLine() {
|
||||
return statusLine;
|
||||
}
|
||||
|
||||
/** Returns either {@link Protocol#HTTP_1_1} or {@link Protocol#HTTP_1_0}. */
|
||||
public Protocol protocol() {
|
||||
return protocol;
|
||||
}
|
||||
|
||||
/** Returns the HTTP status code or -1 if it is unknown. */
|
||||
public int code() {
|
||||
return responseCode;
|
||||
}
|
||||
|
||||
/** Returns the HTTP status message or null if it is unknown. */
|
||||
public String message() {
|
||||
return responseMessage;
|
||||
@Override public String toString() {
|
||||
StringBuilder result = new StringBuilder();
|
||||
result.append(protocol == Protocol.HTTP_1_0 ? "HTTP/1.0" : "HTTP/1.1");
|
||||
result.append(" ").append(code);
|
||||
if (message != null) {
|
||||
result.append(" ").append(message);
|
||||
}
|
||||
return result.toString();
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user