aboutsummaryrefslogtreecommitdiff
path: root/src/microhttpd/postprocessor.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/microhttpd/postprocessor.h')
-rw-r--r--src/microhttpd/postprocessor.h246
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 */
34enum 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
63enum 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 */
100enum 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 */
114struct 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 */