acl  3.5.3.0
http_mime.hpp
浏览该文件的文档.
1 #pragma once
2 #include "../acl_cpp_define.hpp"
3 #include <vector>
4 #include <list>
5 #include "../stdlib/dbuf_pool.hpp"
6 #include "../stdlib/string.hpp"
7 #include "../mime/mime_attach.hpp"
8 #include "http_type.hpp"
9 
10 #if !defined(ACL_MIME_DISABLE)
11 
12 struct MIME_STATE;
13 struct MIME_NODE;
14 
15 namespace acl {
16 
17 /**
18  * http mime 结点类,继承关系:
19  * http_mime_node : mime_attach : mime_node
20  * 常用函数功能:
21  * http_mime_node::get_mime_type 获得该结点的类型
22  * mime_node::get_name: 获得该结点的名称
23  * mime_attach::get_filename: 当结点为上传文件类型时,此函数
24  * 获得上传文件的文件名
25  * http_mime_node::get_value: 当结点为参数类型时,此函数获得
26  * 参数值
27  */
29 {
30 public:
31  /**
32  * @param path {const char*} 原始文件存放路径,不能为空
33  * @param node {MIME_NODE*} 对应的 MIME 结点,非空
34  * @param decodeIt {bool} 是否对 MIME 结点的头部数据
35  * 或数据体数据进行解码
36  * @param toCharset {const char*} 本机的字符集
37  * @param off {off_t} 偏移数据位置
38  */
39  http_mime_node(const char* path, const MIME_NODE* node,
40  bool decodeIt = true, const char* toCharset = "gb2312",
41  off_t off = 0);
42  ~http_mime_node(void);
43 
44  /**
45  * 获得该结点的类型
46  * @return {http_mime_t}
47  */
48  http_mime_t get_mime_type(void) const;
49 
50  /**
51  * 当 get_mime_type 返回的类型为 HTTP_MIME_PARAM 时,可以
52  * 调用此函数获得参数值;参数名可以通过基类的 get_name() 获得
53  * @return {const char*} 返回 NULL 表示参数不存在
54  */
55  const char* get_value(void) const;
56 
57 protected:
58 
59 private:
60  http_mime_t mime_type_;
61  char* param_value_;
62 
63  void load_param(const char* path);
64 };
65 
66 //////////////////////////////////////////////////////////////////////////
67 
68 /**
69  * http mime 解析器,该解析器为流式解析器,用户在使用时可以每次仅输入
70  * 部分数据给 update 函数,当该函数返回 true 时表示解析完成且解析正确
71  */
73 {
74 public:
75  /**
76  * 构建函数
77  * @param boundary {const char*} 分隔符,不能为空
78  * @param local_charset {const char*} 本地字符集,非空时会自动将
79  * 参数内容转为本地字符集
80  */
81  http_mime(const char* boundary, const char* local_charset = "gb2312");
82  ~http_mime(void);
83 
84  /**
85  * 设置 MIME 数据的存储路径,当分析完 MIME 数据后,如果想要
86  * 从中提取数据,则必须给出该 MIME 的原始数据的存储位置,否则
87  * 无法获得相应数据,即 save_xxx/get_nodes/get_node 函数均无法
88  * 正常使用
89  * @param path {const char*} 文件路径名, 如果该参数为空, 则不能
90  * 获得数据体数据, 也不能调用 save_xxx 相关的接口
91  */
92  void set_saved_path(const char* path);
93 
94  /**
95  * 调用此函数进行流式方式解析数据体内容
96  * @param data {const char*} 数据体(可能是数据头也可能是数据体,
97  * 并且不必是完整的数据行)
98  * @param len {size_t} data 数据长度
99  * @return {bool} 针对 multipart 数据, 返回 true 表示解析完毕;
100  * 对于非 multipart 文件, 该返回值永远为 false, 没有任何意义,
101  * 需要调用者自己判断数据体的结束位置
102  * 注意: 调用完此函数后一定需要调用 update_end 函数通知解析器
103  * 解析完毕
104  */
105  bool update(const char* data, size_t len);
106 
107  /**
108  * 获得所有的 MIME 结点
109  * @return {const std::list<http_mimde_node*>&}
110  */
111  const std::list<http_mime_node*>& get_nodes(void) const;
112 
113  /**
114  * 根据变量名取得 HTTP MIME 结点
115  * @param name {const char*} 变量名
116  * @return {const http_mime_node*} 返回空则说明对应变量名的结点
117  * 不存在
118  */
119  const http_mime_node* get_node(const char* name) const;
120 
121 private:
122  string boundary_;
123  string save_path_;
124  off_t off_;
125  MIME_STATE* mime_state_;
126  std::list<http_mime_node*> mime_nodes_;
127  char local_charset_[32];
128  bool decode_on_;
129  bool parsed_;
130 };
131 
132 } // namespace acl
133 
134 #endif // !defined(ACL_MIME_DISABLE)
HTTP_API void const char * name
Definition: lib_http.h:620
http_mime_t
Definition: http_type.hpp:78
#define ACL_CPP_API