Skip to content

Commit d4496e6

Browse files
Brandon Strubedsiper
authored andcommitted
in_forward: update concatenated gzip payload handling
Utilize new flb_gzip_uncompress_multi method to support concatenated gzip payloads. Signed-off-by: Brandon Strub <[email protected]>
1 parent 0c6e73b commit d4496e6

File tree

1 file changed

+25
-89
lines changed

1 file changed

+25
-89
lines changed

plugins/in_forward/fw_prot.c

Lines changed: 25 additions & 89 deletions
Original file line numberDiff line numberDiff line change
@@ -1525,108 +1525,44 @@ int fw_prot_process(struct flb_input_instance *ins, struct fw_conn *conn)
15251525
}
15261526

15271527
if (ret == FLB_TRUE) {
1528-
size_t prev_pos = 0;
1529-
size_t gzip_payloads_count = 0;
1530-
size_t loop = 0;
1531-
size_t *gzip_borders = NULL;
1532-
const size_t original_len = len;
1533-
1534-
gzip_payloads_count = flb_gzip_count(data, len, NULL, 0);
1535-
flb_plg_debug(ctx->ins, "concatenated gzip payload count is %zd",
1536-
gzip_payloads_count);
1537-
if (gzip_payloads_count > 0) {
1538-
gzip_borders = (size_t *)flb_calloc(1, sizeof(size_t) * (gzip_payloads_count + 1));
1539-
if (gzip_borders == NULL) {
1540-
flb_errno();
1541-
return -1;
1542-
}
1543-
if (flb_gzip_count(data, len, &gzip_borders, gzip_payloads_count) < 0) {
1544-
flb_plg_error(ctx->ins,
1545-
"failed to traverse boundaries of concatenated gzip payloads");
1546-
return -1;
1547-
}
1548-
}
1528+
size_t remaining = len;
15491529

1550-
retry_uncompress:
1551-
if (gzip_payloads_count > 0) {
1552-
if (loop == 0) {
1553-
len = gzip_borders[loop];
1554-
}
1555-
else if (gzip_borders[loop] == original_len) {
1556-
len = original_len - gzip_borders[loop - 1];
1557-
}
1558-
else if (loop >= 1) {
1559-
len = gzip_borders[loop] - gzip_borders[loop - 1];
1530+
while (remaining > 0) {
1531+
ret = flb_gzip_uncompress_multi((void *) (data + (len - remaining)), remaining,
1532+
&gz_data, &gz_size, &remaining);
1533+
1534+
if (ret == -1) {
1535+
flb_plg_error(ctx->ins, "gzip uncompress failure");
1536+
msgpack_unpacked_destroy(&result);
1537+
msgpack_unpacker_free(unp);
1538+
flb_sds_destroy(out_tag);
1539+
return -1;
15601540
}
1561-
}
1562-
flb_plg_trace(ctx->ins,
1563-
"[gzip decompression] loop = %zd, len = %zd, original_len = %zd",
1564-
loop, len, original_len);
15651541

1566-
ret = flb_gzip_uncompress((void *) (data + prev_pos), len,
1567-
&gz_data, &gz_size);
1568-
if (ret == -1) {
1569-
flb_plg_error(ctx->ins, "gzip uncompress failure");
1570-
msgpack_unpacked_destroy(&result);
1571-
msgpack_unpacker_free(unp);
1572-
flb_sds_destroy(out_tag);
1573-
if (gzip_borders != NULL) {
1574-
flb_free(gzip_borders);
1542+
event_type = FLB_EVENT_TYPE_LOGS;
1543+
if (contain_options) {
1544+
ret = get_chunk_event_type(ins, root.via.array.ptr[2]);
1545+
if (ret == -1) {
1546+
msgpack_unpacked_destroy(&result);
1547+
msgpack_unpacker_free(unp);
1548+
flb_sds_destroy(out_tag);
1549+
flb_free(gz_data);
1550+
return -1;
1551+
}
1552+
event_type = ret;
15751553
}
1576-
return -1;
1577-
}
15781554

1579-
event_type = FLB_EVENT_TYPE_LOGS;
1580-
if (contain_options) {
1581-
ret = get_chunk_event_type(ins, root.via.array.ptr[2]);
1555+
ret = append_log(ins, conn,
1556+
event_type,
1557+
out_tag, gz_data, gz_size);
15821558
if (ret == -1) {
15831559
msgpack_unpacked_destroy(&result);
15841560
msgpack_unpacker_free(unp);
15851561
flb_sds_destroy(out_tag);
15861562
flb_free(gz_data);
1587-
if (gzip_borders != NULL) {
1588-
flb_free(gzip_borders);
1589-
}
15901563
return -1;
15911564
}
1592-
event_type = ret;
1593-
}
1594-
1595-
ret = append_log(ins, conn,
1596-
event_type,
1597-
out_tag, gz_data, gz_size);
1598-
if (ret == -1) {
1599-
msgpack_unpacked_destroy(&result);
1600-
msgpack_unpacker_free(unp);
1601-
flb_sds_destroy(out_tag);
16021565
flb_free(gz_data);
1603-
if (gzip_borders != NULL) {
1604-
flb_free(gzip_borders);
1605-
}
1606-
1607-
return -1;
1608-
}
1609-
flb_free(gz_data);
1610-
1611-
/* a valid payload of gzip is larger than 18 bytes. */
1612-
if (gzip_payloads_count > 0) {
1613-
if ((gzip_payloads_count - loop) > 0 &&
1614-
(original_len - gzip_borders[loop]) >= 18) {
1615-
len = original_len - gzip_borders[loop];
1616-
flb_plg_debug(ctx->ins, "left unconsumed %zd byte(s)", len);
1617-
prev_pos = gzip_borders[loop];
1618-
loop++;
1619-
goto retry_uncompress;
1620-
}
1621-
else {
1622-
flb_plg_debug(ctx->ins, "left unconsumed %zd byte(s)",
1623-
original_len - gzip_borders[loop]);
1624-
}
1625-
if (loop == gzip_payloads_count) {
1626-
if (gzip_borders != NULL) {
1627-
flb_free(gzip_borders);
1628-
}
1629-
}
16301566
}
16311567
}
16321568
else {

0 commit comments

Comments
 (0)