Search in sources :

Example 6 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSource method open.

@Override
public long open(DataSpec dataSpec) throws HttpDataSourceException {
    Assertions.checkNotNull(dataSpec);
    Assertions.checkState(!opened);
    operation.close();
    resetConnectTimeout();
    currentDataSpec = dataSpec;
    currentUrlRequest = buildRequest(dataSpec);
    currentUrlRequest.start();
    boolean requestStarted = blockUntilConnectTimeout();
    if (exception != null) {
        throw new OpenException(exception, currentDataSpec, getStatus(currentUrlRequest));
    } else if (!requestStarted) {
        // The timeout was reached before the connection was opened.
        throw new OpenException(new SocketTimeoutException(), dataSpec, getStatus(currentUrlRequest));
    }
    // Check for a valid response code.
    int responseCode = responseInfo.getHttpStatusCode();
    if (responseCode < 200 || responseCode > 299) {
        InvalidResponseCodeException exception = new InvalidResponseCodeException(responseCode, responseInfo.getAllHeaders(), currentDataSpec);
        if (responseCode == 416) {
            exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE));
        }
        throw exception;
    }
    // Check for a valid content type.
    if (contentTypePredicate != null) {
        List<String> contentTypeHeaders = responseInfo.getAllHeaders().get(CONTENT_TYPE);
        String contentType = isEmpty(contentTypeHeaders) ? null : contentTypeHeaders.get(0);
        if (!contentTypePredicate.evaluate(contentType)) {
            throw new InvalidContentTypeException(contentType, currentDataSpec);
        }
    }
    // If we requested a range starting from a non-zero position and received a 200 rather than a
    // 206, then the server does not support partial requests. We'll need to manually skip to the
    // requested position.
    bytesToSkip = responseCode == 200 && dataSpec.position != 0 ? dataSpec.position : 0;
    // Calculate the content length.
    if (!getIsCompressed(responseInfo)) {
        if (dataSpec.length != C.LENGTH_UNSET) {
            bytesRemaining = dataSpec.length;
        } else {
            bytesRemaining = getContentLength(responseInfo);
        }
    } else {
        // If the response is compressed then the content length will be that of the compressed data
        // which isn't what we want. Always use the dataSpec length in this case.
        bytesRemaining = currentDataSpec.length;
    }
    opened = true;
    if (listener != null) {
        listener.onTransferStart(this, dataSpec);
    }
    return bytesRemaining;
}
Also used : SocketTimeoutException(java.net.SocketTimeoutException) DataSourceException(com.google.android.exoplayer2.upstream.DataSourceException)

Example 7 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class OkHttpDataSource method open.

@Override
public long open(DataSpec dataSpec) throws HttpDataSourceException {
    this.dataSpec = dataSpec;
    this.bytesRead = 0;
    this.bytesSkipped = 0;
    Request request = makeRequest(dataSpec);
    try {
        response = callFactory.newCall(request).execute();
        responseByteStream = response.body().byteStream();
    } catch (IOException e) {
        throw new HttpDataSourceException("Unable to connect to " + dataSpec.uri.toString(), e, dataSpec, HttpDataSourceException.TYPE_OPEN);
    }
    int responseCode = response.code();
    // Check for a valid response code.
    if (!response.isSuccessful()) {
        Map<String, List<String>> headers = request.headers().toMultimap();
        closeConnectionQuietly();
        InvalidResponseCodeException exception = new InvalidResponseCodeException(responseCode, headers, dataSpec);
        if (responseCode == 416) {
            exception.initCause(new DataSourceException(DataSourceException.POSITION_OUT_OF_RANGE));
        }
        throw exception;
    }
    // Check for a valid content type.
    MediaType mediaType = response.body().contentType();
    String contentType = mediaType != null ? mediaType.toString() : null;
    if (contentTypePredicate != null && !contentTypePredicate.evaluate(contentType)) {
        closeConnectionQuietly();
        throw new InvalidContentTypeException(contentType, dataSpec);
    }
    // If we requested a range starting from a non-zero position and received a 200 rather than a
    // 206, then the server does not support partial requests. We'll need to manually skip to the
    // requested position.
    bytesToSkip = responseCode == 200 && dataSpec.position != 0 ? dataSpec.position : 0;
    // Determine the length of the data to be read, after skipping.
    if (dataSpec.length != C.LENGTH_UNSET) {
        bytesToRead = dataSpec.length;
    } else {
        long contentLength = response.body().contentLength();
        bytesToRead = contentLength != -1 ? (contentLength - bytesToSkip) : C.LENGTH_UNSET;
    }
    opened = true;
    if (listener != null) {
        listener.onTransferStart(this, dataSpec);
    }
    return bytesToRead;
}
Also used : DataSourceException(com.google.android.exoplayer2.upstream.DataSourceException) Request(okhttp3.Request) MediaType(okhttp3.MediaType) List(java.util.List) IOException(java.io.IOException) InterruptedIOException(java.io.InterruptedIOException)

