/** Parses the HTTP response section, determining the body offset and setting the charset field */
  private void parseResponse() {
    // int base;
    boolean parsingContentType = false;

    bss.init(responseBase, responseOffset, responseOffset + responseLength);

    if (!ByteScan.SkipToWhitespace(bss)) return;

    if (!ByteScan.SkipWhitespace(bss)) return;

    ByteScan.ParseInt(bss);
    responseCode = bss.ival;

    while (!bss.eob()) {

      if (bss.buf[bss.offset] == '\n') {
        if (parsingContentType) {
          tmpBss.init(bss.buf, bss.mark, bss.offset);
          parseContentType(tmpBss);
          parsingContentType = false;
        }
        if (bss.offset < bss.end - 2) {
          if (bss.buf[bss.offset + 1] == '\n') {
            responseBodyOffset = bss.offset + 2;
            bss.offset += 2;
            break;
          } else if (bss.buf[bss.offset + 1] == '\r' && bss.buf[bss.offset + 2] == '\n') {
            responseBodyOffset = bss.offset + 3;
            bss.offset += 3;
            break;
          }
        } else {
          responseBodyOffset = bss.end;
          bss.offset = bss.end;
          break;
        }
        bss.offset++;
        bss.mark();
      } else if (bss.buf[bss.offset] == ':') {
        tmpBss.init(bss.buf, bss.mark, bss.offset);
        if (ByteScan.Equals(tmpBss, contentTypeChars)) parsingContentType = true;
        bss.offset++;
        bss.mark();
      } else bss.offset++;
    }

    responseBodyOffset = bss.offset;

    if (contentType == null || contentType.startsWith("text")) findAndParseContentType(bss);
  }