http_define.h 7.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #pragma once
  2. #include <vector>
  3. #include <map>
  4. #include <regex>
  5. #include "define.h"
  6. #include "yutil/file.h"
  7. #include "ybase/buffer.h"
  8. #include "ybase/environment.h"
  9. #define POINT_QUEUE_REQUEST_CLEAR_MAX 1000
  10. #define POINT_QUEUE_REQUEST_CLEAR_SEC 60
  11. #define POINT_QUEUE_RESPONSE_CLEAR_MAX 1000
  12. #define POINT_QUEUE_RESPONSE_CLEAR_SEC 60
  13. #define POINT_QUEUE_ROUTER_CLEAR_MAX 1000
  14. #define POINT_QUEUE_ROUTER_CLEAR_SEC 60
  15. #define POINT_QUEUE_REQPACK_CLEAR_MAX 1000
  16. #define POINT_QUEUE_REQPACK_CLEAR_SEC 60
  17. // http_agent 调试日志打印
  18. #define HTTP_AGENT_DEBUG_PRINT 0
  19. // http_agent 生产日志打印
  20. #define HTTP_AGENT_PRINT 0
  21. // http_server 调试日志打印
  22. #define HTTP_SERVER_DEBUG_PRINT 0
  23. // http_server 生产日志打印
  24. #define HTTP_SERVER_PRINT 0
  25. // http_router 生产日志打印
  26. #define HTTP_ROUTER_PRINT 0
  27. // http_interceptor 生产日志打印
  28. #define HTTP_INTERCEPTOR_PRINT 0
  29. namespace ylib
  30. {
  31. namespace network
  32. {
  33. namespace http
  34. {
  35. class agent;
  36. class website;
  37. // 临时接收
  38. struct temp_recv
  39. {
  40. temp_recv()
  41. {
  42. agent_connid = 0;
  43. agent_ssl = false;
  44. }
  45. void clear()
  46. {
  47. agent_connid = 0;
  48. agent_ssl = false;
  49. url.clear();
  50. ipaddress_port.clear();
  51. host.clear();
  52. }
  53. // 接收数据
  54. ylib::buffer data;
  55. // 代理ID
  56. uint64 agent_connid;
  57. // 代理SSL
  58. bool agent_ssl;
  59. // URL
  60. std::string url;
  61. // 代理连接IP及端口
  62. std::string ipaddress_port;
  63. // Host
  64. std::string host;
  65. // 缓存路径
  66. ylib::file_io cache_file;
  67. };
  68. // 代理
  69. struct proxy
  70. {
  71. proxy()
  72. {
  73. remote_port = 0;
  74. ssl = false;
  75. }
  76. // 拦截地址正则
  77. std::regex src_express;
  78. // 拦截地址字符串
  79. std::string src_str;
  80. // 目标地址
  81. std::string dst;
  82. // 请求URL
  83. std::string remote_url;
  84. // 请求地址
  85. std::string remote_ipaddress;
  86. // 请求端口
  87. ushort remote_port;
  88. // 主机
  89. std::string host;
  90. // 附加协议头
  91. std::map<std::string, std::string> request_headers;
  92. std::map<std::string, std::string> response_headers;
  93. // SSL
  94. bool ssl;
  95. };
  96. // httpserver代理后连接附加数据
  97. struct httpserver_proxy_extra
  98. {
  99. httpserver_proxy_extra()
  100. {
  101. agent = nullptr;
  102. connid = 0;
  103. index = 45854;
  104. }
  105. void* agent;
  106. uint64 connid;
  107. uint64 index;
  108. };
  109. struct website_info
  110. {
  111. website_info()
  112. {
  113. gzip = false;
  114. download_maxbaud = 0;
  115. }
  116. // 根目录
  117. std::string rootdir;
  118. // GZIP
  119. bool gzip;
  120. // 默认编码方式
  121. std::string default_codec;
  122. // 带宽限制
  123. uint32 download_maxbaud;
  124. };
  125. /*表单信息*/
  126. struct form_info
  127. {
  128. form_info()
  129. {
  130. start = -1;
  131. length = -1;
  132. }
  133. std::string disposition;
  134. std::string content_type;
  135. std::string name;
  136. std::string filename;
  137. int64 start;
  138. int64 length;
  139. ylib::buffer data;
  140. };
  141. class controller;
  142. //请求类型
  143. enum content_type
  144. {
  145. CT_FORM = 0, //表单: application/x-www-CT_FORM-urlencoded
  146. CT_JSON = 1, //CT_JSON: application/CT_JSON
  147. CT_TEXT = 2, //文本: text/plain
  148. CT_NIL = 3, //无
  149. CT_ALL = 4 //所有
  150. };
  151. /*HTTP请求类型*/
  152. enum method
  153. {
  154. GET = 0,
  155. POST = 1,
  156. PUT = 2,
  157. DEL = 3,
  158. OTHER = 4,
  159. HEAD = 5,
  160. ALL = 100
  161. };
  162. inline std::string method_to_string(enum method m) {
  163. switch (m) {
  164. case GET:
  165. return "GET";
  166. case POST:
  167. return "POST";
  168. case PUT:
  169. return "PUT";
  170. case DEL:
  171. return "DEL";
  172. case OTHER:
  173. return "OTHER";
  174. case ALL:
  175. return "ALL";
  176. default:
  177. return "unknown";
  178. }
  179. return "";
  180. };
  181. /*控制器内返回结果*/
  182. enum response_type
  183. {
  184. RT_OK, //成功或已处理
  185. RT_500, //服务器内部错误
  186. RT_406, //服务器解析客户端数据失败或格式不正确拒绝解析
  187. RT_401 //需要鉴权,无权限
  188. };
  189. //控制器指针
  190. typedef response_type(network::http::controller::* HTTP_CTR_FUNCTION)();
  191. /*SSL验证类型*/
  192. enum ssl_verify_type
  193. {
  194. // 完全忽略验证证书的结果。当握手必须完成的话,就选中这个选项。其实真正有证书的人很少,尤其是在中国,那么如果 SSL 运用于一些免费的服务,比如 EMAIL 的时候,SERVER 端最好采用这个模式。
  195. SVT_VERIFY_NONE = 0x00,
  196. // 希望验证对方的证书。这个是最一般的模式。对 CLIENT 来说,如果设置了这样的模式,验证SERVER的证书出了任何错误,SSL 握手都告吹。对 SERVER 来说,如果设置了这样的模式,CLIENT 倒不一定要把自己的证书交出去。如果 CLIENT 没有交出证书,SERVER 自己决定下一步怎么做。
  197. SVT_VERIFY_PEER = 0x01,
  198. // 这是 SERVER 使用的一种模式,在这种模式下, SERVER 会向 CLIENT 要证书。如果 CLIENT 不给,SSL 握手告吹
  199. SVT_VERIFY_FAIL_IF_NO_PEER_CERT = 0x02,
  200. // 这是仅能使用在 SSL SESSION RENEGOTIATION 阶段的一种方式。如果不是用这个模式的话,那么在 RENEGOTIATION 的时候,CLIENT 都要把自己的证书送给 SERVER,然后做一番分析。这个过程很消耗 CPU 时间的,而这个模式则不需要 CLIENT 在 RENEGOTIATION 的时候重复送自己的证书了。
  201. SVT_VERIFY_CLIENT_ONCE = 0x03
  202. };
  203. }
  204. }
  205. }