@@ -0,0 +1,221 @@
1+/** forward declarations and general definitions of the QHttp.
2+ * https://github.com/azadkuh/qhttp
3+ *
4+ * @author amir zamani
5+ * @version 2.0.0
6+ * @date 2014-07-11
7+ */
8+
9+#ifndef QHTTPFWD_HPP
10+#define QHTTPFWD_HPP
11+///////////////////////////////////////////////////////////////////////////////
12+#include <QHash>
13+#include <QString>
14+#include <QtGlobal>
15+
16+#include <functional>
17+///////////////////////////////////////////////////////////////////////////////
18+// Qt
19+class QTcpServer;
20+class QTcpSocket;
21+class QLocalServer;
22+class QLocalSocket;
23+
24+// http_parser
25+struct http_parser_settings;
26+struct http_parser;
27+
28+///////////////////////////////////////////////////////////////////////////////
29+namespace qhttp {
30+///////////////////////////////////////////////////////////////////////////////
31+
32+/// QHash/QMap iterators are incompatibility with range for
33+template<class Iterator, class Func>
34+void for_each(Iterator first, Iterator last, Func&& f) {
35+ while ( first != last ) {
36+ f( first );
37+ ++first;
38+ }
39+}
40+
41+/** A map of request or response headers. */
42+class THeaderHash : public QHash<QByteArray, QByteArray>
43+{
44+public:
45+ /** checks for a header item, regardless of the case of the characters. */
46+ bool has(const QByteArray& key) const {
47+ return contains(key.toLower());
48+ }
49+
50+ /** checks if a header has the specified value ignoring the case of the characters. */
51+ bool keyHasValue(const QByteArray& key, const QByteArray& value) const {
52+ if ( !contains(key) )
53+ return false;
54+
55+ const QByteArray& v = QHash<QByteArray, QByteArray>::value(key);
56+ return qstrnicmp(value.constData(), v.constData(), v.size()) == 0;
57+ }
58+
59+ template<class Func>
60+ void forEach(Func&& f) const {
61+ for_each(constBegin(), constEnd(), f);
62+ }
63+};
64+
65+
66+/** Request method enumeration.
67+ * @note Taken from http_parser.h */
68+enum THttpMethod {
69+ EHTTP_DELETE = 0, ///< DELETE
70+ EHTTP_GET = 1, ///< GET
71+ EHTTP_HEAD = 2, ///< HEAD
72+ EHTTP_POST = 3, ///< POST
73+ EHTTP_PUT = 4, ///< PUT
74+ /* pathological */
75+ EHTTP_CONNECT = 5, ///< CONNECT
76+ EHTTP_OPTIONS = 6, ///< OPTIONS
77+ EHTTP_TRACE = 7, ///< TRACE
78+ /* webdav */
79+ EHTTP_COPY = 8, ///< COPY
80+ EHTTP_LOCK = 9, ///< LOCK
81+ EHTTP_MKCOL = 10, ///< MKCOL
82+ EHTTP_MOVE = 11, ///< MOVE
83+ EHTTP_PROPFIND = 12, ///< PROPFIND
84+ EHTTP_PROPPATCH = 13, ///< PROPPATCH
85+ EHTTP_SEARCH = 14, ///< SEARCH
86+ EHTTP_UNLOCK = 15, ///< UNLOCK
87+ EHTTP_BIND = 16, ///< BIND
88+ EHTTP_REBIND = 17, ///< REBIND
89+ EHTTP_UNBIND = 18, ///< UNBIND
90+ EHTTP_ACL = 19, ///< ACL
91+ /* subversion */
92+ EHTTP_REPORT = 20, ///< REPORT
93+ EHTTP_MKACTIVITY = 21, ///< MKACTIVITY
94+ EHTTP_CHECKOUT = 22, ///< CHECKOUT
95+ EHTTP_MERGE = 23, ///< MERGE
96+ /* upnp */
97+ EHTTP_MSEARCH = 24, ///< M-SEARCH
98+ EHTTP_NOTIFY = 25, ///< NOTIFY
99+ EHTTP_SUBSCRIBE = 26, ///< SUBSCRIBE
100+ EHTTP_UNSUBSCRIBE = 27, ///< UNSUBSCRIBE
101+ /* RFC-5789 */
102+ EHTTP_PATCH = 28, ///< PATCH
103+ EHTTP_PURGE = 29, ///< PURGE
104+ /* CalDAV */
105+ EHTTP_MKCALENDAR = 30, ///< MKCALENDAR
106+ /* RFC-2068, section 19.6.1.2 */
107+ EHTTP_LINK = 31, ///< LINK
108+ EHTTP_UNLINK = 32, ///< UNLINK
109+};
110+
111+/** HTTP status codes. */
112+enum TStatusCode {
113+ ESTATUS_CONTINUE = 100,
114+ ESTATUS_SWITCH_PROTOCOLS = 101,
115+ ESTATUS_OK = 200,
116+ ESTATUS_CREATED = 201,
117+ ESTATUS_ACCEPTED = 202,
118+ ESTATUS_NON_AUTHORITATIVE_INFORMATION = 203,
119+ ESTATUS_NO_CONTENT = 204,
120+ ESTATUS_RESET_CONTENT = 205,
121+ ESTATUS_PARTIAL_CONTENT = 206,
122+ ESTATUS_MULTI_STATUS = 207,
123+ ESTATUS_MULTIPLE_CHOICES = 300,
124+ ESTATUS_MOVED_PERMANENTLY = 301,
125+ ESTATUS_FOUND = 302,
126+ ESTATUS_SEE_OTHER = 303,
127+ ESTATUS_NOT_MODIFIED = 304,
128+ ESTATUS_USE_PROXY = 305,
129+ ESTATUS_TEMPORARY_REDIRECT = 307,
130+ ESTATUS_BAD_REQUEST = 400,
131+ ESTATUS_UNAUTHORIZED = 401,
132+ ESTATUS_PAYMENT_REQUIRED = 402,
133+ ESTATUS_FORBIDDEN = 403,
134+ ESTATUS_NOT_FOUND = 404,
135+ ESTATUS_METHOD_NOT_ALLOWED = 405,
136+ ESTATUS_NOT_ACCEPTABLE = 406,
137+ ESTATUS_PROXY_AUTHENTICATION_REQUIRED = 407,
138+ ESTATUS_REQUEST_TIMEOUT = 408,
139+ ESTATUS_CONFLICT = 409,
140+ ESTATUS_GONE = 410,
141+ ESTATUS_LENGTH_REQUIRED = 411,
142+ ESTATUS_PRECONDITION_FAILED = 412,
143+ ESTATUS_REQUEST_ENTITY_TOO_LARGE = 413,
144+ ESTATUS_REQUEST_URI_TOO_LONG = 414,
145+ ESTATUS_REQUEST_UNSUPPORTED_MEDIA_TYPE = 415,
146+ ESTATUS_REQUESTED_RANGE_NOT_SATISFIABLE = 416,
147+ ESTATUS_EXPECTATION_FAILED = 417,
148+ ESTATUS_INTERNAL_SERVER_ERROR = 500,
149+ ESTATUS_NOT_IMPLEMENTED = 501,
150+ ESTATUS_BAD_GATEWAY = 502,
151+ ESTATUS_SERVICE_UNAVAILABLE = 503,
152+ ESTATUS_GATEWAY_TIMEOUT = 504,
153+ ESTATUS_HTTP_VERSION_NOT_SUPPORTED = 505
154+};
155+
156+/** The backend of QHttp library. */
157+enum TBackend {
158+ ETcpSocket = 0, ///< client / server work on top of TCP/IP stack. (default)
159+ ESslSocket = 1, ///< client / server work on SSL/TLS tcp stack. (not implemented yet)
160+ ELocalSocket = 2 ///< client / server work on local socket (unix socket).
161+};
162+
163+///////////////////////////////////////////////////////////////////////////////
164+namespace server {
165+///////////////////////////////////////////////////////////////////////////////
166+class QHttpServer;
167+class QHttpConnection;
168+class QHttpRequest;
169+class QHttpResponse;
170+
171+// Privte classes
172+class QHttpServerPrivate;
173+class QHttpConnectionPrivate;
174+class QHttpRequestPrivate;
175+class QHttpResponsePrivate;
176+
177+using TServerHandler = std::function<void (QHttpRequest*, QHttpResponse*)>;
178+
179+///////////////////////////////////////////////////////////////////////////////
180+} // namespace server
181+///////////////////////////////////////////////////////////////////////////////
182+namespace client {
183+///////////////////////////////////////////////////////////////////////////////
184+class QHttpClient;
185+class QHttpRequest;
186+class QHttpResponse;
187+
188+// Private classes
189+class QHttpClientPrivate;
190+class QHttpRequestPrivate;
191+class QHttpResponsePrivate;
192+///////////////////////////////////////////////////////////////////////////////
193+} // namespace client
194+///////////////////////////////////////////////////////////////////////////////
195+#ifdef Q_OS_WIN
196+# if defined(QHTTP_EXPORT)
197+# define QHTTP_API __declspec(dllexport)
198+# else
199+# define QHTTP_API __declspec(dllimport)
200+# endif
201+#else
202+# define QHTTP_API
203+#endif
204+
205+
206+#if QHTTP_MEMORY_LOG > 0
207+# define QHTTP_LINE_LOG fprintf(stderr, "%s(): obj = %p @ %s[%d]\n",\
208+ __FUNCTION__, this, __FILE__, __LINE__);
209+#else
210+# define QHTTP_LINE_LOG
211+#endif
212+
213+#if QHTTP_MEMORY_LOG > 1
214+# define QHTTP_LINE_DEEPLOG QHTTP_LINE_LOG
215+#else
216+# define QHTTP_LINE_DEEPLOG
217+#endif
218+///////////////////////////////////////////////////////////////////////////////
219+} // namespace qhttp
220+///////////////////////////////////////////////////////////////////////////////
221+#endif // define QHTTPFWD_HPP