1
0
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:
Adrian Cole
2014-04-19 12:34:57 -07:00
13 changed files with 174 additions and 133 deletions

View File

@@ -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));

View File

@@ -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();

View File

@@ -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));

View File

@@ -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();
}

View File

@@ -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) {
}

View File

@@ -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)

View File

@@ -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);
}
}

View File

@@ -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();

View File

@@ -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;
}

View File

@@ -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 {

View File

@@ -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

View File

@@ -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());
}

View File

@@ -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();
}
}