aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAlfredo Cardigliano <alfredo.cardigliano@gmail.com>2019-09-25 17:19:33 +0200
committerAlfredo Cardigliano <alfredo.cardigliano@gmail.com>2019-09-25 17:19:33 +0200
commit3709e673d9b4a0edb550573a9f8185184ab7d428 (patch)
tree914060c9d9faea8169dafc59d38a822a8afd0732
parent0b62c0ad4546de34a063ab67c1e5b57bb97ae8d9 (diff)
New serializer APIs ndpi_serialize_start_of_block / ndpi_serialize_end_of_block (JSON only)
-rw-r--r--src/include/ndpi_api.h3
-rw-r--r--src/include/ndpi_typedefs.h1
-rw-r--r--src/lib/ndpi_serializer.c63
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;