bool client_handler::read_message(handler *h, buffer &buf) { int plen = buf.length(); Log::d("read_message1"); if (serv->read_chunk(h, &buf)) { Log::d("fd(" + inttostr(h->fd.get_fd()) + ") asked for disconnection"); disconnect(); return false; } Log::d("read_message2"); if (message_type == NOT_EVALUATED) { // recalc message len int lb = find_double_line_break(buf.string_data(), plen); if (lb != -1) { //Log::d("plen is " + inttostr(plen) + ", lb is " + inttostr(lb) + " in \n\"" + buf.string_data() + "\""); std::string content_length_str; int len; if (extract_header(buf.string_data(), lb, "Content-Length", content_length_str)) { len = strtoint(content_length_str); message_type = VIA_CONTENT_LENGTH; } else { len = 0; message_type = extract_header(buf.string_data(), lb, "Transfer-Encoding", content_length_str) ? VIA_TRANSFER_ENCODING : WITHOUT_BODY; } message_len = len + lb; } } if (message_type != HTTPS_MODE) { Log::d("read_message(" + inttostr(buf.length()) + ", " + inttostr(message_len) + ")"); } if (message_type == NOT_EVALUATED) { return false; } if (message_type == VIA_TRANSFER_ENCODING) { while (buf.length() > message_len) { /*Log::d("kek is " + inttostr((int) buf.string_data()[message_len - 1]) + " " + inttostr((int) buf.string_data()[message_len]) + " " + inttostr((int) buf.string_data()[message_len + 1]));*/ if (buf.string_data()[message_len] == '0') { return true; } size_t linebreak = buf.string_data().find("\r\n", (size_t) message_len); if (linebreak != std::string::npos) { std::string chunklen = buf.string_data().substr((size_t) message_len, linebreak - message_len); Log::d("Next chunk len is " + chunklen); message_len += chunklen.length() + hextoint(chunklen) + 4; } else { break; } } return false; } else { return buf.length() == message_len; } }