qhttpfwd.hpp 7.2 KB

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