in httpcore5/src/main/java/org/apache/hc/core5/http/impl/io/SessionInputBufferImpl.java [240:291]
public int readLine(final CharArrayBuffer charBuffer, final InputStream inputStream) throws IOException {
Args.notNull(charBuffer, "Char array buffer");
Args.notNull(inputStream, "Input stream");
int readLen = 0;
boolean retry = true;
while (retry) {
// attempt to find end of line (LF)
int pos = -1;
for (int i = this.bufferPos; i < this.bufferLen; i++) {
if (this.buffer[i] == Chars.LF) {
pos = i;
break;
}
}
if (this.maxLineLen > 0) {
final int currentLen = this.lineBuffer.length()
+ (pos >= 0 ? pos : this.bufferLen) - this.bufferPos;
if (currentLen >= this.maxLineLen) {
throw new MessageConstraintException("Maximum line length limit exceeded");
}
}
if (pos != -1) {
// end of line found.
if (this.lineBuffer.isEmpty()) {
// the entire line is preset in the read buffer
return lineFromReadBuffer(charBuffer, pos);
}
retry = false;
final int len = pos + 1 - this.bufferPos;
this.lineBuffer.append(this.buffer, this.bufferPos, len);
this.bufferPos = pos + 1;
} else {
// end of line not found
if (hasBufferedData()) {
final int len = this.bufferLen - this.bufferPos;
this.lineBuffer.append(this.buffer, this.bufferPos, len);
this.bufferPos = this.bufferLen;
}
readLen = fillBuffer(inputStream);
if (readLen == -1) {
retry = false;
}
}
}
if (readLen == -1 && this.lineBuffer.isEmpty()) {
// indicate the end of stream
return -1;
}
return lineFromLineBuffer(charBuffer);
}