package me.lzb.download.impl;
import me.lzb.download.api.Connection;
import me.lzb.download.api.ConnectionException;
import org.apache.http.HttpEntity;
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClients;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.Arrays;
class ConnectionImpl implements Connection {
static final int BUFFER_SIZE = 1024;
HttpGet httpget;
CloseableHttpClient httpClient;
public ConnectionImpl(String url) throws ConnectionException{
httpget = new HttpGet(url);
httpget.setHeader("Accept-Encoding", "identity");
httpClient = HttpClients.createDefault();
}
@Override
public byte[] read(int startPos, int endPos) throws IOException {
httpget.removeHeaders("Range");
httpget.addHeader("Range", "bytes=" + startPos + "-" + endPos);
CloseableHttpResponse response = httpClient.execute(httpget);
InputStream inputStream = response.getEntity().getContent();
byte[] buff = new byte[BUFFER_SIZE];
int lenth = endPos - startPos + 1;
ByteArrayOutputStream baos = new ByteArrayOutputStream();
while(baos.size() < lenth){
int len = inputStream.read(buff);
if (len < 0) {
break;
}
baos.write(buff,0, len);
}
if(baos.size() > lenth){
byte[] data = baos.toByteArray();
return Arrays.copyOf(data, lenth);
}
return baos.toByteArray();
}
@Override
public int getContentLength() {
CloseableHttpResponse response;
try {
response = httpClient.execute(httpget);
} catch (IOException e) {
e.printStackTrace();
return -1;
}
HttpEntity httpEntity = response.getEntity();
return (int) httpEntity.getContentLength();
}
@Override
public void close() {
}
}