#pragma once #include #include #include #include #include "HttpHeader.h" namespace Incart::Net::WebApi { class HttpPacket { protected: QString m_httpVersion; QList m_headers; QString m_body = ""; public: HttpPacket(const QString& httpVersion_) : m_httpVersion(httpVersion_) { } virtual ~HttpPacket() { } void addHeader(const QString& name, const QString& value) { m_headers.append(HttpHeader{name, value}); } void addBody(QByteArray& data) { m_body.append(data); } void addBody(const QString& body) { m_body += body; } QString getHttpVersion() { return m_httpVersion; } QList getHeaders() { return m_headers; } QString getBody() { return m_body; } virtual bool parseStartLine(const QString& text) = 0; virtual QString convertStartLineToString() = 0; bool parse(const QString& httpText) { QString inputText = httpText; QTextStream stream(&inputText, QIODevice::ReadOnly); QString startLine = stream.readLine(); if (!parseStartLine(startLine)) { return false; } while (!stream.atEnd()) { QString str = stream.readLine(); if (str == "") { break; } else { HttpHeader header = HttpHeader::parse(str); if (!header.name.isEmpty()) { m_headers.append(header); } } } m_body = inputText.mid(static_cast(stream.pos()), static_cast(inputText.size() - stream.pos())); return true; } QString toString() { QString text = convertStartLineToString() + "\r\n"; for (size_t i = 0; i < m_headers.size(); ++i) { text.append(m_headers[i].name + ": " + m_headers[i].value + "\r\n"); } text += "\r\n"; text += m_body; return text; } QString toBytes() { return toString().toUtf8(); } void clear() { m_headers.clear(); m_body.clear(); } }; } // namespace Incart::Net::WebApi