HDDS-732. Add read method which takes offset and length in SignedChunkInputStream. Contributed by chencan.

This commit is contained in:
Márton Elek 2018-11-21 17:59:20 +01:00
parent 22867deffa
commit 34b6fa7d6b
2 changed files with 70 additions and 0 deletions

View File

@ -65,6 +65,46 @@ public int read() throws IOException {
} }
} }
@Override
public int read(byte b[], int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if (off < 0 || len < 0 || len > b.length - off) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
int currentOff = off;
int currentLen = len;
int totalReadBytes = 0;
int realReadLen = 0;
int maxReadLen = 0;
do {
if (remainingData > 0) {
maxReadLen = Math.min(remainingData, currentLen);
realReadLen = originalStream.read(b, currentOff, maxReadLen);
if (realReadLen == -1) {
break;
}
currentOff += realReadLen;
currentLen -= realReadLen;
totalReadBytes += realReadLen;
remainingData -= realReadLen;
if (remainingData == 0) {
//read the "\r\n" at the end of the data section
originalStream.read();
originalStream.read();
}
} else {
remainingData = readHeader();
if (remainingData == -1) {
break;
}
}
} while (currentLen > 0);
return totalReadBytes > 0 ? totalReadBytes : -1;
}
private int readHeader() throws IOException { private int readHeader() throws IOException {
int prev = -1; int prev = -1;
int curr = 0; int curr = 0;

View File

@ -49,32 +49,62 @@ public void emptyfile() throws IOException {
@Test @Test
public void singlechunk() throws IOException { public void singlechunk() throws IOException {
//test simple read()
InputStream is = fileContent("0A;chunk-signature" InputStream is = fileContent("0A;chunk-signature"
+ +
"=23abb2bd920ddeeaac78a63ed808bc59fa6e7d3ef0e356474b82cdc2f8c93c40\r" "=23abb2bd920ddeeaac78a63ed808bc59fa6e7d3ef0e356474b82cdc2f8c93c40\r"
+ "\n1234567890\r\n"); + "\n1234567890\r\n");
String result = IOUtils.toString(is, Charset.forName("UTF-8")); String result = IOUtils.toString(is, Charset.forName("UTF-8"));
Assert.assertEquals("1234567890", result); Assert.assertEquals("1234567890", result);
//test read(byte[],int,int)
is = fileContent("0A;chunk-signature"
+
"=23abb2bd920ddeeaac78a63ed808bc59fa6e7d3ef0e356474b82cdc2f8c93c40\r"
+ "\n1234567890\r\n");
byte[] bytes = new byte[10];
IOUtils.read(is, bytes, 0, 10);
Assert.assertEquals("1234567890", new String(bytes));
} }
@Test @Test
public void singlechunkwithoutend() throws IOException { public void singlechunkwithoutend() throws IOException {
//test simple read()
InputStream is = fileContent("0A;chunk-signature" InputStream is = fileContent("0A;chunk-signature"
+ +
"=23abb2bd920ddeeaac78a63ed808bc59fa6e7d3ef0e356474b82cdc2f8c93c40\r" "=23abb2bd920ddeeaac78a63ed808bc59fa6e7d3ef0e356474b82cdc2f8c93c40\r"
+ "\n1234567890"); + "\n1234567890");
String result = IOUtils.toString(is, Charset.forName("UTF-8")); String result = IOUtils.toString(is, Charset.forName("UTF-8"));
Assert.assertEquals("1234567890", result); Assert.assertEquals("1234567890", result);
//test read(byte[],int,int)
is = fileContent("0A;chunk-signature"
+
"=23abb2bd920ddeeaac78a63ed808bc59fa6e7d3ef0e356474b82cdc2f8c93c40\r"
+ "\n1234567890");
byte[] bytes = new byte[10];
IOUtils.read(is, bytes, 0, 10);
Assert.assertEquals("1234567890", new String(bytes));
} }
@Test @Test
public void multichunks() throws IOException { public void multichunks() throws IOException {
//test simple read()
InputStream is = fileContent("0a;chunk-signature=signature\r\n" InputStream is = fileContent("0a;chunk-signature=signature\r\n"
+ "1234567890\r\n" + "1234567890\r\n"
+ "05;chunk-signature=signature\r\n" + "05;chunk-signature=signature\r\n"
+ "abcde\r\n"); + "abcde\r\n");
String result = IOUtils.toString(is, Charset.forName("UTF-8")); String result = IOUtils.toString(is, Charset.forName("UTF-8"));
Assert.assertEquals("1234567890abcde", result); Assert.assertEquals("1234567890abcde", result);
//test read(byte[],int,int)
is = fileContent("0a;chunk-signature=signature\r\n"
+ "1234567890\r\n"
+ "05;chunk-signature=signature\r\n"
+ "abcde\r\n");
byte[] bytes = new byte[15];
IOUtils.read(is, bytes, 0, 15);
Assert.assertEquals("1234567890abcde", new String(bytes));
} }
private InputStream fileContent(String content) { private InputStream fileContent(String content) {