#pragma once
#include "impl_forwards.h"
#include <trantor/utils/NonCopyable.h>
#include <trantor/net/TcpConnection.h>
#include <trantor/utils/MsgBuffer.h>
#include <list>
#include <mutex>
namespace drogon
{
class HttpResponseParser : public trantor::NonCopyable
{
  public:
    enum class HttpResponseParseStatus
    {
        kExpectResponseLine,
        kExpectHeaders,
        kExpectBody,
        kExpectChunkLen,
        kExpectChunkBody,
        kExpectLastEmptyChunk,
        kExpectClose,
        kGotAll,
    };
    explicit HttpResponseParser(const trantor::TcpConnectionPtr &connPtr);
    bool parseResponse(trantor::MsgBuffer *buf);
    bool parseResponseOnClose();
    bool gotAll() const
    {
        return status_ == HttpResponseParseStatus::kGotAll;
    }
    void setForHeadMethod()
    {
        parseResponseForHeadMethod_ = true;
    }
    void reset();
    const HttpResponseImplPtr &responseImpl() const
    {
        return responsePtr_;
    }
  private:
    bool processResponseLine(const char *begin, const char *end);
    HttpResponseParseStatus status_;
    HttpResponseImplPtr responsePtr_;
    bool parseResponseForHeadMethod_{false};
    size_t leftBodyLength_{0};
    size_t currentChunkLength_{0};
    std::weak_ptr<trantor::TcpConnection> conn_;
};
}  