00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00039 #ifndef _HTP_MULTIPART_H
00040 #define _HTP_MULTIPART_H
00041
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045
00046 #include "bstr.h"
00047 #include "htp.h"
00048 #include "htp_table.h"
00049
00050
00051
00052
00058 #define HTP_MULTIPART_LF_LINE 0x0001
00059
00061 #define HTP_MULTIPART_CRLF_LINE 0x0002
00062
00064 #define HTP_MULTIPART_BBOUNDARY_LWS_AFTER 0x0004
00065
00067 #define HTP_MULTIPART_BBOUNDARY_NLWS_AFTER 0x0008
00068
00072 #define HTP_MULTIPART_HAS_PREAMBLE 0x0010
00073
00077 #define HTP_MULTIPART_HAS_EPILOGUE 0x0020
00078
00085 #define HTP_MULTIPART_SEEN_LAST_BOUNDARY 0x0040
00086
00091 #define HTP_MULTIPART_PART_AFTER_LAST_BOUNDARY 0x0080
00092
00099 #define HTP_MULTIPART_INCOMPLETE 0x0100
00100
00102 #define HTP_MULTIPART_HBOUNDARY_INVALID 0x0200
00103
00109 #define HTP_MULTIPART_HBOUNDARY_UNUSUAL 0x0400
00110
00115 #define HTP_MULTIPART_HBOUNDARY_QUOTED 0x0800
00116
00118 #define HTP_MULTIPART_PART_HEADER_FOLDING 0x1000
00119
00124 #define HTP_MULTIPART_PART_UNKNOWN 0x2000
00125
00127 #define HTP_MULTIPART_PART_HEADER_REPEATED 0x4000
00128
00130 #define HTP_MULTIPART_PART_HEADER_UNKNOWN 0x8000
00131
00133 #define HTP_MULTIPART_PART_HEADER_INVALID 0x10000
00134
00136 #define HTP_MULTIPART_CD_TYPE_INVALID 0x20000
00137
00139 #define HTP_MULTIPART_CD_PARAM_REPEATED 0x40000
00140
00142 #define HTP_MULTIPART_CD_PARAM_UNKNOWN 0x80000
00143
00145 #define HTP_MULTIPART_CD_SYNTAX_INVALID 0x100000
00146
00152 #define HTP_MULTIPART_PART_INCOMPLETE 0x200000
00153
00155 #define HTP_MULTIPART_NUL_BYTE 0x400000
00156
00158 #define HTP_MULTIPART_CD_INVALID ( \
00159 HTP_MULTIPART_CD_TYPE_INVALID | \
00160 HTP_MULTIPART_CD_PARAM_REPEATED | \
00161 HTP_MULTIPART_CD_PARAM_UNKNOWN | \
00162 HTP_MULTIPART_CD_SYNTAX_INVALID )
00163
00165 #define HTP_MULTIPART_PART_INVALID ( \
00166 HTP_MULTIPART_CD_INVALID | \
00167 HTP_MULTIPART_NUL_BYTE | \
00168 HTP_MULTIPART_PART_UNKNOWN | \
00169 HTP_MULTIPART_PART_HEADER_REPEATED | \
00170 HTP_MULTIPART_PART_INCOMPLETE | \
00171 HTP_MULTIPART_PART_HEADER_UNKNOWN | \
00172 HTP_MULTIPART_PART_HEADER_INVALID )
00173
00175 #define HTP_MULTIPART_INVALID ( \
00176 HTP_MULTIPART_PART_INVALID | \
00177 HTP_MULTIPART_PART_AFTER_LAST_BOUNDARY | \
00178 HTP_MULTIPART_INCOMPLETE | \
00179 HTP_MULTIPART_HBOUNDARY_INVALID )
00180
00182 #define HTP_MULTIPART_UNUSUAL ( \
00183 HTP_MULTIPART_INVALID | \
00184 HTP_MULTIPART_PART_HEADER_FOLDING | \
00185 HTP_MULTIPART_BBOUNDARY_NLWS_AFTER | \
00186 HTP_MULTIPART_HAS_EPILOGUE | \
00187 HTP_MULTIPART_HBOUNDARY_UNUSUAL \
00188 HTP_MULTIPART_HBOUNDARY_QUOTED )
00189
00191 #define HTP_MULTIPART_UNUSUAL_PARANOID ( \
00192 HTP_MULTIPART_UNUSUAL | \
00193 HTP_MULTIPART_LF_LINE | \
00194 HTP_MULTIPART_BBOUNDARY_LWS_AFTER | \
00195 HTP_MULTIPART_HAS_PREAMBLE )
00196
00197 #define HTP_MULTIPART_MIME_TYPE "multipart/form-data"
00198
00199 enum htp_multipart_type_t {
00200
00202 MULTIPART_PART_UNKNOWN = 0,
00203
00205 MULTIPART_PART_TEXT = 1,
00206
00208 MULTIPART_PART_FILE = 2,
00209
00211 MULTIPART_PART_PREAMBLE = 3,
00212
00214 MULTIPART_PART_EPILOGUE = 4
00215 };
00216
00217
00218
00219
00223 typedef struct htp_mpartp_t htp_mpartp_t;
00224
00228 typedef struct htp_multipart_t {
00230 char *boundary;
00231
00233 size_t boundary_len;
00234
00236 int boundary_count;
00237
00239 htp_list_t *parts;
00240
00242 uint64_t flags;
00243 } htp_multipart_t;
00244
00248 typedef struct htp_multipart_part_t {
00250 htp_mpartp_t *parser;
00251
00253 enum htp_multipart_type_t type;
00254
00256 size_t len;
00257
00259 bstr *name;
00260
00267 bstr *value;
00268
00270 bstr *content_type;
00271
00273 htp_table_t *headers;
00274
00276 htp_file_t *file;
00277 } htp_multipart_part_t;
00278
00279
00280
00281
00291 htp_mpartp_t *htp_mpartp_create(htp_cfg_t *cfg, bstr *boundary, uint64_t flags);
00292
00305 htp_status_t htp_mpartp_find_boundary(bstr *content_type, bstr **boundary, uint64_t *multipart_flags);
00306
00313 htp_multipart_t *htp_mpartp_get_multipart(htp_mpartp_t *parser);
00314
00320 void htp_mpartp_destroy(htp_mpartp_t *parser);
00321
00328 htp_status_t htp_mpartp_finalize(htp_mpartp_t *parser);
00329
00339 htp_status_t htp_mpartp_parse(htp_mpartp_t *parser, const void *data, size_t len);
00340
00341 #ifdef __cplusplus
00342 }
00343 #endif
00344
00345 #endif