|
31 | 31 | #include <fluent-bit/flb_regex.h> |
32 | 32 | #include <msgpack.h> |
33 | 33 |
|
| 34 | +#include <tutf8e.h> |
| 35 | + |
34 | 36 | #include "modify.h" |
35 | 37 |
|
36 | 38 | static void condition_free(struct modify_condition *condition) |
@@ -331,6 +333,9 @@ static int setup(struct filter_modify_ctx *ctx, |
331 | 333 | else if (strcasecmp(kv->key, "set") == 0) { |
332 | 334 | rule->ruletype = SET; |
333 | 335 | } |
| 336 | + else if (strcasecmp(kv->key, "utf8") == 0) { |
| 337 | + rule->ruletype = UTF8; |
| 338 | + } |
334 | 339 | else if (strcasecmp(kv->key, "copy") == 0) { |
335 | 340 | rule->ruletype = COPY; |
336 | 341 | } |
@@ -1157,6 +1162,42 @@ static inline int apply_rule_SET(msgpack_packer * packer, |
1157 | 1162 | return FLB_FILTER_MODIFIED; |
1158 | 1163 | } |
1159 | 1164 |
|
| 1165 | +static inline int apply_rule_UTF8(msgpack_packer * packer, |
| 1166 | + msgpack_object * map, |
| 1167 | + struct modify_rule *rule) |
| 1168 | +{ |
| 1169 | + int ret = FLB_FILTER_NOTOUCH; |
| 1170 | + int i; |
| 1171 | + |
| 1172 | + int match_keys = |
| 1173 | + map_count_keys_matching_str(map, rule->key, rule->key_len); |
| 1174 | + |
| 1175 | + if (match_keys == 0) { |
| 1176 | + flb_debug |
| 1177 | + ("[filter_modify] Rule %s to UTF8 %s : No keys matching %s found, not applying rule", |
| 1178 | + rule->val, rule->key, rule->key); |
| 1179 | + } |
| 1180 | + else { |
| 1181 | + msgpack_pack_map(packer, map->via.map.size); |
| 1182 | + for (i = 0; i < map->via.map.size; i++) { |
| 1183 | + msgpack_pack_object(packer, map->via.map.ptr[i].key); |
| 1184 | + if (map->via.map.ptr[i].val.type == MSGPACK_OBJECT_STR && |
| 1185 | + kv_key_matches_str_rule_key(&map->via.map.ptr[i], rule)) { |
| 1186 | + size_t size = 512; |
| 1187 | + char buffer[512]; |
| 1188 | + if (!tutf8e_buffer_encode_iso_8859_2(buffer, &size, map->via.map.ptr[i].val.via.str.ptr, map->via.map.ptr[i].val.via.str.size)) |
| 1189 | + { |
| 1190 | + helper_pack_string(packer, buffer, size); |
| 1191 | + ret = FLB_FILTER_MODIFIED; |
| 1192 | + continue; |
| 1193 | + } |
| 1194 | + } |
| 1195 | + msgpack_pack_object(packer, map->via.map.ptr[i].val); |
| 1196 | + } |
| 1197 | + } |
| 1198 | + return ret; |
| 1199 | +} |
| 1200 | + |
1160 | 1201 | static inline int apply_rule_REMOVE(msgpack_packer * packer, |
1161 | 1202 | msgpack_object * map, |
1162 | 1203 | struct modify_rule *rule) |
@@ -1222,6 +1263,8 @@ static inline int apply_modifying_rule(msgpack_packer * packer, |
1222 | 1263 | return apply_rule_ADD(packer, map, rule); |
1223 | 1264 | case SET: |
1224 | 1265 | return apply_rule_SET(packer, map, rule); |
| 1266 | + case UTF8: |
| 1267 | + return apply_rule_UTF8(packer, map, rule); |
1225 | 1268 | case REMOVE: |
1226 | 1269 | return apply_rule_REMOVE(packer, map, rule); |
1227 | 1270 | case REMOVE_WILDCARD: |
|
0 commit comments