bool RequestParser::parseBody(Request& req, ReplyPtr reply, Buffer::iterator& begin, Buffer::iterator end) { if (req.webSocketVersion >= 0) { Request::State state = parseWebSocketMessage(req, reply, begin, end); if (state == Request::Error) reply->consumeData(begin, begin, Request::Error); return state != Request::Partial; } else { ::int64_t thisSize = std::min((::int64_t)(end - begin), remainder_); Buffer::iterator thisBegin = begin; Buffer::iterator thisEnd = begin + thisSize; remainder_ -= thisSize; begin = thisEnd; bool endOfRequest = remainder_ == 0; reply->consumeData(thisBegin, thisEnd, endOfRequest ? Request::Complete : Request::Partial); if (reply->status() == Reply::request_entity_too_large) return true; else return endOfRequest; } }
RequestParser::ParseResult RequestParser::parseBody(Request& req, ReplyPtr reply, Buffer::iterator& begin, Buffer::iterator end) { if (req.type == Request::WebSocket) { Request::State state = parseWebSocketMessage(req, reply, begin, end); if (state == Request::Error) reply->consumeData(begin, begin, Request::Error); return state == Request::Partial ? ReadMore : Done; } else if (req.type == Request::TCP) { ::int64_t thisSize = (::int64_t)(end - begin); Buffer::iterator thisBegin = begin; Buffer::iterator thisEnd = begin + thisSize; begin = thisEnd; bool canReadMore = reply->consumeData(thisBegin, thisEnd, Request::Partial); if (reply->status() == Reply::request_entity_too_large) return Done; else if (canReadMore) return ReadMore; else return NotReady; } else { ::int64_t thisSize = std::min((::int64_t)(end - begin), remainder_); Buffer::iterator thisBegin = begin; Buffer::iterator thisEnd = begin + thisSize; remainder_ -= thisSize; begin = thisEnd; bool endOfRequest = remainder_ == 0; bool canReadMore = reply->consumeData(thisBegin, thisEnd, endOfRequest ? Request::Complete : Request::Partial); if (reply->status() == Reply::request_entity_too_large) return Done; else if (endOfRequest) return Done; else if (canReadMore) return ReadMore; else return NotReady; } }