Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix JSON format #434

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 52 additions & 4 deletions json.c
Original file line number Diff line number Diff line change
Expand Up @@ -30,12 +30,58 @@

#include <yajl/yajl_gen.h>

#include <stdint.h>
#include <stdlib.h>
#include <stdio.h>

#define JS_STR(G, STR) do { \
const char *_s = (STR); \
yajl_gen_string(G, (const unsigned char *)_s, strlen(_s)); \
} while (0)
#define JS_INT(G, INT) yajl_gen_integer(g, INT)

static char encoding_table[] = {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', 'a', 'b', 'c', 'd', 'e', 'f',
'g', 'h', 'i', 'j', 'k', 'l', 'm', 'n',
'o', 'p', 'q', 'r', 's', 't', 'u', 'v',
'w', 'x', 'y', 'z', '0', '1', '2', '3',
'4', '5', '6', '7', '8', '9', '+', '/'};
static int mod_table[] = {0, 2, 1};

// From https://stackoverflow.com/a/6782480
char *base64_encode(const unsigned char *data,
size_t input_length,
size_t *output_length) {

*output_length = 4 * ((input_length + 2) / 3);

char *encoded_data = malloc(*output_length);
if (encoded_data == NULL) return NULL;

for (size_t i = 0, j = 0; i < input_length;) {

uint32_t octet_a = i < input_length ? (unsigned char)data[i++] : 0;
uint32_t octet_b = i < input_length ? (unsigned char)data[i++] : 0;
uint32_t octet_c = i < input_length ? (unsigned char)data[i++] : 0;

uint32_t triple = (octet_a << 0x10) + (octet_b << 0x08) + octet_c;

encoded_data[j++] = encoding_table[(triple >> 3 * 6) & 0x3F];
encoded_data[j++] = encoding_table[(triple >> 2 * 6) & 0x3F];
encoded_data[j++] = encoding_table[(triple >> 1 * 6) & 0x3F];
encoded_data[j++] = encoding_table[(triple >> 0 * 6) & 0x3F];
}

for (int i = 0; i < mod_table[input_length % 3]; i++)
encoded_data[*output_length - 1 - i] = '=';

printf(encoded_data, output_length);

return encoded_data;
}

void fmt_msg_output_json (FILE *fp, const rd_kafka_message_t *rkmessage) {
yajl_gen g;
const char *topic = rd_kafka_topic_name(rkmessage->rkt);
Expand Down Expand Up @@ -178,12 +224,14 @@ void fmt_msg_output_json (FILE *fp, const rd_kafka_message_t *rkmessage) {
}

free(json);
} else
} else {
#endif
size_t output_len = 0;
unsigned char* base64Payload = (unsigned char *)base64_encode((const unsigned char *) rkmessage->payload, rkmessage->len, &output_len);
yajl_gen_string(g,
(const unsigned char *)
rkmessage->payload,
rkmessage->len);
base64Payload,
output_len);
}
} else
yajl_gen_null(g);

Expand Down