Example 8 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testRangeRequestWith206Response.

@Test
public void testRangeRequestWith206Response() throws HttpDataSourceException {
    mockResponseStartSuccess();
    mockReadSuccess(1000, 5000);
    // Server supports range requests.
    testUrlResponseInfo = createUrlResponseInfo(206);
    testDataSpec = new DataSpec(Uri.parse(TEST_URL), 1000, 5000, null);
    dataSourceUnderTest.open(testDataSpec);
    byte[] returnedBuffer = new byte[16];
    int bytesRead = dataSourceUnderTest.read(returnedBuffer, 0, 16);
    assertEquals(16, bytesRead);
    assertArrayEquals(buildTestDataArray(1000, 16), returnedBuffer);
    verify(mockTransferListener).onBytesTransferred(dataSourceUnderTest, 16);
}
Also used : DataSpec(com.google.android.exoplayer2.upstream.DataSpec) Test(org.junit.Test)

Example 9 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testRequestOpenGzippedCompressedReturnsDataSpecLength.

@Test
public void testRequestOpenGzippedCompressedReturnsDataSpecLength() throws HttpDataSourceException {
    testDataSpec = new DataSpec(Uri.parse(TEST_URL), 0, 5000, null);
    testResponseHeader.put("Content-Encoding", "gzip");
    testResponseHeader.put("Content-Length", Long.toString(50L));
    mockResponseStartSuccess();
    assertEquals(5000, /* contentLength */
    dataSourceUnderTest.open(testDataSpec));
    verify(mockTransferListener).onTransferStart(dataSourceUnderTest, testDataSpec);
}
Also used : DataSpec(com.google.android.exoplayer2.upstream.DataSpec) Test(org.junit.Test)

Example 10 with HttpDataSourceException

use of com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException in project ExoPlayer by google.

the class CronetDataSourceTest method testRangeRequestWith200Response.

@Test
public void testRangeRequestWith200Response() throws HttpDataSourceException {
    mockResponseStartSuccess();
    mockReadSuccess(0, 7000);
    // Server does not support range requests.
    testUrlResponseInfo = createUrlResponseInfo(200);
    testDataSpec = new DataSpec(Uri.parse(TEST_URL), 1000, 5000, null);
    dataSourceUnderTest.open(testDataSpec);
    byte[] returnedBuffer = new byte[16];
    int bytesRead = dataSourceUnderTest.read(returnedBuffer, 0, 16);
    assertEquals(16, bytesRead);
    assertArrayEquals(buildTestDataArray(1000, 16), returnedBuffer);
    verify(mockTransferListener).onBytesTransferred(dataSourceUnderTest, 16);
}
Also used : DataSpec(com.google.android.exoplayer2.upstream.DataSpec) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)8 DataSpec (com.google.android.exoplayer2.upstream.DataSpec)5 ConditionVariable (android.os.ConditionVariable)3 HttpDataSourceException (com.google.android.exoplayer2.upstream.HttpDataSource.HttpDataSourceException)3 SocketTimeoutException (java.net.SocketTimeoutException)3 DataSourceException (com.google.android.exoplayer2.upstream.DataSourceException)2 IOException (java.io.IOException)1 InterruptedIOException (java.io.InterruptedIOException)1 ByteBuffer (java.nio.ByteBuffer)1 List (java.util.List)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 MediaType (okhttp3.MediaType)1 Request (okhttp3.Request)1