HDDS-732. Add read method which takes offset and length in SignedChunkInputStream. Contributed by chencan.
This commit is contained in:
parent
22867deffa
commit
34b6fa7d6b
@ -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;
|
||||||
|
@ -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) {
|
||||||
|
Loading…
Reference in New Issue
Block a user