diff options
Diffstat (limited to 'src/microhttpd/postprocessor.h')
-rw-r--r-- | src/microhttpd/postprocessor.h | 246 |
1 files changed, 246 insertions, 0 deletions
diff --git a/src/microhttpd/postprocessor.h b/src/microhttpd/postprocessor.h new file mode 100644 index 00000000..df681ce9 --- /dev/null +++ b/src/microhttpd/postprocessor.h | |||
@@ -0,0 +1,246 @@ | |||
1 | /* | ||
2 | This file is part of libmicrohttpd | ||
3 | Copyright (C) 2007-2022 Daniel Pittman, Christian Grothoff, and Evgeny Grin | ||
4 | |||
5 | This library is free software; you can redistribute it and/or | ||
6 | modify it under the terms of the GNU Lesser General Public | ||
7 | License as published by the Free Software Foundation; either | ||
8 | version 2.1 of the License, or (at your option) any later version. | ||
9 | |||
10 | This library is distributed in the hope that it will be useful, | ||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of | ||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
13 | Lesser General Public License for more details. | ||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public | ||
16 | License along with this library; if not, write to the Free Software | ||
17 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA | ||
18 | */ | ||
19 | |||
20 | /** | ||
21 | * @file postprocessor.h | ||
22 | * @brief Declarations for parsing POST data | ||
23 | * @author Christian Grothoff | ||
24 | * @author Karlson2k (Evgeny Grin) | ||
25 | */ | ||
26 | |||
27 | #ifndef MHD_POSTPROCESSOR_H | ||
28 | #define MHD_POSTPROCESSOR_H 1 | ||
29 | #include "internal.h" | ||
30 | |||
31 | /** | ||
32 | * States in the PP parser's state machine. | ||
33 | */ | ||
34 | enum PP_State | ||
35 | { | ||
36 | /* general states */ | ||
37 | PP_Error, | ||
38 | PP_Done, | ||
39 | PP_Init, | ||
40 | PP_NextBoundary, | ||
41 | |||
42 | /* url encoding-states */ | ||
43 | PP_ProcessKey, | ||
44 | PP_ProcessValue, | ||
45 | PP_Callback, | ||
46 | |||
47 | /* post encoding-states */ | ||
48 | PP_ProcessEntryHeaders, | ||
49 | PP_PerformCheckMultipart, | ||
50 | PP_ProcessValueToBoundary, | ||
51 | PP_PerformCleanup, | ||
52 | |||
53 | /* nested post-encoding states */ | ||
54 | PP_Nested_Init, | ||
55 | PP_Nested_PerformMarking, | ||
56 | PP_Nested_ProcessEntryHeaders, | ||
57 | PP_Nested_ProcessValueToBoundary, | ||
58 | PP_Nested_PerformCleanup | ||
59 | |||
60 | }; | ||
61 | |||
62 | |||
63 | enum RN_State | ||
64 | { | ||
65 | /** | ||
66 | * No RN-preprocessing in this state. | ||
67 | */ | ||
68 | RN_Inactive = 0, | ||
69 | |||
70 | /** | ||
71 | * If the next character is CR, skip it. Otherwise, | ||
72 | * just go inactive. | ||
73 | */ | ||
74 | RN_OptN = 1, | ||
75 | |||
76 | /** | ||
77 | * Expect LFCR (and only LFCR). As always, we also | ||
78 | * expect only LF or only CR. | ||
79 | */ | ||
80 | RN_Full = 2, | ||
81 | |||
82 | /** | ||
83 | * Expect either LFCR or '--'LFCR. If '--'LFCR, transition into dash-state | ||
84 | * for the main state machine | ||
85 | */ | ||
86 | RN_Dash = 3, | ||
87 | |||
88 | /** | ||
89 | * Got a single dash, expect second dash. | ||
90 | */ | ||
91 | RN_Dash2 = 4 | ||
92 | }; | ||
93 | |||
94 | |||
95 | /** | ||
96 | * Bits for the globally known fields that | ||
97 | * should not be deleted when we exit the | ||
98 | * nested state. | ||
99 | */ | ||
100 | enum NE_State | ||
101 | { | ||
102 | NE_none = 0, | ||
103 | NE_content_name = 1, | ||
104 | NE_content_type = 2, | ||
105 | NE_content_filename = 4, | ||
106 | NE_content_transfer_encoding = 8 | ||
107 | }; | ||
108 | |||
109 | |||
110 | /** | ||
111 | * Internal state of the post-processor. Note that the fields | ||
112 | * are sorted by type to enable optimal packing by the compiler. | ||
113 | */ | ||
114 | struct MHD_PostProcessor | ||
115 | { | ||
116 | |||
117 | /** | ||
118 | * The connection for which we are doing | ||
119 | * POST processing. | ||
120 | */ | ||
121 | struct MHD_Connection *connection; | ||
122 | |||
123 | /** | ||
124 | * Function to call with POST data. | ||
125 | */ | ||
126 | MHD_PostDataIterator ikvi; | ||
127 | |||
128 | /** | ||
129 | * Extra argument to ikvi. | ||
130 | */ | ||
131 | void *cls; | ||
132 | |||
133 | /** | ||
134 | * Encoding as given by the headers of the connection. | ||
135 | */ | ||
136 | const char *encoding; | ||
137 | |||
138 | /** | ||
139 | * Primary boundary (points into encoding string) | ||
140 | */ | ||
141 | const char *boundary; | ||
142 | |||
143 | /** | ||
144 | * Nested boundary (if we have multipart/mixed encoding). | ||
145 | */ | ||
146 | char *nested_boundary; | ||
147 | |||
148 | /** | ||
149 | * Pointer to the name given in disposition. | ||
150 | */ | ||
151 | char *content_name; | ||
152 | |||
153 | /** | ||
154 | * Pointer to the (current) content type. | ||
155 | */ | ||
156 | char *content_type; | ||
157 | |||
158 | /** | ||
159 | * Pointer to the (current) filename. | ||
160 | */ | ||
161 | char *content_filename; | ||
162 | |||
163 | /** | ||
164 | * Pointer to the (current) encoding. | ||
165 | */ | ||
166 | char *content_transfer_encoding; | ||
167 | |||
168 | /** | ||
169 | * Value data left over from previous iteration. | ||
170 | */ | ||
171 | char xbuf[2]; | ||
172 | |||
173 | /** | ||
174 | * Size of our buffer for the key. | ||
175 | */ | ||
176 | size_t buffer_size; | ||
177 | |||
178 | /** | ||
179 | * Current position in the key buffer. | ||
180 | */ | ||
181 | size_t buffer_pos; | ||
182 | |||
183 | /** | ||
184 | * Current position in @e xbuf. | ||
185 | */ | ||
186 | size_t xbuf_pos; | ||
187 | |||
188 | /** | ||
189 | * Current offset in the value being processed. | ||
190 | */ | ||
191 | uint64_t value_offset; | ||
192 | |||
193 | /** | ||
194 | * strlen(boundary) -- if boundary != NULL. | ||
195 | */ | ||
196 | size_t blen; | ||
197 | |||
198 | /** | ||
199 | * strlen(nested_boundary) -- if nested_boundary != NULL. | ||
200 | */ | ||
201 | size_t nlen; | ||
202 | |||
203 | /** | ||
204 | * Do we have to call the 'ikvi' callback when processing the | ||
205 | * multipart post body even if the size of the payload is zero? | ||
206 | * Set to #MHD_YES whenever we parse a new multiparty entry header, | ||
207 | * and to #MHD_NO the first time we call the 'ikvi' callback. | ||
208 | * Used to ensure that we do always call 'ikvi' even if the | ||
209 | * payload is empty (but not more than once). | ||
210 | */ | ||
211 | bool must_ikvi; | ||
212 | |||
213 | /** | ||
214 | * Set if we still need to run the unescape logic | ||
215 | * on the key allocated at the end of this struct. | ||
216 | */ | ||
217 | bool must_unescape_key; | ||
218 | |||
219 | /** | ||
220 | * State of the parser. | ||
221 | */ | ||
222 | enum PP_State state; | ||
223 | |||
224 | /** | ||
225 | * Side-state-machine: skip LRCR (or just LF). | ||
226 | * Set to 0 if we are not in skip mode. Set to 2 | ||
227 | * if a LFCR is expected, set to 1 if a CR should | ||
228 | * be skipped if it is the next character. | ||
229 | */ | ||
230 | enum RN_State skip_rn; | ||
231 | |||
232 | /** | ||
233 | * If we are in skip_rn with "dash" mode and | ||
234 | * do find 2 dashes, what state do we go into? | ||
235 | */ | ||
236 | enum PP_State dash_state; | ||
237 | |||
238 | /** | ||
239 | * Which headers are global? (used to tell which | ||
240 | * headers were only valid for the nested multipart). | ||
241 | */ | ||
242 | enum NE_State have; | ||
243 | |||
244 | }; | ||
245 | |||
246 | #endif /* ! MHD_POSTPROCESSOR_H */ | ||