mirror of https://github.com/OISF/suricata
You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
124 lines
2.7 KiB
C
124 lines
2.7 KiB
C
/*
|
|
* LibHTP (http://www.libhtp.org)
|
|
* Copyright 2009,2010 Ivan Ristic <ivanr@webkreator.com>
|
|
*
|
|
* LibHTP is an open source product, released under terms of the General Public Licence
|
|
* version 2 (GPLv2). Please refer to the file LICENSE, which contains the complete text
|
|
* of the license.
|
|
*
|
|
* In addition, there is a special exception that allows LibHTP to be freely
|
|
* used with any OSI-approved open source licence. Please refer to the file
|
|
* LIBHTP_LICENSING_EXCEPTION for the full text of the exception.
|
|
*
|
|
*/
|
|
|
|
#include "htp.h"
|
|
|
|
#if 0
|
|
|
|
/**
|
|
*
|
|
*/
|
|
int htp_header_parse_internal_strict(unsigned char *data, size_t len, htp_header_t *h) {
|
|
size_t name_start, name_end;
|
|
size_t value_start, value_end;
|
|
|
|
// Deal with the name first
|
|
name_start = name_end = 0;
|
|
|
|
// Find where the header name ends
|
|
while (name_end < len) {
|
|
if (htp_is_lws(data[name_end]) || data[name_end] == ':') break;
|
|
name_end++;
|
|
}
|
|
|
|
if (name_end == 0) {
|
|
// Empty header name
|
|
return -1;
|
|
}
|
|
|
|
if (name_end == len) {
|
|
// TODO
|
|
return -1;
|
|
}
|
|
|
|
// Is there any LWS before colon?
|
|
size_t pos = name_end;
|
|
while (pos < len) {
|
|
if (!htp_is_lws(data[pos])) break;
|
|
pos++;
|
|
// TODO
|
|
// return -1;
|
|
}
|
|
|
|
if (pos == len) {
|
|
// TODO
|
|
return -1;
|
|
}
|
|
|
|
// The next character must be a colon
|
|
if (data[pos] != ':') {
|
|
// TODO
|
|
return -1;
|
|
}
|
|
|
|
// Move over the colon
|
|
pos++;
|
|
|
|
// Again, ignore any LWS
|
|
while (pos < len) {
|
|
if (!htp_is_lws(data[pos])) break;
|
|
pos++;
|
|
}
|
|
|
|
if (pos == len) {
|
|
// TODO
|
|
return -1;
|
|
}
|
|
|
|
value_start = value_end = pos;
|
|
|
|
while (value_end < len) {
|
|
if (htp_is_lws(data[value_end])) break;
|
|
value_end++;
|
|
}
|
|
|
|
h->name_offset = name_start;
|
|
h->name_len = name_end - name_start;
|
|
h->value_offset = value_start;
|
|
h->value_len = value_end - value_start;
|
|
|
|
return 1;
|
|
}
|
|
*/
|
|
|
|
/**
|
|
*
|
|
*/
|
|
htp_header_t *htp_connp_header_parse(htp_connp_t *reqp, unsigned char *data, size_t len) {
|
|
htp_header_t *h = calloc(1, sizeof (htp_header_t));
|
|
if (h == NULL) return NULL;
|
|
|
|
// Parse the header line
|
|
if (reqp->impl_header_parse(data, len, h) < 0) {
|
|
// Invalid header line
|
|
h->is_parsed = 0;
|
|
h->name = bstr_memdup(data, len);
|
|
|
|
return h;
|
|
}
|
|
|
|
// Now extract the name and the value
|
|
h->name = bstr_memdup(data + h->name_offset, h->name_len);
|
|
h->value = bstr_memdup(data + h->value_offset, h->value_len);
|
|
h->is_parsed = 1;
|
|
|
|
// Because header names are case-insensitive, we will convert
|
|
// the name to lowercase to use it as a lookup key.
|
|
h->name_lowercase = bstr_tolowercase(h->name);
|
|
|
|
return h;
|
|
}
|
|
|
|
#endif
|