INF_CHUNK_BAD_END,
INF_PARTIAL_START,
INF_CHUNK_WHITESPACE,
+ INF_HEAD_NAME_WHITESPACE,
INF__MAX_VALUE
};
EVENT_URI_BAD_PORT,
EVENT_BROKEN_CHUNK,
EVENT_CHUNK_WHITESPACE,
+ EVENT_HEAD_NAME_WHITESPACE,
EVENT__MAX_VALUE
};
{
*working++ = ',';
data_length++;
- while (header_name_id[++curr_match] != head_id)
- ;
+ while (header_name_id[++curr_match] != head_id);
}
int32_t growth = derive_header_content(header_value[curr_match].start,
header_value[curr_match].length, working);
void NHttpMsgHeadShared::derive_header_name_id(int index)
{
- // Normalize header field name to lower case for matching purposes
+ const int32_t& length = header_name[index].length;
+ const uint8_t*& buffer = header_name[index].start;
+
+ // Normalize header field name to lower case and remove LWS for matching purposes
+ int32_t lower_length = 0;
uint8_t* lower_name;
- if ((lower_name = scratch_pad.request(header_name[index].length)) == nullptr)
+ if ((lower_name = scratch_pad.request(length)) == nullptr)
{
infractions += INF_NO_SCRATCH;
header_name_id[index] = HEAD__INSUFMEMORY;
return;
}
- norm_to_lower(header_name[index].start, header_name[index].length, lower_name, infractions,
- events, nullptr);
- header_name_id[index] = (HeaderId)str_to_code(lower_name, header_name[index].length,
- header_list);
+ for (int32_t k=0; k < length; k++)
+ {
+ if (!is_sp_tab[buffer[k]])
+ {
+ lower_name[lower_length++] = ((buffer[k] < 'A') || (buffer[k] > 'Z')) ?
+ buffer[k] : buffer[k] - ('A' - 'a');
+ }
+ else
+ {
+ infractions += INF_HEAD_NAME_WHITESPACE;
+ events.create_event(EVENT_HEAD_NAME_WHITESPACE);
+ }
+ }
+ header_name_id[index] = (HeaderId)str_to_code(lower_name, lower_length, header_list);
}
NHttpMsgHeadShared::NormalizedHeader* NHttpMsgHeadShared::get_header_node(HeaderId header_id) const
static const HeaderNormalizer NORMALIZER_NIL;
static const HeaderNormalizer NORMALIZER_BASIC;
static const HeaderNormalizer NORMALIZER_CAT;
+ static const HeaderNormalizer NORMALIZER_COOKIE;
static const HeaderNormalizer NORMALIZER_NOREPEAT;
static const HeaderNormalizer NORMALIZER_DECIMAL;
static const HeaderNormalizer NORMALIZER_TRANSCODE;
return (body != nullptr) ? body->get_detect_data() : Field::FIELD_NULL;
}
case HTTP_BUFFER_COOKIE:
+ case HTTP_BUFFER_RAW_COOKIE:
+ // FIXIT-M when real cookie normalization is implemented these need to become separate cases.
+ // Currently "normalization" is aggregation of multiple cookies. That is correct for raw
+ // cookies and all there is for normalized cookies.
{
NHttpMsgHeadShared* header = transaction->get_latest_header(source_id);
if (header == nullptr)
NHttpMsgRequest* request = transaction->get_request();
return (request != nullptr) ? request->get_method() : Field::FIELD_NULL;
}
- case HTTP_BUFFER_RAW_COOKIE:
- {
- NHttpMsgHeadShared* header = transaction->get_latest_header(source_id);
- if (header == nullptr)
- return Field::FIELD_NULL;
- HeaderId cookie_head = (source_id == SRC_CLIENT) ? HEAD_COOKIE : HEAD_SET_COOKIE;
- // FIXIT-M there can be multiple cookie header in one message.
- for (int k=0; k < header->get_num_headers(); k++)
- {
- if (header->get_header_name_id(k) == cookie_head)
- {
- return header->get_header_value(k);
- }
- }
- return Field::FIELD_NULL;
- }
case HTTP_BUFFER_RAW_HEADER:
{
NHttpMsgHeadShared* header = transaction->get_latest_header(source_id);
int32_t length = 0;
for (int32_t k = 0; k < in_length; k++)
{
- if ((in_buf[k] != ' ') && (in_buf[k] != '\t'))
+ if (!is_sp_tab[in_buf[k]])
out_buf[length++] = in_buf[k];
}
return length;
const HeaderNormalizer NHttpMsgHeadShared::NORMALIZER_CAT
{ NORM_FIELD, true, norm_remove_lws, nullptr, nullptr, nullptr, nullptr, nullptr };
+const HeaderNormalizer NHttpMsgHeadShared::NORMALIZER_COOKIE
+{ NORM_FIELD, true, nullptr, nullptr, nullptr, nullptr, nullptr, nullptr };
+
const HeaderNormalizer NHttpMsgHeadShared::NORMALIZER_DECIMAL
{ NORM_INT64, false, norm_decimal_integer, nullptr, nullptr, nullptr, nullptr, nullptr };
[HEAD_DATE] = &NORMALIZER_BASIC,
[HEAD_PRAGMA] = &NORMALIZER_BASIC,
[HEAD_TRAILER] = &NORMALIZER_BASIC,
- [HEAD_COOKIE] = &NORMALIZER_BASIC,
- [HEAD_SET_COOKIE] = &NORMALIZER_BASIC,
+ [HEAD_COOKIE] = &NORMALIZER_COOKIE,
+ [HEAD_SET_COOKIE] = &NORMALIZER_COOKIE,
[HEAD_TRANSFER_ENCODING] = &NORMALIZER_TRANSCODE,
[HEAD_UPGRADE] = &NORMALIZER_BASIC,
[HEAD_VIA] = &NORMALIZER_BASIC,