Second part of fix for issue #569

When moving to take into account arrayOffset, it should have been taken into account also in setReadPosition and other places. Fix it now...
Also fix mismatch algorithm between SeekAheadOptimize and not SeekAheadOptimize (standard) versions.
This commit is contained in:
Frédéric Brégier 2012-08-28 16:39:47 +03:00
parent a3cedc8b47
commit 148fc841ac

View File

@ -849,13 +849,18 @@ public class HttpPostRequestDecoder {
/** /**
* Skip control Characters * Skip control Characters
* @throws NotEnoughDataDecoderException
*/ */
void skipControlCharacters() { void skipControlCharacters() throws NotEnoughDataDecoderException {
SeekAheadOptimize sao = null; SeekAheadOptimize sao = null;
try { try {
sao = new SeekAheadOptimize(undecodedChunk); sao = new SeekAheadOptimize(undecodedChunk);
} catch (SeekAheadNoBackArrayException e) { } catch (SeekAheadNoBackArrayException e) {
try {
skipControlCharactersStandard(undecodedChunk); skipControlCharactersStandard(undecodedChunk);
} catch (IndexOutOfBoundsException e1) {
throw new NotEnoughDataDecoderException(e1);
}
return; return;
} }
@ -866,13 +871,13 @@ public class HttpPostRequestDecoder {
return; return;
} }
} }
sao.setReadPosition(0); throw new NotEnoughDataDecoderException("Access out of bounds");
} }
static void skipControlCharactersStandard(ChannelBuffer buffer) { void skipControlCharactersStandard() {
for (;;) { for (;;) {
char c = (char) buffer.readUnsignedByte(); char c = (char) undecodedChunk.readUnsignedByte();
if (!Character.isISOControl(c) && !Character.isWhitespace(c)) { if (!Character.isISOControl(c) && !Character.isWhitespace(c)) {
buffer.readerIndex(buffer.readerIndex() - 1); undecodedChunk.readerIndex(undecodedChunk.readerIndex() - 1);
break; break;
} }
} }
@ -892,7 +897,12 @@ public class HttpPostRequestDecoder {
throws ErrorDataDecoderException { throws ErrorDataDecoderException {
// --AaB03x or --AaB03x-- // --AaB03x or --AaB03x--
int readerIndex = undecodedChunk.readerIndex(); int readerIndex = undecodedChunk.readerIndex();
try {
skipControlCharacters(); skipControlCharacters();
} catch (NotEnoughDataDecoderException e1) {
undecodedChunk.readerIndex(readerIndex);
return null;
}
skipOneLine(); skipOneLine();
String newline; String newline;
try { try {
@ -933,9 +943,9 @@ public class HttpPostRequestDecoder {
} }
// read many lines until empty line with newline found! Store all data // read many lines until empty line with newline found! Store all data
while (!skipOneLine()) { while (!skipOneLine()) {
skipControlCharacters();
String newline; String newline;
try { try {
skipControlCharacters();
newline = readLine(); newline = readLine();
} catch (NotEnoughDataDecoderException e) { } catch (NotEnoughDataDecoderException e) {
undecodedChunk.readerIndex(readerIndex); undecodedChunk.readerIndex(readerIndex);
@ -1594,8 +1604,8 @@ public class HttpPostRequestDecoder {
// found the decoder limit // found the decoder limit
boolean newLine = true; boolean newLine = true;
int index = 0; int index = 0;
int lastrealpos = sao.pos;
int lastPosition = undecodedChunk.readerIndex(); int lastPosition = undecodedChunk.readerIndex();
int setReadPosition = -1;
boolean found = false; boolean found = false;
while (sao.pos < sao.limit) { while (sao.pos < sao.limit) {
@ -1606,7 +1616,6 @@ public class HttpPostRequestDecoder {
index ++; index ++;
if (delimiter.length() == index) { if (delimiter.length() == index) {
found = true; found = true;
sao.setReadPosition(0);
break; break;
} }
continue; continue;
@ -1620,23 +1629,16 @@ public class HttpPostRequestDecoder {
if (nextByte == HttpConstants.LF) { if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
setReadPosition = sao.pos; lastrealpos = sao.pos - 2;
lastPosition = sao.pos - 2;
} }
} else {
// save last valid position
setReadPosition = sao.pos;
lastPosition = sao.pos;
} }
} else if (nextByte == HttpConstants.LF) { } else if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
setReadPosition = sao.pos; lastrealpos = sao.pos - 1;
lastPosition = sao.pos - 1;
} else { } else {
// save last valid position // save last valid position
setReadPosition = sao.pos; lastrealpos = sao.pos;
lastPosition = sao.pos;
} }
} }
} else { } else {
@ -1647,30 +1649,20 @@ public class HttpPostRequestDecoder {
if (nextByte == HttpConstants.LF) { if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
setReadPosition = sao.pos; lastrealpos = sao.pos - 2;
lastPosition = sao.pos - 2;
} }
} else {
// save last valid position
setReadPosition = sao.pos;
lastPosition = sao.pos;
} }
} else if (nextByte == HttpConstants.LF) { } else if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
setReadPosition = sao.pos; lastrealpos = sao.pos - 1;
lastPosition = sao.pos - 1;
} else { } else {
// save last valid position // save last valid position
setReadPosition = sao.pos; lastrealpos = sao.pos;
lastPosition = sao.pos;
} }
} }
} }
if (setReadPosition > 0) { lastPosition = sao.getReadPosition(lastrealpos);
sao.pos = setReadPosition;
sao.setReadPosition(0);
}
ChannelBuffer buffer = undecodedChunk.slice(readerIndex, lastPosition - readerIndex); ChannelBuffer buffer = undecodedChunk.slice(readerIndex, lastPosition - readerIndex);
if (found) { if (found) {
// found so lastPosition is correct and final // found so lastPosition is correct and final
@ -1809,7 +1801,7 @@ public class HttpPostRequestDecoder {
boolean newLine = true; boolean newLine = true;
int index = 0; int index = 0;
int lastPosition = undecodedChunk.readerIndex(); int lastPosition = undecodedChunk.readerIndex();
int setReadPosition = -1; int lastrealpos = sao.pos;
boolean found = false; boolean found = false;
while (sao.pos < sao.limit) { while (sao.pos < sao.limit) {
@ -1820,7 +1812,6 @@ public class HttpPostRequestDecoder {
index ++; index ++;
if (delimiter.length() == index) { if (delimiter.length() == index) {
found = true; found = true;
sao.setReadPosition(0);
break; break;
} }
continue; continue;
@ -1834,21 +1825,15 @@ public class HttpPostRequestDecoder {
if (nextByte == HttpConstants.LF) { if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
lastPosition = sao.pos - 2; lastrealpos = sao.pos - 2;
setReadPosition = sao.pos;
} }
} else {
lastPosition = sao.pos;
setReadPosition = sao.pos;
} }
} else if (nextByte == HttpConstants.LF) { } else if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
lastPosition = sao.pos - 1; lastrealpos = sao.pos - 1;
setReadPosition = sao.pos;
} else { } else {
lastPosition = sao.pos; lastrealpos = sao.pos;
setReadPosition = sao.pos;
} }
} }
} else { } else {
@ -1859,28 +1844,19 @@ public class HttpPostRequestDecoder {
if (nextByte == HttpConstants.LF) { if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
lastPosition = sao.pos - 2; lastrealpos = sao.pos - 2;
setReadPosition = sao.pos;
} }
} else {
lastPosition = sao.pos;
setReadPosition = sao.pos;
} }
} else if (nextByte == HttpConstants.LF) { } else if (nextByte == HttpConstants.LF) {
newLine = true; newLine = true;
index = 0; index = 0;
lastPosition = sao.pos - 1; lastrealpos = sao.pos - 1;
setReadPosition = sao.pos;
} else { } else {
lastPosition = sao.pos; lastrealpos = sao.pos;
setReadPosition = sao.pos;
} }
} }
} }
if (setReadPosition > 0) { lastPosition = sao.getReadPosition(lastrealpos);
sao.pos = setReadPosition;
sao.setReadPosition(0);
}
if (found) { if (found) {
// found so lastPosition is correct // found so lastPosition is correct
// but position is just after the delimiter (either close delimiter or simple one) // but position is just after the delimiter (either close delimiter or simple one)