static const int DATA_BLOCK_SIZE = 16384;
static const int FINAL_BLOCK_SIZE = 24576;
static const int GZIP_BLOCK_SIZE = 2048;
-static const int FINAL_GZIP_BLOCK_SIZE = 2304;
+static const int FINAL_GZIP_BLOCK_SIZE = 2304; // compromise value, too big causes gzip overruns
+ // too small leaves too many little end sections
static const uint32_t NHTTP_GID = 219;
static const int GZIP_WINDOWBITS = 31;
static const int DEFLATE_WINDOWBITS = 15;
const Field Field::FIELD_NULL { STAT_NOSOURCE };
+#ifdef REG_TEST
void Field::print(FILE* output, const char* name) const
{
if ((length == STAT_NOTPRESENT) || (length == STAT_NOTCOMPUTE) || (length == STAT_NOSOURCE))
}
fprintf(output, "\n");
}
+#endif
Field(int32_t length_, const uint8_t* start_) : length(length_), start(start_) { }
explicit Field(int32_t length_) : length(length_) { assert(length<=0); }
Field() = default;
+
+#ifdef REG_TEST
void print(FILE* output, const char* name) const;
+#endif
};
#endif
using namespace NHttpEnums;
-void NHttpMsgBodyChunk::print_section(FILE* output)
-{
- NHttpMsgSection::print_message_title(output, "chunked body");
- fprintf(output, "Cumulative octets %" PRIi64 "\n", body_octets);
- detect_data.print(output, "Detect data");
- NHttpMsgSection::print_message_wrapup(output);
-}
-
void NHttpMsgBodyChunk::update_flow()
{
// Cutter deleted when zero-length chunk received
session_data->section_type[source_id] = SEC__NOTCOMPUTE;
}
+#ifdef REG_TEST
+void NHttpMsgBodyChunk::print_section(FILE* output)
+{
+ NHttpMsgSection::print_message_title(output, "chunked body");
+ fprintf(output, "Cumulative octets %" PRIi64 "\n", body_octets);
+ detect_data.print(output, "Detect data");
+ NHttpMsgSection::print_message_wrapup(output);
+}
+#endif
+
NHttpMsgBodyChunk(const uint8_t* buffer, const uint16_t buf_size, NHttpFlowData* session_data_,
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_, const NHttpParaList* params_)
: NHttpMsgBody(buffer, buf_size, session_data_, source_id_, buf_owner, flow_, params_) {}
- void print_section(FILE* output) override;
void update_flow() override;
+
+#ifdef REG_TEST
+ void print_section(FILE* output) override;
+#endif
};
#endif
using namespace NHttpEnums;
-void NHttpMsgBodyCl::print_section(FILE* output)
-{
- NHttpMsgSection::print_message_title(output, "Content-Length body");
- fprintf(output, "Content-Length %" PRIi64 ", octets seen %" PRIi64 "\n", data_length,
- body_octets);
- detect_data.print(output, "Detect data");
- NHttpMsgSection::print_message_wrapup(output);
-}
-
void NHttpMsgBodyCl::update_flow()
{
if (session_data->cutter[source_id] != nullptr)
session_data->section_type[source_id] = SEC__NOTCOMPUTE;
}
+#ifdef REG_TEST
+void NHttpMsgBodyCl::print_section(FILE* output)
+{
+ NHttpMsgSection::print_message_title(output, "Content-Length body");
+ fprintf(output, "Content-Length %" PRIi64 ", octets seen %" PRIi64 "\n", data_length,
+ body_octets);
+ detect_data.print(output, "Detect data");
+ NHttpMsgSection::print_message_wrapup(output);
+}
+#endif
+
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_, const NHttpParaList* params_)
: NHttpMsgBody(buffer, buf_size, session_data_, source_id_, buf_owner, flow_, params_),
data_length(session_data->data_length[source_id]) {}
- void print_section(FILE* output) override;
void update_flow() override;
+#ifdef REG_TEST
+ void print_section(FILE* output) override;
+#endif
+
protected:
int64_t data_length;
};
return node->norm;
}
+#ifdef REG_TEST
void NHttpMsgHeadShared::print_headers(FILE* output)
{
char title_buf[100];
}
}
}
+#endif
void parse_header_lines();
void derive_header_name_id(int index);
- void print_headers(FILE* output);
-
// All of these are indexed by the relative position of the header field in the message
static const int MAX_HEADERS = 200; // I'm an arbitrary number. FIXIT-L
static const int MAX_HEADER_LENGTH = 4096; // Based on max cookie size of some browsers
NHttpEnums::HeaderId* header_name_id = nullptr;
Field* header_value = nullptr;
+#ifdef REG_TEST
+ void print_headers(FILE* output);
+#endif
+
private:
static const int MAX = NHttpEnums::HEAD__MAX_VALUE;
std::bitset<MAX> headers_present = 0;
transaction->set_header(this, source_id);
}
-void NHttpMsgHeader::print_section(FILE* output)
-{
- NHttpMsgSection::print_message_title(output, "header");
- NHttpMsgHeadShared::print_headers(output);
- NHttpMsgSection::print_message_wrapup(output);
-}
-
void NHttpMsgHeader::update_flow()
{
session_data->section_type[source_id] = SEC__NOTCOMPUTE;
}
}
+#ifdef REG_TEST
+void NHttpMsgHeader::print_section(FILE* output)
+{
+ NHttpMsgSection::print_message_title(output, "header");
+ NHttpMsgHeadShared::print_headers(output);
+ NHttpMsgSection::print_message_wrapup(output);
+}
+#endif
+
NHttpMsgHeader(const uint8_t* buffer, const uint16_t buf_size, NHttpFlowData* session_data_,
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_,
const NHttpParaList* params_);
- void print_section(FILE* output) override;
void update_flow() override;
private:
// Dummy configurations to support MIME processing
void prepare_body();
void setup_file_processing();
void setup_decompression();
+
+#ifdef REG_TEST
+ void print_section(FILE* output) override;
+#endif
};
#endif
events.create_event(EVENT_UNKNOWN_METHOD);
}
+void NHttpMsgRequest::update_flow()
+{
+ // The following logic to determine body type is by no means the last word on this topic.
+ if (infractions & INF_BAD_REQ_LINE)
+ {
+ session_data->type_expected[source_id] = SEC_ABORT;
+ session_data->half_reset(source_id);
+ }
+ else
+ {
+ session_data->type_expected[source_id] = SEC_HEADER;
+ session_data->version_id[source_id] = version_id;
+ session_data->method_id = method_id;
+ session_data->infractions[source_id].reset();
+ session_data->events[source_id].reset();
+ }
+ session_data->section_type[source_id] = SEC__NOTCOMPUTE;
+}
+
+#ifdef REG_TEST
+
void NHttpMsgRequest::print_section(FILE* output)
{
NHttpMsgSection::print_message_title(output, "request line");
NHttpMsgSection::print_message_wrapup(output);
}
-void NHttpMsgRequest::update_flow()
-{
- // The following logic to determine body type is by no means the last word on this topic.
- if (infractions & INF_BAD_REQ_LINE)
- {
- session_data->type_expected[source_id] = SEC_ABORT;
- session_data->half_reset(source_id);
- }
- else
- {
- session_data->type_expected[source_id] = SEC_HEADER;
- session_data->version_id[source_id] = version_id;
- session_data->method_id = method_id;
- session_data->infractions[source_id].reset();
- session_data->events[source_id].reset();
- }
- session_data->section_type[source_id] = SEC__NOTCOMPUTE;
-}
+#endif
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_,
const NHttpParaList* params_);
~NHttpMsgRequest() { delete uri; }
- void print_section(FILE* output) override;
void gen_events() override;
void update_flow() override;
const Field& get_method() { return method; }
const Field& get_uri();
const Field& get_uri_norm_legacy();
+#ifdef REG_TEST
+ void print_section(FILE* output) override;
+#endif
+
private:
static const StrCode method_list[];
delete_msg_on_destruct(buf_owner)
{ }
-void NHttpMsgSection::print_message_title(FILE* output, const char* title) const
-{
- fprintf(output, "HTTP message %s:\n", title);
- msg_text.print(output, "Input");
-}
-
-void NHttpMsgSection::print_message_wrapup(FILE* output)
-{
- fprintf(output, "Infractions: %016" PRIx64 " %016" PRIx64 ", Events: %016" PRIx64 " %016" PRIx64 ", TCP Close: %s\n",
- infractions.get_raw2(), infractions.get_raw(), events.get_raw2(), events.get_raw(), tcp_close ? "True" : "False");
- for (unsigned k=1; k < HTTP_BUFFER_MAX; k++)
- {
- get_legacy(k).print(output, http_buffer_name[k]);
- }
- if (g_file_data.len > 0)
- {
- Field(g_file_data.len, g_file_data.data).print(output, "file_data");
- }
- fprintf(output, "\n");
- session_data->show(output);
- fprintf(output, "\n");
-}
-
void NHttpMsgSection::update_depth() const
{
const int64_t& depth = (session_data->file_depth_remaining[source_id] >=
}
}
+#ifdef REG_TEST
+
+void NHttpMsgSection::print_message_title(FILE* output, const char* title) const
+{
+ fprintf(output, "HTTP message %s:\n", title);
+ msg_text.print(output, "Input");
+}
+
+void NHttpMsgSection::print_message_wrapup(FILE* output)
+{
+ fprintf(output, "Infractions: %016" PRIx64 " %016" PRIx64 ", Events: %016" PRIx64 " %016" PRIx64 ", TCP Close: %s\n",
+ infractions.get_raw2(), infractions.get_raw(), events.get_raw2(), events.get_raw(), tcp_close ? "True" : "False");
+ for (unsigned k=1; k < HTTP_BUFFER_MAX; k++)
+ {
+ get_legacy(k).print(output, http_buffer_name[k]);
+ }
+ if (g_file_data.len > 0)
+ {
+ Field(g_file_data.len, g_file_data.data).print(output, "file_data");
+ }
+ fprintf(output, "\n");
+ session_data->show(output);
+ fprintf(output, "\n");
+}
+
+#endif
+
NHttpEnums::MethodId get_method_id() const { return method_id; }
+#ifdef REG_TEST
// Test tool prints all derived message parts
virtual void print_section(FILE* output) = 0;
+#endif
protected:
NHttpMsgSection(const uint8_t* buffer, const uint16_t buf_size, NHttpFlowData* session_data_,
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_, const NHttpParaList*
params_);
- // Convenience methods
- void print_message_title(FILE* output, const char* title) const;
- void print_message_wrapup(FILE* output);
- void update_depth() const;
-
const Field msg_text;
NHttpFlowData* const session_data;
NHttpEnums::MethodId method_id;
int32_t status_code_num;
+ // Convenience methods
+ void update_depth() const;
+#ifdef REG_TEST
+ void print_message_title(FILE* output, const char* title) const;
+ void print_message_wrapup(FILE* output);
+#endif
+
private:
const bool delete_msg_on_destruct;
};
}
}
-void NHttpMsgStatus::print_section(FILE* output)
-{
- NHttpMsgSection::print_message_title(output, "status line");
- fprintf(output, "Version Id: %d\n", version_id);
- fprintf(output, "Status Code Num: %d\n", status_code_num);
- reason_phrase.print(output, "Reason Phrase");
- NHttpMsgSection::print_message_wrapup(output);
-}
-
void NHttpMsgStatus::update_flow()
{
// The following logic to determine body type is by no means the last word on this topic.
session_data->section_type[source_id] = SEC__NOTCOMPUTE;
}
+#ifdef REG_TEST
+void NHttpMsgStatus::print_section(FILE* output)
+{
+ NHttpMsgSection::print_message_title(output, "status line");
+ fprintf(output, "Version Id: %d\n", version_id);
+ fprintf(output, "Status Code Num: %d\n", status_code_num);
+ reason_phrase.print(output, "Reason Phrase");
+ NHttpMsgSection::print_message_wrapup(output);
+}
+#endif
+
NHttpMsgStatus(const uint8_t* buffer, const uint16_t buf_size, NHttpFlowData* session_data_,
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_,
const NHttpParaList* params_);
- void print_section(FILE* output) override;
void gen_events() override;
void update_flow() override;
const Field& get_status_code() { return status_code; }
const Field& get_reason_phrase() { return reason_phrase; }
+#ifdef REG_TEST
+ void print_section(FILE* output) override;
+#endif
+
private:
void parse_start_line() override;
void derive_status_code_num();
transaction->set_trailer(this, source_id);
}
-void NHttpMsgTrailer::print_section(FILE* output)
-{
- NHttpMsgSection::print_message_title(output, "trailer");
- NHttpMsgHeadShared::print_headers(output);
- NHttpMsgSection::print_message_wrapup(output);
-}
-
void NHttpMsgTrailer::update_flow()
{
session_data->type_expected[source_id] =
session_data->section_type[source_id] = SEC__NOTCOMPUTE;
}
+#ifdef REG_TEST
+void NHttpMsgTrailer::print_section(FILE* output)
+{
+ NHttpMsgSection::print_message_title(output, "trailer");
+ NHttpMsgHeadShared::print_headers(output);
+ NHttpMsgSection::print_message_wrapup(output);
+}
+#endif
+
NHttpMsgTrailer(const uint8_t* buffer, const uint16_t buf_size, NHttpFlowData* session_data_,
NHttpEnums::SourceId source_id_, bool buf_owner, Flow* flow_,
const NHttpParaList* params_);
- void print_section(FILE* output) override;
void update_flow() override;
+
+#ifdef REG_TEST
+ void print_section(FILE* output) override;
+#endif
};
#endif
//--------------------------------------------------------------------------
// nhttp_test_input.cc author Tom Peters <thopeter@cisco.com>
+#ifdef REG_TEST
+
#include <assert.h>
#include <stdexcept>
just_flushed = true;
flushed = false;
}
+#endif
#ifndef NHTTP_TEST_INPUT_H
#define NHTTP_TEST_INPUT_H
+#ifdef REG_TEST
+
#include <stdio.h>
#include "nhttp_enum.h"
};
#endif
+#endif
//--------------------------------------------------------------------------
// nhttp_test_manager.cc author Tom Peters <thopeter@cisco.com>
+#ifdef REG_TEST
+
#include <stdexcept>
#include "nhttp_test_manager.h"
}
}
+#endif
+
#ifndef NHTTP_TEST_MANAGER_H
#define NHTTP_TEST_MANAGER_H
+#ifdef REG_TEST
+
#include <sys/types.h>
#include <stdio.h>
};
#endif
+#endif