output/http: log content-type like other headers

Ticket: 8056

Avoid stack allocation.
Do not handle null and ; especially
pull/14278/head
Philippe Antoine 9 months ago committed by Victor Julien
parent acc051ac94
commit b8411fcc8d

@ -238,14 +238,12 @@ static void EveHttpLogJSONBasic(SCJsonBuilder *js, htp_tx_t *tx)
if (htp_tx_response_headers(tx) != NULL) {
const htp_header_t *h_content_type = htp_tx_response_header(tx, "content-type");
if (h_content_type != NULL) {
const size_t size = htp_header_value_len(h_content_type) * 2 + 1;
char string[size];
BytesToStringBuffer(htp_header_value_ptr(h_content_type),
htp_header_value_len(h_content_type), string, size);
char *p = strchr(string, ';');
uint32_t len = (uint32_t)htp_header_value_len(h_content_type);
const uint8_t *p = memchr(htp_header_value_ptr(h_content_type), ';', len);
if (p != NULL)
*p = '\0';
SCJbSetString(js, "http_content_type", string);
len = (uint32_t)(p - htp_header_value_ptr(h_content_type));
SCJbSetStringFromBytes(
js, "http_content_type", htp_header_value_ptr(h_content_type), len);
}
const htp_header_t *h_content_range = htp_tx_response_header(tx, "content-range");
if (h_content_range != NULL) {

@ -72,53 +72,6 @@ char *BytesToString(const uint8_t *bytes, size_t nbytes)
return string;
}
/** \brief Turn byte array into string.
*
* All non-printables are copied over, except for '\0', which is
* turned into literal \0 in the string.
*
* \param bytes byte array
* \param nbytes number of bytes
* \param outstr[out] buffer to fill
* \param outlen size of outstr. Must be at least 2 * nbytes + 1 in size
*/
void BytesToStringBuffer(const uint8_t *bytes, size_t nbytes, char *outstr, size_t outlen)
{
DEBUG_VALIDATE_BUG_ON(outlen < (nbytes * 2 + 1));
size_t n = nbytes + 1;
size_t nulls = 0;
size_t u;
for (u = 0; u < nbytes; u++) {
if (bytes[u] == '\0')
nulls++;
}
n += nulls;
char string[n];
if (nulls == 0) {
/* no nulls */
memcpy(string, bytes, nbytes);
string[nbytes] = '\0';
} else {
/* nulls present */
char *dst = string;
for (u = 0; u < nbytes; u++) {
if (bytes[u] == '\0') {
*dst++ = '\\';
*dst++ = '0';
} else {
*dst++ = bytes[u];
}
}
*dst = '\0';
}
strlcpy(outstr, string, outlen);
}
int ByteExtractUint64(uint64_t *res, int e, uint16_t len, const uint8_t *bytes)
{
uint64_t i64;

@ -81,7 +81,6 @@
* \return string nul-terminated string or NULL on error
*/
char *BytesToString(const uint8_t *bytes, size_t nbytes);
void BytesToStringBuffer(const uint8_t *bytes, size_t nbytes, char *outstr, size_t outlen);
/**
* Extract bytes from a byte string and convert to a unint64_t.

Loading…
Cancel
Save