ImagingTools Core SDK
CHttpRequest.h
1// SPDX-License-Identifier: LGPL-2.1-or-later OR GPL-2.0-or-later OR GPL-3.0-or-later OR LicenseRef-ImtCore-Commercial
2#pragma once
3
4
5// Qt includes
6#include <QtCore/QUrl>
7#include <QtNetwork/QHostAddress>
8
9// ImtCore includes
10#include <imtrest/IRequest.h>
11#include <imtrest/IRequestServlet.h>
12#include <imtrest/http_parser.h>
13
14
15namespace imtrest
16{
17
18
19class CHttpRequest: public QObject, virtual public IRequest
20{
21 Q_OBJECT
22public:
23 enum MethodType
24 {
25 MT_UNKNOWN = 0,
26 MT_GET = 1,
27 MT_PUT = 2,
28 MT_POST = 4,
29 MT_DELETE = 8,
30 MT_HEAD = 16,
31 MT_OPTIONS = 32,
32 MT_PATCH = 64
33 };
34
35 CHttpRequest(const IRequestServlet& requestHandler, const IProtocolEngine& engine);
36
37 QByteArrayList GetHeaders() const;
38 QByteArray GetHeaderValue(const QByteArray& headerType) const;
39 QUrl GetUrl() const;
40 virtual MethodType GetMethodType() const;
41 virtual QByteArray GetBody() const override;
42 QHostAddress GetRemoteAddress() const;
43
44 void SetHeader(const QByteArray& headerId, const QByteArray& value);
45 void SetMethodType(const MethodType& methodType);
46 void SetBody(const QByteArray& body);
47 void SetCommandId(const QByteArray& commandId);
48
49 static int OnStartMessage(http_parser* httpParser);
50 static int OnUrl(http_parser* httpParser, const char* at, size_t length);
51 static int OnStatus(http_parser* httpParser, const char *at, size_t length);
52 static int OnHeaderField(http_parser* httpParser, const char *at, size_t length);
53 static int OnHeaderValue(http_parser* httpParser, const char *at, size_t length);
54 static int OnHeadersComplete(http_parser* httpParser);
55 static int OnBody(http_parser* httpParser, const char *at, size_t length);
56 static int OnMessageComplete(http_parser* httpParser);
57 static int OnChunkHeader(http_parser* httpParser);
58 static int OnChunkComplete(http_parser* httpParser);
59
60 // reimplemented (IRequest)
61 virtual RequestState GetState() const override;
62 virtual QByteArray GetCommandId() const override;
63 virtual CommandParams GetCommandParams() const override;
64 virtual QByteArray GetRequestId() const override;
65
66 // reimplemented (INetworkObject)
67 virtual const IProtocolEngine& GetProtocolEngine() const override;
68
69 // reimplemented (istd::IChangeable)
70 virtual bool ResetData(CompatibilityMode mode = CM_WITHOUT_REFS) override;
71
72public:
73 virtual bool ParseDeviceData(QIODevice& device) override;
74 virtual bool ExecuteHttpParser(const QByteArray& data, const QObject* socketObjectPtr);
75
76private:
77 static bool ParseUrl(const char *at, size_t length, bool connect, QUrl& url);
78
79protected:
80 http_parser m_httpParser;
81 QHostAddress m_remoteAddress;
82 QUrl m_url;
83 RequestState m_state;
84 QByteArray m_body;
85 QByteArray m_data;
86
87 const IRequestServlet& m_requestHandler;
88 const IProtocolEngine& m_engine;
89 QObject* m_socket;
90
91 typedef QMap<QByteArray, QByteArray> HeaderMap;
92 HeaderMap m_headers;
93
94 QByteArray m_lastHeader;
95
96 QByteArray m_requestId;
97};
98
99
100} // namespace imtrest
101
102