package com.loopj.android.http.handler; import android.util.Log; import org.apache.http.Header; import org.apache.http.HttpEntity; import org.apache.http.HttpResponse; import org.apache.http.StatusLine; import org.apache.http.HttpStatus; import org.apache.http.client.HttpResponseException; import org.apache.http.client.methods.HttpUriRequest; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; public abstract class RangeFileAsyncHttpResponseHandler extends FileAsyncHttpResponseHandler { private static final String LOG_TAG = "RangeFileAsyncHttpResponseHandler"; private long current = 0; private boolean append = false; /** * Obtains new RangeFileAsyncHttpResponseHandler and stores response in passed file * * @param file File to store response within, must not be null */ public RangeFileAsyncHttpResponseHandler(File file) { super(file); } @Override public void sendResponseMessage(HttpResponse response) throws IOException { if (!Thread.currentThread().isInterrupted()) { StatusLine status = response.getStatusLine(); if (status.getStatusCode() == HttpStatus.SC_REQUESTED_RANGE_NOT_SATISFIABLE){ //already finished if (!Thread.currentThread().isInterrupted()) sendSuccessMessage(status.getStatusCode(), response.getAllHeaders(), null); } else if (status.getStatusCode() >= 300) { if (!Thread.currentThread().isInterrupted()) sendFailureMessage(status.getStatusCode(), response.getAllHeaders(), null, new HttpResponseException(status.getStatusCode(), status.getReasonPhrase())); } else { if (!Thread.currentThread().isInterrupted()) { Header header = response.getFirstHeader("Content-Range"); if (header == null) { append = false; current = 0; } else Log.v(LOG_TAG, "Content-Rnage: " + header.getValue()); sendSuccessMessage(status.getStatusCode(), response.getAllHeaders(), getResponseData(response.getEntity())); } } } } @Override protected byte[] getResponseData(HttpEntity entity) throws IOException { if (entity != null) { InputStream instream = entity.getContent(); long contentLength = entity.getContentLength() + current; FileOutputStream buffer = new FileOutputStream(getTargetFile(), append); if (instream != null) { try { byte[] tmp = new byte[BUFFER_SIZE]; int l; while (current < contentLength && (l = instream.read(tmp)) != -1 && !Thread.currentThread().isInterrupted()) { current += l; buffer.write(tmp, 0, l); sendProgressMessage((int)current, (int)contentLength); } } finally { instream.close(); buffer.flush(); buffer.close(); } } } return null; } public void updateRequestHeaders(HttpUriRequest uriRequest) { if (mFile.exists() && mFile.canWrite()) current = mFile.length(); if (current > 0) { append = true; uriRequest.setHeader("Range", "bytes=" + current + "-"); } } }