diff --git a/source/de/anomic/server/serverCore.java b/source/de/anomic/server/serverCore.java index b4e5f24ba..af6982d83 100644 --- a/source/de/anomic/server/serverCore.java +++ b/source/de/anomic/server/serverCore.java @@ -1162,34 +1162,56 @@ public final class serverCore extends serverAbstractThread implements serverThre } + /** + * Read a line from a protocol stream (HTTP/ICAP) and do some + * pre-processing (check validity, strip line endings). + *
+ * Illegal control characters will be stripped from the result. + * Besides the valid line ending CRLF a single LF is treated as a + * line ending as well to avoid errors with buggy server. + * + * @param pbis The stream to read from. + * @param maxSize maximum number of bytes to read in one run. + * @param logerr log error messages if true, be silent otherwise. + * + * @return A byte array representing one line of the input or + * null if EOS reached. + */ public static byte[] receive(PushbackInputStream pbis, int maxSize, boolean logerr) { // reuse an existing linebuffer serverByteBuffer readLineBuffer = new serverByteBuffer(80); - serverByteBuffer temp = new serverByteBuffer(80); - int bufferSize = 0, b = 0; + int bufferSize = 0, b = 0; try { - while ((b = pbis.read()) != cr) { - temp.write(b); - if (bufferSize++ > maxSize) break; - } - - // we have catched a possible line end - if (b == cr) { - // maybe a lf follows, read it: - if ((b = pbis.read()) != lf) if (b >= 0) pbis.unread(b); // we push back the byte - } - - byte tempByte; - for(int i=0; i 31 && tempByte != 127)) - readLineBuffer.append(tempByte); + // catch bytes until line end or illegal character reached or buffer full + // resulting readLineBuffer doesn't include CRLF or illegal control chars + while (bufferSize < maxSize) { + b = pbis.read(); + + if ((b > 31 && b != 127) || b == 9) { + // add legal chars to the result + readLineBuffer.append(b); + bufferSize++; + } else if (b == cr) { + // possible beginning of CRLF, check following byte + b = pbis.read(); + if (b == lf) { + // line end catched: break the loop + break; + } else if (b >= 0) { + // no line end: push back the byte, ignore the CR + pbis.unread(b); + } + } else if (b == lf || b < 0) { + // LF without precedent CR: treat as line end of broken servers + // b < 0: EOS + break; + } } - if ((readLineBuffer.length()==0)&&(b == -1)) return null; + // EOS + if (bufferSize == 0 && b == -1) return null; return readLineBuffer.getBytes(); } catch (ClosedByInterruptException e) { if (logerr) serverLog.logSevere("SERVER", "receive interrupted - timeout");