Provide http status message to InvalidResponseCodeException

When response code alone is not enough to distinguish error responses, the http status message is helpful.
This commit is contained in:
Patrik Åkerfeldt 2018-10-23 16:25:40 +02:00
parent 1ef3efaa90
commit 8c5703e931
5 changed files with 19 additions and 8 deletions

View file

@ -327,7 +327,7 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
int responseCode = responseInfo.getHttpStatusCode();
if (responseCode < 200 || responseCode > 299) {
InvalidResponseCodeException exception = new InvalidResponseCodeException(responseCode,
responseInfo.getAllHeaders(), currentDataSpec);
responseInfo.getHttpStatusText(), responseInfo.getAllHeaders(), currentDataSpec);
if (responseCode == 416) {
exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE));
}
@ -611,7 +611,8 @@ public class CronetDataSource extends BaseDataSource implements HttpDataSource {
// The industry standard is to disregard POST redirects when the status code is 307 or 308.
if (responseCode == 307 || responseCode == 308) {
exception =
new InvalidResponseCodeException(responseCode, info.getAllHeaders(), currentDataSpec);
new InvalidResponseCodeException(responseCode, info.getHttpStatusText(),
info.getAllHeaders(), currentDataSpec);
operation.open();
return;
}

View file

@ -173,7 +173,7 @@ public class OkHttpDataSource extends BaseDataSource implements HttpDataSource {
Map<String, List<String>> headers = response.headers().toMultimap();
closeConnectionQuietly();
InvalidResponseCodeException exception = new InvalidResponseCodeException(
responseCode, headers, dataSpec);
responseCode, response.message(), headers, dataSpec);
if (responseCode == 416) {
exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE));
}

View file

@ -283,8 +283,10 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
}
int responseCode;
String responseMessage;
try {
responseCode = connection.getResponseCode();
responseMessage = connection.getResponseMessage();
} catch (IOException e) {
closeConnectionQuietly();
throw new HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e,
@ -296,7 +298,7 @@ public class DefaultHttpDataSource extends BaseDataSource implements HttpDataSou
Map<String, List<String>> headers = connection.getHeaderFields();
closeConnectionQuietly();
InvalidResponseCodeException exception =
new InvalidResponseCodeException(responseCode, headers, dataSpec);
new InvalidResponseCodeException(responseCode, responseMessage, headers, dataSpec);
if (responseCode == 416) {
exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE));
}

View file

@ -16,6 +16,7 @@
package com.google.android.exoplayer2.upstream;
import android.support.annotation.IntDef;
import android.support.annotation.Nullable;
import android.text.TextUtils;
import com.google.android.exoplayer2.util.Predicate;
import com.google.android.exoplayer2.util.Util;
@ -294,15 +295,22 @@ public interface HttpDataSource extends DataSource {
*/
public final int responseCode;
/**
* The HTTP status message.
*/
public final @Nullable String responseMessage;
/**
* An unmodifiable map of the response header fields and values.
*/
public final Map<String, List<String>> headerFields;
public InvalidResponseCodeException(int responseCode, Map<String, List<String>> headerFields,
public InvalidResponseCodeException(int responseCode, @Nullable String responseMessage,
Map<String, List<String>> headerFields,
DataSpec dataSpec) {
super("Response code: " + responseCode, dataSpec, TYPE_OPEN);
this.responseCode = responseCode;
this.responseMessage = responseMessage;
this.headerFields = headerFields;
}

View file

@ -34,7 +34,7 @@ public final class DefaultLoadErrorHandlingPolicyTest {
@Test
public void getBlacklistDurationMsFor_blacklist404() {
InvalidResponseCodeException exception =
new InvalidResponseCodeException(404, Collections.emptyMap(), new DataSpec(Uri.EMPTY));
new InvalidResponseCodeException(404, "Not Found", Collections.emptyMap(), new DataSpec(Uri.EMPTY));
assertThat(getDefaultPolicyBlacklistOutputFor(exception))
.isEqualTo(DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS);
}
@ -42,7 +42,7 @@ public final class DefaultLoadErrorHandlingPolicyTest {
@Test
public void getBlacklistDurationMsFor_blacklist410() {
InvalidResponseCodeException exception =
new InvalidResponseCodeException(410, Collections.emptyMap(), new DataSpec(Uri.EMPTY));
new InvalidResponseCodeException(410, "Gone", Collections.emptyMap(), new DataSpec(Uri.EMPTY));
assertThat(getDefaultPolicyBlacklistOutputFor(exception))
.isEqualTo(DefaultLoadErrorHandlingPolicy.DEFAULT_TRACK_BLACKLIST_MS);
}
@ -50,7 +50,7 @@ public final class DefaultLoadErrorHandlingPolicyTest {
@Test
public void getBlacklistDurationMsFor_dontBlacklistUnexpectedHttpCodes() {
InvalidResponseCodeException exception =
new InvalidResponseCodeException(500, Collections.emptyMap(), new DataSpec(Uri.EMPTY));
new InvalidResponseCodeException(500, "Internal Server Error", Collections.emptyMap(), new DataSpec(Uri.EMPTY));
assertThat(getDefaultPolicyBlacklistOutputFor(exception)).isEqualTo(C.TIME_UNSET);
}