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
00037 #ifndef _HTP_MULTIPART_H
00038 #define _HTP_MULTIPART_H
00039
00040 typedef struct htp_mpartp_t htp_mpartp_t;
00041 typedef struct htp_mpart_part_t htp_mpart_part_t;
00042
00043 #include "bstr.h"
00044 #include "dslib.h"
00045 #include "htp.h"
00046
00047 #define MULTIPART_PART_UNKNOWN 0
00048 #define MULTIPART_PART_TEXT 1
00049 #define MULTIPART_PART_FILE 2
00050 #define MULTIPART_PART_PREAMBLE 3
00051 #define MULTIPART_PART_EPILOGUE 4
00052
00053 #define MULTIPART_MODE_LINE 0
00054 #define MULTIPART_MODE_DATA 1
00055
00056 #define MULTIPART_STATE_DATA 1
00057 #define MULTIPART_STATE_BOUNDARY 2
00058 #define MULTIPART_STATE_BOUNDARY_IS_LAST1 3
00059 #define MULTIPART_STATE_BOUNDARY_IS_LAST2 4
00060 #define MULTIPART_STATE_BOUNDARY_EAT_LF 5
00061
00062 #define MULTIPART_DEFAULT_FILE_EXTRACT_LIMIT 16
00063
00064 #define HTP_MULTIPART_MIME_TYPE "multipart/form-data"
00065
00066 #ifndef CR
00067 #define CR '\r'
00068 #endif
00069
00070 #ifndef LF
00071 #define LF '\n'
00072 #endif
00073
00074 #ifdef __cplusplus
00075 extern "C" {
00076 #endif
00077
00078 struct htp_mpart_part_t {
00080 htp_mpartp_t *mpartp;
00081
00083 int type;
00084
00086 size_t len;
00087
00089 bstr *name;
00090
00092 bstr *value;
00093
00095 table_t *headers;
00096
00097 htp_file_t *file;
00098 };
00099
00100 struct htp_mpartp_t {
00101 htp_connp_t *connp;
00102
00104 char *boundary;
00105
00107 size_t boundary_len;
00108
00110 int boundary_count;
00111
00113 int seen_last_boundary;
00114
00116 list_t *parts;
00117
00118 int extract_files;
00119 int extract_limit;
00120 char *extract_dir;
00121 int file_count;
00122
00123
00124 int (*handle_data)(htp_mpartp_t *mpartp, unsigned char *data, size_t len, int line_end);
00125 int (*handle_boundary)(htp_mpartp_t *mpartp);
00126
00127
00128
00129 int state;
00130 size_t bpos;
00131 unsigned char *current_data;
00132 htp_mpart_part_t *current_part;
00133 int current_mode;
00134 size_t current_len;
00135 bstr_builder_t *boundary_pieces;
00136 bstr_builder_t *part_pieces;
00137 int pieces_form_line;
00138 unsigned char first_boundary_byte;
00139 size_t boundarypos;
00140 int cr_aside;
00141 };
00142
00143 htp_mpartp_t *htp_mpartp_create(htp_connp_t *connp, char *boundary);
00144 void htp_mpartp_destroy(htp_mpartp_t **mpartp);
00145
00146 int htp_mpartp_parse(htp_mpartp_t *mpartp, unsigned char *data, size_t len);
00147 int htp_mpartp_finalize(htp_mpartp_t *mpartp);
00148
00149 htp_mpart_part_t *htp_mpart_part_create(htp_mpartp_t *mpartp);
00150 int htp_mpart_part_receive_data(htp_mpart_part_t *part, unsigned char *data, size_t len, int line);
00151 int htp_mpart_part_finalize_data(htp_mpart_part_t *part);
00152 void htp_mpart_part_destroy(htp_mpart_part_t *part);
00153
00154 int htp_mpartp_extract_boundary(bstr *content_type, char **boundary);
00155
00156 int htp_mpartp_run_request_file_data_hook(htp_mpart_part_t *part, unsigned char *data, size_t len);
00157
00158 #ifdef __cplusplus
00159 }
00160 #endif
00161
00162 #endif
00163
00164