diff options
author | Alfredo Cardigliano <alfredo.cardigliano@gmail.com> | 2019-09-25 17:19:33 +0200 |
---|---|---|
committer | Alfredo Cardigliano <alfredo.cardigliano@gmail.com> | 2019-09-25 17:19:33 +0200 |
commit | 3709e673d9b4a0edb550573a9f8185184ab7d428 (patch) | |
tree | 914060c9d9faea8169dafc59d38a822a8afd0732 | |
parent | 0b62c0ad4546de34a063ab67c1e5b57bb97ae8d9 (diff) |
New serializer APIs ndpi_serialize_start_of_block / ndpi_serialize_end_of_block (JSON only)
-rw-r--r-- | src/include/ndpi_api.h | 3 | ||||
-rw-r--r-- | src/include/ndpi_typedefs.h | 1 | ||||
-rw-r--r-- | src/lib/ndpi_serializer.c | 63 |
3 files changed, 66 insertions, 1 deletions
diff --git a/src/include/ndpi_api.h b/src/include/ndpi_api.h index 285629035..cf1f60d5e 100644 --- a/src/include/ndpi_api.h +++ b/src/include/ndpi_api.h @@ -858,6 +858,9 @@ extern "C" { const char *key, float value, const char *format /* e.f. "%.2f" */); int ndpi_serialize_end_of_record(ndpi_serializer *serializer); + int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, + const char *key); + int ndpi_serialize_end_of_block(ndpi_serializer *_serializer); char* ndpi_serializer_get_buffer(ndpi_serializer *_serializer, u_int32_t *buffer_len); u_int32_t ndpi_serializer_get_buffer_len(ndpi_serializer *_serializer); int ndpi_serializer_set_buffer_len(ndpi_serializer *_serializer, u_int32_t l); diff --git a/src/include/ndpi_typedefs.h b/src/include/ndpi_typedefs.h index 5f08ad11c..d9da6205d 100644 --- a/src/include/ndpi_typedefs.h +++ b/src/include/ndpi_typedefs.h @@ -1365,6 +1365,7 @@ typedef enum { #define NDPI_SERIALIZER_STATUS_COMMA (1 << 0) #define NDPI_SERIALIZER_STATUS_ARRAY (1 << 1) #define NDPI_SERIALIZER_STATUS_EOR (1 << 2) +#define NDPI_SERIALIZER_STATUS_SOB (1 << 3) typedef struct { u_int32_t flags; diff --git a/src/lib/ndpi_serializer.c b/src/lib/ndpi_serializer.c index 87ce5e364..49f29a4e8 100644 --- a/src/lib/ndpi_serializer.c +++ b/src/lib/ndpi_serializer.c @@ -454,7 +454,10 @@ static inline void ndpi_serialize_json_pre(ndpi_serializer *_serializer) { if(serializer->status.flags & NDPI_SERIALIZER_STATUS_ARRAY) serializer->status.size_used--; /* Remove ']'*/ serializer->status.size_used--; /* Remove '}'*/ - if(serializer->status.flags & NDPI_SERIALIZER_STATUS_COMMA) + + if (serializer->status.flags & NDPI_SERIALIZER_STATUS_SOB) + serializer->status.flags &= ~NDPI_SERIALIZER_STATUS_SOB; + else if(serializer->status.flags & NDPI_SERIALIZER_STATUS_COMMA) serializer->buffer[serializer->status.size_used++] = ','; } } @@ -1206,6 +1209,64 @@ int ndpi_serialize_string_string(ndpi_serializer *_serializer, /* ********************************** */ +/* Serialize start of nested block (JSON only)*/ +int ndpi_serialize_start_of_block(ndpi_serializer *_serializer, + const char *key) { + ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; + u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t needed, klen = strlen(key); + + if (serializer->fmt != ndpi_serialization_format_json) + return -1; + + needed = 16 + klen; + + if (buff_diff < needed) { + if (ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->status.size_used; + } + + ndpi_serialize_json_pre(_serializer); + serializer->status.size_used += ndpi_json_string_escape(key, klen, + (char *) &serializer->buffer[serializer->status.size_used], buff_diff); + buff_diff = serializer->buffer_size - serializer->status.size_used; + serializer->status.size_used += snprintf((char *) &serializer->buffer[serializer->status.size_used], buff_diff, ": {"); + buff_diff = serializer->buffer_size - serializer->status.size_used; + ndpi_serialize_json_post(_serializer); + + serializer->status.flags |= NDPI_SERIALIZER_STATUS_SOB; + + return(0); +} + +/* ********************************** */ + +/* Serialize start of nested block (JSON only)*/ +int ndpi_serialize_end_of_block(ndpi_serializer *_serializer) { + ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; + u_int32_t buff_diff = serializer->buffer_size - serializer->status.size_used; + u_int32_t needed; + + if (serializer->fmt != ndpi_serialization_format_json) + return -1; + + needed = 4; + + if (buff_diff < needed) { + if (ndpi_extend_serializer_buffer(_serializer, needed - buff_diff) < 0) + return(-1); + buff_diff = serializer->buffer_size - serializer->status.size_used; + } + + buff_diff = serializer->buffer_size - serializer->status.size_used; + ndpi_serialize_json_post(_serializer); + + return(0); +} + +/* ********************************** */ + void ndpi_serializer_create_snapshot(ndpi_serializer *_serializer) { ndpi_private_serializer *serializer = (ndpi_private_serializer*)_serializer; |