Merge pull request #572 from fredericBregier/3

3 - fix for issue  #569
This commit is contained in:
Norman Maurer 2012-08-28 09:08:22 -07:00
commit 0522c4ffc4
2 changed files with 48 additions and 60 deletions

View File

@ -134,6 +134,8 @@ final class HttpPostBodyUtil {
int readerIndex;
int pos;
int origPos;
int limit;
@ -148,7 +150,8 @@ final class HttpPostBodyUtil {
}
this.buffer = buffer;
bytes = buffer.array();
pos = readerIndex = buffer.arrayOffset() + buffer.readerIndex();
readerIndex = buffer.readerIndex();
origPos = pos = buffer.arrayOffset() + readerIndex;
limit = buffer.arrayOffset() + buffer.writerIndex();
}
@ -159,10 +162,19 @@ final class HttpPostBodyUtil {
*/
void setReadPosition(int minus) {
pos -= minus;
readerIndex = pos;
readerIndex = getReadPosition(pos);
buffer.readerIndex(readerIndex);
}
/**
*
* @param index raw index of the array (pos in general)
* @return the value equivalent of raw index to be used in readerIndex(value)
*/
int getReadPosition(int index) {
return index - origPos + readerIndex;
}
void clear() {
buffer = null;
bytes = null;

View File

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