//extract all HTTP request response headers locally and return the size of the headers
private int extractHttpHeaders(byte[] httpHeader) {
final String delimiter = ": ";
List<StringBuilder> headers = new ArrayList<StringBuilder>();
for (int i=0; i<httpHeader.length; i++) {
StringBuilder line = new StringBuilder();
for (; i<httpHeader.length && (char)httpHeader[i]!='\n'; i++) {
line.append((char)httpHeader[i]);
}
if (i==httpHeader.length) {
//partial header, full headers have not been received yet
//this will break out of the loop
}
else if (line.length()==0 || (line.length()==1 && (char)httpHeader[i-1]=='\r')) {
//all headers received
httpHeaders.length = i+1;
return i+1;
} else {
//line has a header, add it
int colonAt = line.indexOf(delimiter);
if (colonAt != -1) {
String value = line.substring(colonAt+delimiter.length(), line.charAt(line.length()-1)=='\r' ? line.length()-1 : line.length()).trim();
if (value.length() > 0)
httpHeaders.put(line.substring(0,colonAt), value);
}
}
}
//partial header, full headers have not been received yet
httpHeaders.clear();
return -1; //full headers have not been received yet
}
The only difference is unconditionally clearing the headers map if we don't see a blank line in the headers. The correct termination of the headers is a single CRLF pair (blank line). If that has not been seen, then it is a partial header, even though each line in the partial header may have been fully received.
No comments:
Post a Comment