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_PRIVATE_H
00040 #define _HTP_MULTIPART_PRIVATE_H
00041
00042 #ifdef __cplusplus
00043 extern "C" {
00044 #endif
00045
00046 #include "htp_multipart.h"
00047
00048 #define CD_PARAM_OTHER 0
00049 #define CD_PARAM_NAME 1
00050 #define CD_PARAM_FILENAME 2
00051
00052 #define DEFAULT_FILE_EXTRACT_LIMIT 16
00053
00054 enum htp_part_mode_t {
00056 MODE_LINE = 0,
00057
00059 MODE_DATA = 1
00060 };
00061
00062 enum htp_multipart_state_t {
00064 STATE_INIT = 0,
00065
00067 STATE_DATA = 1,
00068
00070 STATE_BOUNDARY = 2,
00071
00073 STATE_BOUNDARY_IS_LAST1 = 3,
00074
00076 STATE_BOUNDARY_IS_LAST2 = 4,
00077
00079 STATE_BOUNDARY_EAT_LWS = 5,
00080
00082 STATE_BOUNDARY_EAT_LWS_CR = 6
00083 };
00084
00085 struct htp_mpartp_t {
00086 htp_multipart_t multipart;
00087
00088 htp_cfg_t *cfg;
00089
00090 int extract_files;
00091
00092 int extract_limit;
00093
00094 char *extract_dir;
00095
00096 int file_count;
00097
00098
00099
00100 int (*handle_data)(htp_mpartp_t *mpartp, const unsigned char *data,
00101 size_t len, int line_end);
00102 int (*handle_boundary)(htp_mpartp_t *mpartp);
00103
00104
00105
00109 enum htp_multipart_state_t parser_state;
00110
00115 size_t boundary_match_pos;
00116
00120 htp_multipart_part_t *current_part;
00121
00135 enum htp_part_mode_t current_part_mode;
00136
00143 bstr_builder_t *boundary_pieces;
00144
00145 bstr_builder_t *part_header_pieces;
00146
00147 bstr *pending_header_line;
00148
00154 bstr_builder_t *part_data_pieces;
00155
00160 size_t boundary_candidate_pos;
00161
00171 int cr_aside;
00172
00178 int gave_up_data;
00179 };
00180
00181 htp_status_t htp_mpartp_run_request_file_data_hook(htp_multipart_part_t *part, const unsigned char *data, size_t len);
00182
00183 htp_status_t htp_mpart_part_process_headers(htp_multipart_part_t *part);
00184
00185 htp_status_t htp_mpartp_parse_header(htp_multipart_part_t *part, const unsigned char *data, size_t len);
00186
00187 htp_status_t htp_mpart_part_handle_data(htp_multipart_part_t *part, const unsigned char *data, size_t len, int is_line);
00188
00189 int htp_mpartp_is_boundary_character(int c);
00190
00191 htp_multipart_part_t *htp_mpart_part_create(htp_mpartp_t *parser);
00192
00193 htp_status_t htp_mpart_part_finalize_data(htp_multipart_part_t *part);
00194
00195 void htp_mpart_part_destroy(htp_multipart_part_t *part, int gave_up_data);
00196
00197 htp_status_t htp_mpart_part_parse_c_d(htp_multipart_part_t *part);
00198
00199 #ifdef __cplusplus
00200 }
00201 #endif
00202
00203 #endif