#pragma once #include "JDefines.h" #include "JTerminal.h" #include "HttpHeader.h" namespace Incart::Net::WebApi { class ParsingHttp { protected: QString m_startLine; QList m_headers; QByteArray m_body; QByteArray m_http; public: void clear() { m_startLine.clear(); m_headers.clear(); m_body.clear(); m_http.clear(); } void operator()(QByteArray& http) { clear(); m_http = http; } void operator()(QString type, QString uri) { clear(); m_startLine = type + " " + uri + " " + "HTTP/1.1"; } void operator()(QString response) { clear(); m_startLine = "HTTP/1.1 " + response; m_headers.clear(); m_body.clear(); m_http.clear(); } void addHeader(const QString& name, const QString& value) { m_headers.append(HttpHeader{name, value}); } void addBody(QByteArray& data) { m_body.append(data); } void assemble() { m_http.append(m_startLine.toLocal8Bit() + "\r\n"); for (size_t i = 0; i < static_cast(m_headers.size()); ++i) { m_http.append(m_headers[i].name.toLocal8Bit() + ": " + m_headers[i].value.toLocal8Bit() + "\r\n"); } m_http.append("\r\n"); m_http.append(m_body); } void disassemble() { QTextStream stream(m_http,QIODevice::ReadOnly); m_startLine = stream.readLine(); 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 = m_http.mid(static_cast(stream.pos()), static_cast(m_http.size() - stream.pos())); } QString& getStartLine() { return m_startLine; } QList& getHeaders() { return m_headers; } QByteArray& getBody() { return m_body; } QByteArray& getHttp() { return m_http; } friend Common::JTerminal& operator <<(Common::JTerminal& terminal, const ParsingHttp& resp) { terminal << "\n{ // Http /1.1 \n"; terminal << " " << resp.m_startLine << "\n"; for (size_t i = 0; i < static_cast(resp.m_headers.size()); ++i) { terminal << " " << (resp.m_headers[i].name + ": " + resp.m_headers[i].value) << "\n"; } terminal << " " << QString(resp.m_body) << "\n"; terminal << "\r}"; return terminal; } QString toString() { /* QString text = "\n{ // Http /1.1 \n"; text += " " + m_startLine + "\n"; for (size_t i = 0; i < m_headers.size(); ++i) { text += " " + (m_headers[i].name + ": " + m_headers[i].value) + "\n"; } text += " " + QString(m_body) + "\n"; text += "\r}"; */ QString text(m_http); return text; } }; } // namespace Incart::Net::WebApi