diff --git a/headers/modsecurity/transaction.h b/headers/modsecurity/transaction.h index 3e70caa38e..23374d6d0c 100644 --- a/headers/modsecurity/transaction.h +++ b/headers/modsecurity/transaction.h @@ -397,7 +397,7 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa bool addArgument(const std::string& orig, const std::string& key, const std::string& value, size_t offset); bool extractArguments(const std::string &orig, const std::string& buf, - size_t offset); + size_t offset, bool partial_processing_enabled = false); const char *getResponseBody() const; size_t getResponseBodyLength(); @@ -645,6 +645,11 @@ class Transaction : public TransactionAnchoredVariables, public TransactionSecMa * the web server (connector) log. */ void *m_logCbData; + + /** + * Whether the request body was bigger than RequestBodyLimit. + */ + bool m_requestBodyLimitExceeded; }; diff --git a/src/request_body_processor/json.cc b/src/request_body_processor/json.cc index f56704effa..81e910cc0f 100644 --- a/src/request_body_processor/json.cc +++ b/src/request_body_processor/json.cc @@ -29,7 +29,8 @@ namespace RequestBodyProcessor { static const double json_depth_limit_default = 10000.0; static const char* json_depth_limit_exceeded_msg = ". Parsing depth limit exceeded"; -JSON::JSON(Transaction *transaction) : m_transaction(transaction), +JSON::JSON(Transaction *transaction) + : m_transaction(transaction), m_handle(NULL), m_current_key(""), m_max_depth(json_depth_limit_default), @@ -68,8 +69,6 @@ JSON::JSON(Transaction *transaction) : m_transaction(transaction), * TODO: make UTF8 validation optional, as it depends on Content-Encoding */ m_handle = yajl_alloc(&callbacks, NULL, this); - - yajl_config(m_handle, yajl_allow_partial_values, 0); } @@ -83,7 +82,8 @@ JSON::~JSON() { } -bool JSON::init() { +bool JSON::init(unsigned int allow_partial_values) { + yajl_config(m_handle, yajl_allow_partial_values, allow_partial_values); return true; } diff --git a/src/request_body_processor/json.h b/src/request_body_processor/json.h index 961ea94ea8..7a2c2b505b 100644 --- a/src/request_body_processor/json.h +++ b/src/request_body_processor/json.h @@ -60,7 +60,7 @@ class JSON { explicit JSON(Transaction *transaction); ~JSON(); - static bool init(); + bool init(unsigned int allow_partial_values = 0); bool processChunk(const char *buf, unsigned int size, std::string *err); bool complete(std::string *err); diff --git a/src/request_body_processor/multipart.cc b/src/request_body_processor/multipart.cc index 3ae591671e..3b53c7ab91 100644 --- a/src/request_body_processor/multipart.cc +++ b/src/request_body_processor/multipart.cc @@ -121,6 +121,7 @@ Multipart::Multipart(const std::string &header, Transaction *transaction) m_reserve{0}, m_seen_data(0), m_is_complete(0), + m_allow_partial(false), m_flag_error(0), m_flag_data_before(0), m_flag_data_after(0), @@ -1151,53 +1152,108 @@ int Multipart::multipart_complete(std::string *error) { * processed yet) in the buffer. */ if (m_buf_contains_line) { - if (((unsigned int)(MULTIPART_BUF_SIZE - m_bufleft) - == (4 + m_boundary.size())) + /* + * Note that the buffer may end with the final boundary followed by only CR, + * coming from the [CRLF epilogue], when allow_process_partial == 1 (which is + * set when SecRequestBodyLimitAction is ProcessPartial and the request body + * length exceeds SecRequestBodyLimit). + * + * The following definitions are copied from RFC 2046: + * + * dash-boundary := "--" boundary + * + * delimiter := CRLF dash-boundary + * + * close-delimiter := delimiter "--" + * + * multipart-body := [preamble CRLF] + * dash-boundary transport-padding CRLF + * body-part *encapsulation + * close-delimiter transport-padding + * [CRLF epilogue] + */ + unsigned int buf_data_len = (unsigned int)(MULTIPART_BUF_SIZE - m_bufleft); + if ((buf_data_len >= 2 + m_boundary.size()) && (*(m_buf) == '-') && (*(m_buf + 1) == '-') && (strncmp(m_buf + 2, m_boundary.c_str(), - m_boundary.size()) == 0) - && (*(m_buf + 2 + m_boundary.size()) == '-') - && (*(m_buf + 2 + m_boundary.size() + 1) == '-')) { - // these next two checks may result in repeating work from earlier in this fn - // ignore the duplication for now to minimize refactoring - if ((m_crlf_state_buf_end == 2) && (m_flag_lf_line != 1)) { - m_flag_lf_line = 1; - m_transaction->m_variableMultipartLFLine.set(std::to_string(m_flag_lf_line), - m_transaction->m_variableOffset); - m_transaction->m_variableMultipartCrlfLFLines.set(std::to_string(m_flag_crlf_line && m_flag_lf_line), - m_transaction->m_variableOffset); - if (m_flag_crlf_line && m_flag_lf_line) { - ms_dbg_a(m_transaction, 4, "Multipart: Warning: mixed line endings used (CRLF/LF)."); - } else if (m_flag_lf_line) { - ms_dbg_a(m_transaction, 4, "Multipart: Warning: incorrect line endings used (LF)."); + m_boundary.size()) == 0)) { + if ((buf_data_len >= 2 + m_boundary.size() + 2) + && (*(m_buf + 2 + m_boundary.size()) == '-') + && (*(m_buf + 2 + m_boundary.size() + 1) == '-')) { + /* If body fits in limit and ends with final boundary plus just CR, reject it. */ + if ( (m_allow_partial == 0) + && (buf_data_len == 2 + m_boundary.size() + 2 + 1) + && (*(m_buf + 2 + m_boundary.size() + 2) == '\r') ) { + ms_dbg_a(m_transaction, 1, + "Multipart: Invalid epilogue after final boundary."); + error->assign("Multipart: Invalid epilogue after final boundary."); + return false; + } + // these next two checks may result in repeating work from earlier in this fn + // ignore the duplication for now to minimize refactoring + if ((m_crlf_state_buf_end == 2) && (m_flag_lf_line != 1)) { + m_flag_lf_line = 1; + m_transaction->m_variableMultipartLFLine.set(std::to_string(m_flag_lf_line), + m_transaction->m_variableOffset); + m_transaction->m_variableMultipartCrlfLFLines.set(std::to_string(m_flag_crlf_line && m_flag_lf_line), + m_transaction->m_variableOffset); + if (m_flag_crlf_line && m_flag_lf_line) { + ms_dbg_a(m_transaction, 4, "Multipart: Warning: mixed line endings used (CRLF/LF)."); + } else if (m_flag_lf_line) { + ms_dbg_a(m_transaction, 4, "Multipart: Warning: incorrect line endings used (LF)."); + } + m_transaction->m_variableMultipartStrictError.set( + std::to_string(m_flag_lf_line) , m_transaction->m_variableOffset); + } + if ((m_mpp_substate_part_data_read == 0) && (m_flag_invalid_part != 1)) { + // it looks like the final boundary, but it's where part data should begin + m_flag_invalid_part = 1; + ms_dbg_a(m_transaction, 3, "Multipart: Invalid part (data contains final boundary)"); + m_transaction->m_variableMultipartStrictError.set( + std::to_string(m_flag_invalid_part) , m_transaction->m_variableOffset); + m_transaction->m_variableMultipartInvalidPart.set(std::to_string(m_flag_invalid_part), + m_transaction->m_variableOffset); + ms_dbg_a(m_transaction, 4, "Multipart: Warning: invalid part parsing."); } - m_transaction->m_variableMultipartStrictError.set( - std::to_string(m_flag_lf_line) , m_transaction->m_variableOffset); - } - if ((m_mpp_substate_part_data_read == 0) && (m_flag_invalid_part != 1)) { - // it looks like the final boundary, but it's where part data should begin - m_flag_invalid_part = 1; - ms_dbg_a(m_transaction, 3, "Multipart: Invalid part (data contains final boundary)"); - m_transaction->m_variableMultipartStrictError.set( - std::to_string(m_flag_invalid_part) , m_transaction->m_variableOffset); - m_transaction->m_variableMultipartInvalidPart.set(std::to_string(m_flag_invalid_part), - m_transaction->m_variableOffset); - ms_dbg_a(m_transaction, 4, "Multipart: Warning: invalid part parsing."); - } - /* Looks like the final boundary - process it. */ - if (process_boundary(1 /* final */) < 0) { - m_flag_error = 1; - return -1; - } + /* Looks like the final boundary - process it. */ + if (process_boundary(1 /* final */) < 0) { + m_flag_error = 1; + return -1; + } - /* The payload is complete after all. */ - m_is_complete = 1; + /* The payload is complete after all. */ + m_is_complete = 1; + } else if (m_allow_partial) { + if (buf_data_len >= 2 + m_boundary.size() + 1) { + if (*(m_buf + 2 + m_boundary.size()) == '-') { + if ((buf_data_len >= 2 + m_boundary.size() + 2) + && (*(m_buf + 2 + m_boundary.size() + 1) != '-')) { + ms_dbg_a(m_transaction, 1, + "Multipart: Invalid final boundary."); + error->assign("Multipart: Invalid final boundary."); + return false; + } + } else if ((*(m_buf + 2 + m_boundary.size()) != '\r') + || ((buf_data_len >= 2 + m_boundary.size() + 2) + && (*(m_buf + 2 + m_boundary.size() + 1) != '\n'))) { + ms_dbg_a(m_transaction, 1, + "Multipart: Invalid boundary."); + error->assign("Multipart: Invalid boundary."); + return false; + } + } + /* process it as a non-final boundary to avoid building a new part. */ + if (process_boundary(0) < 0) { + m_flag_error = 1; + return -1; + } + } } } - if (m_is_complete == 0) { + if (m_is_complete == 0 && !m_allow_partial) { ms_dbg_a(m_transaction, 1, "Multipart: Final boundary missing."); error->assign("Multipart: Final boundary missing."); @@ -1563,7 +1619,7 @@ bool Multipart::process(const std::string& data, std::string *error, m_boundary.size()) == 0)) { if (m_crlf_state_buf_end == 2) { m_flag_lf_line = 1; - } + } if ((m_mpp_substate_part_data_read == 0) && (m_boundary_count > 0)) { /* string matches our boundary, but it's where part data should begin */ m_flag_invalid_part = 1; diff --git a/src/request_body_processor/multipart.h b/src/request_body_processor/multipart.h index bfada4b979..083b423470 100644 --- a/src/request_body_processor/multipart.h +++ b/src/request_body_processor/multipart.h @@ -228,6 +228,7 @@ class Multipart { int m_seen_data; int m_is_complete; + bool m_allow_partial; int m_flag_error; int m_flag_data_before; diff --git a/src/request_body_processor/xml.cc b/src/request_body_processor/xml.cc index cbb7894c9b..8cd169eb16 100644 --- a/src/request_body_processor/xml.cc +++ b/src/request_body_processor/xml.cc @@ -150,7 +150,7 @@ extern "C" { } XML::XML(Transaction *transaction) - : m_transaction(transaction) { + : m_transaction(transaction), m_require_well_formed(false) { m_data.doc = NULL; m_data.parsing_ctx = NULL; m_data.sax_handler = NULL; @@ -171,7 +171,8 @@ XML::~XML() { } } -bool XML::init() { +bool XML::init(bool require_well_formed) { + m_require_well_formed = require_well_formed; //xmlParserInputBufferCreateFilenameFunc entity; if (m_transaction->m_rules->m_secXMLExternalEntity == RulesSetProperties::TrueConfigBoolean) { @@ -280,7 +281,7 @@ bool XML::processChunk(const char *buf, unsigned int size, != RulesSetProperties::OnlyArgsConfigXMLParseXmlIntoArgs) { xmlParseChunk(m_data.parsing_ctx, buf, size, 0); m_data.xml_parser_state->parsing_ctx_arg = m_data.parsing_ctx_arg; - if (m_data.parsing_ctx->wellFormed != 1) { + if (m_require_well_formed && m_data.parsing_ctx->wellFormed != 1) { error->assign("XML: Failed to parse document."); ms_dbg_a(m_transaction, 4, "XML: Failed to parse document."); return false; @@ -296,7 +297,7 @@ bool XML::processChunk(const char *buf, unsigned int size, == RulesSetProperties::TrueConfigXMLParseXmlIntoArgs) ) { xmlParseChunk(m_data.parsing_ctx_arg, buf, size, 0); - if (m_data.parsing_ctx_arg->wellFormed != 1) { + if (m_require_well_formed && m_data.parsing_ctx_arg->wellFormed != 1) { error->assign("XML: Failed to parse document for ARGS."); ms_dbg_a(m_transaction, 4, "XML: Failed to parse document for ARGS."); return false; @@ -326,7 +327,7 @@ bool XML::complete(std::string *error) { ms_dbg_a(m_transaction, 4, "XML: Parsing complete (well_formed " \ + std::to_string(m_data.well_formed) + ")."); - if (m_data.well_formed != 1) { + if (m_require_well_formed && m_data.well_formed != 1) { error->assign("XML: Failed to parse document."); ms_dbg_a(m_transaction, 4, "XML: Failed to parse document."); return false; diff --git a/src/request_body_processor/xml.h b/src/request_body_processor/xml.h index df766d03b7..b3618ed48f 100644 --- a/src/request_body_processor/xml.h +++ b/src/request_body_processor/xml.h @@ -87,7 +87,7 @@ class XML { public: explicit XML(Transaction *transaction); ~XML(); - bool init(); + bool init(bool require_well_formed = true); bool processChunk(const char *buf, unsigned int size, std::string *err); bool complete(std::string *err); static xmlParserInputBufferPtr unloadExternalEntity(const char *URI, @@ -98,6 +98,7 @@ class XML { private: Transaction *m_transaction; std::string m_header; + bool m_require_well_formed; }; #endif diff --git a/src/transaction.cc b/src/transaction.cc index 6c8ae9744c..5e356f683b 100644 --- a/src/transaction.cc +++ b/src/transaction.cc @@ -150,6 +150,7 @@ Transaction::Transaction(ModSecurity *ms, RulesSet *rules, const char *id, m_secRuleEngine(RulesSetProperties::PropertyNotSetRuleEngine), m_secXMLParseXmlIntoArgs(rules->m_secXMLParseXmlIntoArgs), m_logCbData(logCbData), + m_requestBodyLimitExceeded(false), TransactionAnchoredVariables(this) { m_variableUrlEncodedError.set("0", 0); m_variableMscPcreError.set("0", 0); @@ -252,12 +253,15 @@ int Transaction::processConnection(const char *client, int cPort, bool Transaction::extractArguments(const std::string &orig, - const std::string& buf, size_t offset) { + const std::string& buf, size_t offset, bool partial_processing_enabled) { char sep1 = '&'; if (m_rules->m_secArgumentSeparator.m_set) { sep1 = m_rules->m_secArgumentSeparator.m_value.at(0); } - const auto key_value_sets = utils::string::ssplit(buf, sep1); + auto key_value_sets = utils::string::ssplit(buf, sep1); + if (partial_processing_enabled && (buf.empty() || buf.back() != sep1)) { + key_value_sets.pop_back(); + } for (const auto &t : key_value_sets) { const auto sep2 = '='; @@ -694,27 +698,36 @@ int Transaction::processRequestBody() { std::unique_ptr a = m_variableRequestHeaders.resolveFirst( "Content-Type"); + bool is_process_partial = (m_rules->m_requestBodyLimitAction + == RulesSet::BodyLimitAction::ProcessPartialBodyLimitAction); + bool requestBodyNoFilesLimitExceeded = false; if ((m_requestBodyType == WWWFormUrlEncoded) || (m_requestBodyProcessor == JSONRequestBody) || (m_requestBodyProcessor == XMLRequestBody)) { if ((m_rules->m_requestBodyNoFilesLimit.m_set) && (m_requestBody.str().size() > m_rules->m_requestBodyNoFilesLimit.m_value)) { - m_variableReqbodyError.set("1", 0); - m_variableReqbodyErrorMsg.set("Request body excluding files is bigger than the maximum expected.", 0); - m_variableInboundDataError.set("1", m_variableOffset); - ms_dbg(5, "Request body excluding files is bigger than the maximum expected. Limit: " \ - + std::to_string(m_rules->m_requestBodyNoFilesLimit.m_value)); + if (!is_process_partial) { + m_variableReqbodyError.set("1", 0); + m_variableReqbodyErrorMsg.set("Request body excluding files is bigger than the maximum expected.", 0); + m_variableInboundDataError.set("1", m_variableOffset); + ms_dbg(5, "Request body excluding files is bigger than the maximum expected. Limit: " \ + + std::to_string(m_rules->m_requestBodyNoFilesLimit.m_value)); + } requestBodyNoFilesLimitExceeded = true; - } + } } #ifdef WITH_LIBXML2 if (m_requestBodyProcessor == XMLRequestBody) { // large size might cause issues in the parsing itself; omit if exceeded - if (!requestBodyNoFilesLimitExceeded) { + if (!requestBodyNoFilesLimitExceeded || is_process_partial) { std::string error; - if (m_xml->init() == true) { + bool require_well_formed = !(is_process_partial && m_requestBodyLimitExceeded); + if (!require_well_formed) { + ms_dbg(4, "XML: Allow partial processing of request body"); + } + if (m_xml->init(require_well_formed) == true) { m_xml->processChunk(m_requestBody.str().c_str(), m_requestBody.str().size(), &error); @@ -740,12 +753,16 @@ int Transaction::processRequestBody() { if (m_requestBodyProcessor == JSONRequestBody) { #endif // large size might cause issues in the parsing itself; omit if exceeded - if (!requestBodyNoFilesLimitExceeded) { + if (!requestBodyNoFilesLimitExceeded || is_process_partial) { std::string error; if (m_rules->m_requestBodyJsonDepthLimit.m_set) { m_json->setMaxDepth(m_rules->m_requestBodyJsonDepthLimit.m_value); } - if (m_json->init() == true) { + unsigned int allow_partial_values = is_process_partial && m_requestBodyLimitExceeded; + if (allow_partial_values) { + ms_dbg(4, "JSON: Allow partial processing of request body"); + } + if (m_json->init(allow_partial_values) == true) { m_json->processChunk(m_requestBody.str().c_str(), m_requestBody.str().size(), &error); @@ -774,6 +791,10 @@ int Transaction::processRequestBody() { if (a != NULL) { Multipart m(*a, this); if (m.init(&error) == true) { + m.m_allow_partial = is_process_partial && m_requestBodyLimitExceeded; + if (m.m_allow_partial) { + ms_dbg(4, "Multipart: Allow partial processing of request body"); + } m.process(m_requestBody.str(), &error, m_variableOffset); } reqbodyNoFilesLength = m.m_reqbody_no_files_length; @@ -800,9 +821,10 @@ int Transaction::processRequestBody() { } else if (m_requestBodyType == WWWFormUrlEncoded) { m_variableOffset++; // large size might cause issues in the parsing itself; omit if exceeded - if (!requestBodyNoFilesLimitExceeded) { - extractArguments("POST", m_requestBody.str(), m_variableOffset); - } + if (!requestBodyNoFilesLimitExceeded || is_process_partial) { + bool partial_processing_enabled = is_process_partial && m_requestBodyLimitExceeded; + extractArguments("POST", m_requestBody.str(), m_variableOffset, partial_processing_enabled); + } } else if (m_requestBodyType != UnknownFormat) { /** * FIXME: double check to see if that is a valid scenario... @@ -935,6 +957,7 @@ int Transaction::appendRequestBody(const unsigned char *buf, size_t len) { if (this->m_rules->m_requestBodyLimit.m_value > 0 && this->m_rules->m_requestBodyLimit.m_value < len + current_size) { + m_requestBodyLimitExceeded = true; m_variableInboundDataError.set("1", m_variableOffset); ms_dbg(5, "Request body is bigger than the maximum expected."); diff --git a/test/common/modsecurity_test.cc b/test/common/modsecurity_test.cc index 21af285d55..885595de88 100644 --- a/test/common/modsecurity_test.cc +++ b/test/common/modsecurity_test.cc @@ -143,6 +143,12 @@ void ModSecurityTest::cmd_options(int argc, char **argv) { if (std::getenv("AUTOMAKE_TESTS")) { m_automake_output = true; } + if (std::getenv("ALWAYS_SHOW_LOG")) { + m_always_show_log = true; + } + if (std::getenv("SHOW_REQUEST_BODY_SIZE")) { + m_show_request_body_size = true; + } if (argc > i && argv[i]) { this->target = argv[i]; diff --git a/test/common/modsecurity_test.h b/test/common/modsecurity_test.h index e7a8b1b3e5..34a6af9951 100644 --- a/test/common/modsecurity_test.h +++ b/test/common/modsecurity_test.h @@ -35,7 +35,9 @@ template class ModSecurityTest : : m_test_number(0), m_automake_output(false), m_count_all(false), - m_test_multithreaded(false) { } + m_test_multithreaded(false), + m_always_show_log(false), + m_show_request_body_size(false) { } std::string header(); void cmd_options(int, char **); @@ -50,6 +52,8 @@ template class ModSecurityTest : bool m_automake_output; bool m_count_all; bool m_test_multithreaded; + bool m_always_show_log; + bool m_show_request_body_size; }; } // namespace modsecurity_test diff --git a/test/regression/regression.cc b/test/regression/regression.cc index ba37f76dfb..ce95dc1067 100644 --- a/test/regression/regression.cc +++ b/test/regression/regression.cc @@ -296,6 +296,10 @@ void perform_unit_test(const ModSecurityTest &test, modsec_transaction.appendRequestBody( (unsigned char *)t->request_body.c_str(), t->request_body.size()); + if (test.m_show_request_body_size) { + std::cout << std::endl << "[Debug] appended request body size: " \ + << t->request_body.size() << std::endl; + } modsec_transaction.processRequestBody(); actions(&r, &modsec_transaction, &context.m_server_log); @@ -311,6 +315,7 @@ void perform_unit_test(const ModSecurityTest &test, modsec_transaction.appendResponseBody( (unsigned char *)t->response_body.c_str(), t->response_body.size()); + modsec_transaction.processResponseBody(); actions(&r, &modsec_transaction, &context.m_server_log); @@ -375,7 +380,7 @@ void perform_unit_test(const ModSecurityTest &test, testRes->passed = true; } - if (testRes->passed == false) { + if (!testRes->passed || test.m_always_show_log) { testRes->reason << std::endl; testRes->reason << KWHT << "Debug log:" << RESET << std::endl; testRes->reason << d->log_messages() << std::endl; @@ -507,6 +512,17 @@ int main(int argc, char **argv) std::cout << r->reason.str() << std::endl; } failed++; + } else if (test.m_always_show_log && r->passed) { + if (!test.m_automake_output) { + std::cout << KGRN << "Test passed." << RESET << KWHT \ + << " From: " \ + << RESET << r->test->filename << "." << std::endl; + std::cout << KWHT << "Test name: " << RESET \ + << r->test->name \ + << "." << std::endl; + std::cout << KWHT << "Logs: " << RESET << std::endl; + std::cout << r->reason.str() << std::endl; + } } delete r; } diff --git a/test/regression/regression_test.cc b/test/regression/regression_test.cc index 01ad2aacc9..8df1d1c035 100644 --- a/test/regression/regression_test.cc +++ b/test/regression/regression_test.cc @@ -48,7 +48,7 @@ inline std::string RegressionTest::yajl_array_to_str(const yajl_val &node) { for (int z = 0; z < node->u.array.len; z++) { yajl_val val3 = node->u.array.values[z]; const char *key = YAJL_GET_STRING(val3); - i << key << "\n"; + i << key; } return i.str(); } diff --git a/test/test-cases/regression/action-ctl_audit_engine.json b/test/test-cases/regression/action-ctl_audit_engine.json index 3848ee7e55..7cf1a62b11 100644 --- a/test/test-cases/regression/action-ctl_audit_engine.json +++ b/test/test-cases/regression/action-ctl_audit_engine.json @@ -28,7 +28,7 @@ "uri": "\/test.pl?parm1=test1&parm2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "expected": { "audit_log": "--A--", diff --git a/test/test-cases/regression/action-ctl_request_body_access.json b/test/test-cases/regression/action-ctl_request_body_access.json index a7eed77f5c..2a3b1f96ed 100644 --- a/test/test-cases/regression/action-ctl_request_body_access.json +++ b/test/test-cases/regression/action-ctl_request_body_access.json @@ -23,21 +23,21 @@ "uri":"/test", "method":"POST", "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, "response":{ @@ -47,7 +47,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -84,21 +84,21 @@ "uri":"/test", "method":"POST", "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, "response":{ @@ -108,7 +108,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -145,21 +145,21 @@ "uri":"/test", "method":"POST", "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, "response":{ @@ -169,7 +169,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-ctl_request_body_processor.json b/test/test-cases/regression/action-ctl_request_body_processor.json index 52cfc2e651..ff34b522ac 100644 --- a/test/test-cases/regression/action-ctl_request_body_processor.json +++ b/test/test-cases/regression/action-ctl_request_body_processor.json @@ -22,40 +22,40 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "", - "", - "", - "Everyday Italian", - "Giada De Laurentiis", - "2005", - "30.00", - "", + "\n", + "\n", + "\n", + "Everyday Italian\n", + "Giada De Laurentiis\n", + "2005\n", + "30.00\n", + "\n", - "", - "Harry Potter", - "J K. Rowling", - "2005", - "29.99", - "", + "\n", + "Harry Potter\n", + "J K. Rowling\n", + "2005\n", + "29.99\n", + "\n", - "", - "XQuery Kick Start", - "James McGovern", - "Per Bothner", - "Kurt Cagle", - "James Linn", - "Vaidyanathan Nagarajan", - "2003", - "49.99", - "", + "\n", + "XQuery Kick Start\n", + "James McGovern\n", + "Per Bothner\n", + "Kurt Cagle\n", + "James Linn\n", + "Vaidyanathan Nagarajan\n", + "2003\n", + "49.99\n", + "\n", - "", - "Learning XML", - "Erik T. Ray", - "2003", - "39.95", - "", - "" + "\n", + "Learning XML\n", + "Erik T. Ray\n", + "2003\n", + "39.95\n", + "\n", + "\n" ] }, "server":{ @@ -92,40 +92,40 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "", - "", - "", - "Everyday Italian", - "Giada De Laurentiis", - "2005", - "30.00", - "", + "\n", + "\n", + "\n", + "Everyday Italian\n", + "Giada De Laurentiis\n", + "2005\n", + "30.00\n", + "\n", - "", - "Harry Potter", - "J K. Rowling", - "2005", - "29.99", - "", + "\n", + "Harry Potter\n", + "J K. Rowling\n", + "2005\n", + "29.99\n", + "\n", - "", - "XQuery Kick Start", - "James McGovern", - "Per Bothner", - "Kurt Cagle", - "James Linn", - "Vaidyanathan Nagarajan", - "2003", - "49.99", - "", + "\n", + "XQuery Kick Start\n", + "James McGovern\n", + "Per Bothner\n", + "Kurt Cagle\n", + "James Linn\n", + "Vaidyanathan Nagarajan\n", + "2003\n", + "49.99\n", + "\n", - "", - "Learning XML", - "Erik T. Ray", - "2003", - "39.95", - "", - "" + "\n", + "Learning XML\n", + "Erik T. Ray\n", + "2003\n", + "39.95\n", + "\n", + "\n" ] }, "server":{ @@ -161,7 +161,7 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "not a xml" + "not a xml\n" ] }, "server":{ diff --git a/test/test-cases/regression/action-ctl_request_body_processor_urlencoded.json b/test/test-cases/regression/action-ctl_request_body_processor_urlencoded.json index 2ad6093e84..89169d13ca 100644 --- a/test/test-cases/regression/action-ctl_request_body_processor_urlencoded.json +++ b/test/test-cases/regression/action-ctl_request_body_processor_urlencoded.json @@ -23,7 +23,7 @@ "uri":"/a=urlencoded", "method":"POST", "body":[ - "param1=value1\r" + "param1=value1\r\n" ] }, "response":{ @@ -33,7 +33,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -71,7 +71,7 @@ "uri":"/a=urlencoded", "method":"POST", "body":[ - "param1=value1\r" + "param1=value1\r\n" ] }, "response":{ @@ -81,7 +81,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-ctl_rule_engine.json b/test/test-cases/regression/action-ctl_rule_engine.json index 927b7077e8..ee39432a62 100644 --- a/test/test-cases/regression/action-ctl_rule_engine.json +++ b/test/test-cases/regression/action-ctl_rule_engine.json @@ -31,7 +31,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -77,7 +77,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -123,7 +123,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -168,7 +168,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -212,7 +212,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -256,7 +256,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -300,7 +300,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-ctl_rule_remove_by_tag.json b/test/test-cases/regression/action-ctl_rule_remove_by_tag.json index 6cf2923d58..b395f9c9af 100644 --- a/test/test-cases/regression/action-ctl_rule_remove_by_tag.json +++ b/test/test-cases/regression/action-ctl_rule_remove_by_tag.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -68,7 +68,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-exec.json b/test/test-cases/regression/action-exec.json index 80661114e0..6a444e7130 100644 --- a/test/test-cases/regression/action-exec.json +++ b/test/test-cases/regression/action-exec.json @@ -29,7 +29,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -78,7 +78,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -126,7 +126,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ diff --git a/test/test-cases/regression/action-id.json b/test/test-cases/regression/action-id.json index 9f9453c7e9..5d444bcd2d 100644 --- a/test/test-cases/regression/action-id.json +++ b/test/test-cases/regression/action-id.json @@ -22,7 +22,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -32,7 +32,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -66,7 +66,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -76,7 +76,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -110,7 +110,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -120,7 +120,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -154,7 +154,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -164,7 +164,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -198,7 +198,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -208,7 +208,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -242,7 +242,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -252,7 +252,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-msg.json b/test/test-cases/regression/action-msg.json index 6933be8aa5..580131b7d6 100644 --- a/test/test-cases/regression/action-msg.json +++ b/test/test-cases/regression/action-msg.json @@ -28,7 +28,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -36,14 +36,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ @@ -86,7 +86,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -94,14 +94,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-tag.json b/test/test-cases/regression/action-tag.json index 870297b462..be02717947 100644 --- a/test/test-cases/regression/action-tag.json +++ b/test/test-cases/regression/action-tag.json @@ -28,7 +28,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -36,14 +36,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ @@ -86,7 +86,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -94,14 +94,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-tnf-base64.json b/test/test-cases/regression/action-tnf-base64.json index 7cb047ce2f..c0cb878714 100644 --- a/test/test-cases/regression/action-tnf-base64.json +++ b/test/test-cases/regression/action-tnf-base64.json @@ -22,7 +22,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -32,7 +32,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -66,7 +66,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=dmFsdWUy¶m2=value2" + "param1=dmFsdWUy¶m2=value2\n" ] }, "response":{ @@ -76,7 +76,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/action-xmlns.json b/test/test-cases/regression/action-xmlns.json index df612f20c3..dad77a4dfc 100644 --- a/test/test-cases/regression/action-xmlns.json +++ b/test/test-cases/regression/action-xmlns.json @@ -58,40 +58,40 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "", - "", - "", - "Everyday Italian", - "Giada De Laurentiis", - "2005", - "30.00", - "", + "\n", + "\n", + "\n", + "Everyday Italian\n", + "Giada De Laurentiis\n", + "2005\n", + "30.00\n", + "\n", - "", - "Harry Potter", - "J K. Rowling", - "2005", - "29.99", - "", + "\n", + "Harry Potter\n", + "J K. Rowling\n", + "2005\n", + "29.99\n", + "\n", - "", - "XQuery Kick Start", - "James McGovern", - "Per Bothner", - "Kurt Cagle", - "James Linn", - "Vaidyanathan Nagarajan", - "2003", - "49.99", - "", + "\n", + "XQuery Kick Start\n", + "James McGovern\n", + "Per Bothner\n", + "Kurt Cagle\n", + "James Linn\n", + "Vaidyanathan Nagarajan\n", + "2003\n", + "49.99\n", + "\n", - "", - "Learning XML", - "Erik T. Ray", - "2003", - "39.95", - "", - "" + "\n", + "Learning XML\n", + "Erik T. Ray\n", + "2003\n", + "39.95\n", + "\n", + "\n" ] }, "server":{ diff --git a/test/test-cases/regression/actions.json b/test/test-cases/regression/actions.json index c69f1a7cb0..9388e7c4ba 100644 --- a/test/test-cases/regression/actions.json +++ b/test/test-cases/regression/actions.json @@ -29,7 +29,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -37,14 +37,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -89,7 +89,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -97,14 +97,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -149,7 +149,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -157,14 +157,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -209,7 +209,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -217,14 +217,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -268,7 +268,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -276,14 +276,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -327,7 +327,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -335,14 +335,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { diff --git a/test/test-cases/regression/auditlog.json b/test/test-cases/regression/auditlog.json index 417f9950e4..5c1a23b6b4 100644 --- a/test/test-cases/regression/auditlog.json +++ b/test/test-cases/regression/auditlog.json @@ -28,14 +28,14 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -85,14 +85,14 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -143,14 +143,14 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -201,14 +201,14 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -260,7 +260,7 @@ "uri": "\/test.pl?param1=test¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "expected": { "audit_log": "id \"1556", @@ -309,7 +309,7 @@ "uri": "\/test.pl?param1=test¶m2=tEst2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "expected": { "audit_log": "\\[msg \"testmsg\"\\] \\[data \"testdata\"\\] \\[severity \"7\"\\] \\[ver \"\"\\] \\[maturity \"0\"\\] \\[accuracy \"0\"\\] \\[tag \"testtag1\"\\] \\[tag \"testtag2\"\\]", @@ -358,7 +358,7 @@ "uri": "\/test.pl?param1=test¶m2=%20tEst2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "expected": { "audit_log": "\\[msg \"testmsg\"\\] \\[data \"testdata\"\\] \\[severity \"7\"\\] \\[ver \"\"\\] \\[maturity \"0\"\\] \\[accuracy \"0\"\\] \\[tag \"testtag1\"\\] \\[tag \"testtag2\"\\]", @@ -407,7 +407,7 @@ "uri": "\/test.pl?param1=test¶m2=tEst2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "expected": { "audit_log": "\\[msg \"testmsg\"\\] \\[data \"testdata\"\\] \\[severity \"7\"\\] \\[ver \"\"\\] \\[maturity \"0\"\\] \\[accuracy \"0\"\\] \\[tag \"testtag1\"\\] \\[tag \"testtag2\"\\]", @@ -457,7 +457,7 @@ "uri": "\/test.pl?param1=test¶m2=%20tEst2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "expected": { "audit_log": "\\[msg \"testmsg\"\\] \\[data \"testdata\"\\] \\[severity \"7\"\\] \\[ver \"\"\\] \\[maturity \"0\"\\] \\[accuracy \"0\"\\] \\[tag \"testtag1\"\\] \\[tag \"testtag2\"\\]", @@ -507,14 +507,14 @@ "uri": "\/test.pl?param1= test ¶m2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -566,14 +566,14 @@ "uri": "\/?%ADd+allow%3d1+%ADd+auto", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -628,7 +628,7 @@ "method": "POST", "http_version": 1.1, "body": [ - "\u00ad=\u00ad" + "\u00ad=\u00ad\n" ] }, "response": { @@ -636,7 +636,7 @@ "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { @@ -692,7 +692,7 @@ "method": "POST", "http_version": 1.1, "body": [ - "\u00ad=\u00ad" + "\u00ad=\u00ad\n" ] }, "response": { @@ -700,7 +700,7 @@ "Content-Type": "plain\/text\n\r" }, "body": [ - "test" + "test\n" ] }, "expected": { diff --git a/test/test-cases/regression/collection-case-insensitive.json b/test/test-cases/regression/collection-case-insensitive.json index 83c3a4d818..1d0611af5d 100644 --- a/test/test-cases/regression/collection-case-insensitive.json +++ b/test/test-cases/regression/collection-case-insensitive.json @@ -4,16 +4,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: Case insensitive (1/1)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -28,30 +28,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"matched_var:PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_headers \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=matched_var:%{matched_var}%\"", "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" diff --git a/test/test-cases/regression/collection-lua.json b/test/test-cases/regression/collection-lua.json index 8d8f4e129f..794ac44ea6 100644 --- a/test/test-cases/regression/collection-lua.json +++ b/test/test-cases/regression/collection-lua.json @@ -26,7 +26,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -68,7 +68,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -110,7 +110,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -152,7 +152,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -194,7 +194,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -236,7 +236,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -278,7 +278,7 @@ "response":{ "headers":{}, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/collection-regular_expression_selection.json b/test/test-cases/regression/collection-regular_expression_selection.json index 5ac6db40a2..ef8f0ce4c7 100644 --- a/test/test-cases/regression/collection-regular_expression_selection.json +++ b/test/test-cases/regression/collection-regular_expression_selection.json @@ -4,16 +4,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX/regular expression (1/2)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -28,31 +28,31 @@ "uri":"\/test.pl?id_a=test&nah=nops", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Saving variable: IP:nah with value: nops", "error_log":"", "http_code":200 }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule ARGS:/^id_/ \"@contains test\" \"id:1,phase:2,t:lowercase,initcol:ip=%{REMOTE_ADDR}\"", "SecRule ARGS:/^id_/ \"@contains test\" \"id:2,phase:2,t:lowercase,setvar:IP.nah=nops\"", @@ -64,16 +64,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX/regular expression (2/2)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -88,30 +88,30 @@ "uri":"\/test.pl?id_a=test&nah=nops", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Saving variable: IP:id_a with value: nops", "http_code":403 }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule ARGS:/^id_/ \"@contains test\" \"id:11,phase:2,t:lowercase,initcol:ip=%{REMOTE_ADDR}\"", "SecRule ARGS:/^id_/ \"@contains test\" \"id:12,phase:2,t:lowercase,setvar:IP.id_a=nops\"", diff --git a/test/test-cases/regression/collection-resource.json b/test/test-cases/regression/collection-resource.json index b73d00cb14..728eef7822 100644 --- a/test/test-cases/regression/collection-resource.json +++ b/test/test-cases/regression/collection-resource.json @@ -4,16 +4,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: RESOURCE (1/2)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -28,22 +28,22 @@ "uri":"\/test.pl?resource=whee", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, "body":[ ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"123\" \\(Variable: RESOURCE:whee::::test\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule ARGS:resource \"@unconditionalmatch \" \"phase:2,pass,initcol:resource=%{ARGS.resource},id:900003\"", "SecRule ARGS:resource \"@unconditionalmatch \" \"phase:2,pass,setvar:resource.test=123,id:900000\"", @@ -56,16 +56,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: RESOURCE (2/2)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -80,22 +80,22 @@ "uri":"\/test.pl?resource=whee", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, "body":[ ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"RESOURCE:whee::webappid::test", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecWebAppId webappid", "SecRule ARGS:resource \"@unconditionalmatch \" \"phase:2,pass,initcol:resource=%{ARGS.resource},id:900003\"", diff --git a/test/test-cases/regression/collection-tx-with-macro.json b/test/test-cases/regression/collection-tx-with-macro.json index a0173b6bb6..6fa6863f77 100644 --- a/test/test-cases/regression/collection-tx-with-macro.json +++ b/test/test-cases/regression/collection-tx-with-macro.json @@ -4,16 +4,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (with macro) (1/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -28,30 +28,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=%{REQUEST_HEADERS:Cookie}%\"", "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" @@ -62,16 +62,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (with macro) (2/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -86,30 +86,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"1\" \\(Variable: TX:somethingPHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something%{REQUEST_HEADERS:Cookie}%\"", "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" @@ -120,16 +120,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (with macro) (3/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -144,30 +144,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"310\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=%{REQUEST_HEADERS:Keep-Alive}%\"", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:2,t:lowercase,t:none,setvar:TX.something=+10\"", @@ -179,16 +179,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (with macro) (4/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -203,30 +203,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"5\" \\(Variable: TX:something_else\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=+10\"", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:2,t:lowercase,t:none,setvar:TX.something_else=%{tx.something}%\"", diff --git a/test/test-cases/regression/collection-tx.json b/test/test-cases/regression/collection-tx.json index 07099405f7..0a72e1b271 100644 --- a/test/test-cases/regression/collection-tx.json +++ b/test/test-cases/regression/collection-tx.json @@ -19,18 +19,18 @@ "uri":"/", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ "Content-Type":"text/xml; charset=utf-8\n" }, "body":[ - "\n" + "\n\n" ] }, "expected":{ - "http_code":200 + "http_code":200 }, "rules":[ "SecRuleEngine On", @@ -43,16 +43,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (1/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -67,30 +67,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"to_test\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=to_test\"", "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" @@ -101,16 +101,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (2/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -125,30 +125,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"1\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something\"", "SecRule TX \"@contains to_test\" \"id:2,t:lowercase,t:none\"" @@ -159,16 +159,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (3/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -183,30 +183,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"20\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=+10\"", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:2,t:lowercase,t:none,setvar:TX.something=+10\"", @@ -218,16 +218,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (4/4)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -242,30 +242,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"15\" \\(Variable: TX:something\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:1,t:lowercase,t:none,setvar:TX.something=+10\"", "SecRule REQUEST_HEADERS \"@contains PHPSESSID\" \"id:2,t:lowercase,t:none,setvar:TX.something=+10\"", @@ -278,16 +278,16 @@ "version_min":300000, "version_max":0, "title":"Testing collection :: TX (5/n)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":2313 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "User-Agent":"Mozilla\/5.0 (Windows; U; Windows NT 6.1; en-US; rv:1.9.1.5) Gecko\/20091102 Firefox\/3.5.5 (.NET CLR 3.5.30729)", "Accept":"text\/html,application\/xhtml+xml,application\/xml;q=0.9,*\/*;q=0.8", "Accept-Language":"en-us,en;q=0.5", @@ -303,30 +303,30 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Content-Type":"text\/xml; charset=utf-8\n\r", "Content-Length":"length\n\r" }, - "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "body":[ + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, - "expected":{ + "expected":{ "audit_log":"", "debug_log":"Target value: \"40\" \\(Variable: TX:anomaly_score\\)", "error_log":"" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule REQUEST_HEADERS:Cookie \"@contains PHPSESSID\" \"id:1,setvar:tx.critical_anomaly_score=5\"", "SecRule REQUEST_HEADERS:Cookie \"@contains PHPSESSID\" \"id:2,setvar:tx.anomaly_score=10\"", diff --git a/test/test-cases/regression/config-body_limits.json b/test/test-cases/regression/config-body_limits.json index c7ce75f949..d1f41ede57 100644 --- a/test/test-cases/regression/config-body_limits.json +++ b/test/test-cases/regression/config-body_limits.json @@ -1,18 +1,18 @@ -[ - { +[ + { "enabled":1, "version_min":300000, "title":"SecResponseBodyLimitAction Reject", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" @@ -20,20 +20,20 @@ "uri":"/?key=value&key=other_value", "method":"GET" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":403 }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecResponseBodyLimitAction Reject", "SecResponseBodyLimit 5" @@ -43,16 +43,16 @@ "enabled":1, "version_min":300000, "title":"SecResponseBodyLimitAction ProcessPartial", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" @@ -60,20 +60,20 @@ "uri":"/?key=value&key=other_value", "method":"GET" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":200 }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecResponseBodyLimitAction ProcessPartial", "SecResponseBodyLimit 5" @@ -83,54 +83,54 @@ "enabled":1, "version_min":300000, "title":"SecRequestBodyLimitAction Reject", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" }, "uri":"/?key=value&key=other_value", "method":"POST", - "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "body":[ + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":403 }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRequestBodyLimitAction Reject", "SecRequestBodyLimit 5" @@ -140,54 +140,54 @@ "enabled":1, "version_min":300000, "title":"SecRequestBodyLimitAction Reject - Engine Disabled", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" }, "uri":"/?key=value&key=other_value", "method":"POST", - "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "body":[ + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":200 }, - "rules":[ + "rules":[ "SecRuleEngine Off", "SecRequestBodyLimitAction Reject", "SecRequestBodyLimit 5" @@ -197,54 +197,54 @@ "enabled":1, "version_min":300000, "title":"SecRequestBodyLimitAction Reject - Engine Detection Only", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" }, "uri":"/?key=value&key=other_value", "method":"POST", - "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "body":[ + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":200 }, - "rules":[ + "rules":[ "SecRuleEngine DetectionOnly", "SecRequestBodyLimitAction Reject", "SecRequestBodyLimit 5" @@ -253,144 +253,165 @@ { "enabled":1, "version_min":300000, - "title":"SecRequestBodyLimitAction ProcessPartial", - "client":{ + "title":"SecRequestBodyLimitAction ProcessPartial - multipart", + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", - "Accept":"*/*" + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=--------------------------756b6d74fa1a8ee2", + "Content-Length": "508" }, "uri":"/?key=value&key=other_value", "method":"POST", - "body":[ - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "--------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "--------------------------756b6d74fa1a8ee2--" + "body":[ + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "--------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "--------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":200 }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRequestBodyLimitAction ProcessPartial", - "SecRequestBodyLimit 5" + "SecRequestBodyLimit 508" ] }, - { + { "enabled":1, "version_min":300000, - "title":"SecResponseBodyLimitAction Reject - Engine Disabled", - "client":{ + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/bad_name before limit", + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", - "Accept":"*/*" + "Accept":"*/*", + "Content-Length": "60", + "Content-Type": "multipart/form-data; boundary=0000" }, - "uri":"/?key=value&key=other_value", - "method":"GET" + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"bad_name\"\r\n", + "\r\n", + "a" + ] }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ - "http_code":200 + "http_code":403 }, - "rules":[ - "SecRuleEngine Off", - "SecResponseBodyLimitAction Reject", - "SecResponseBodyLimit 5" + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 59", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_NAME \"bad_name\" \"id:'200002',phase:2,t:none,deny" ] }, - { + { "enabled":1, "version_min":300000, - "title":"SecResponseBodyLimitAction Reject - Engine Detection Only", - "client":{ + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/bad_name after limit", + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", - "Accept":"*/*" + "Accept":"*/*", + "Content-Length": "59", + "Content-Type": "multipart/form-data; boundary=0000" }, - "uri":"/?key=value&key=other_value", - "method":"GET" + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"bad_name\"\r\n", + "\r\n" + ] }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, "expected":{ "http_code":200 }, - "rules":[ - "SecRuleEngine DetectionOnly", - "SecResponseBodyLimitAction Reject", - "SecResponseBodyLimit 5" + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 58", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_NAME \"bad_name\" \"id:'200002',phase:2,t:none,deny" ] }, { "enabled":1, "version_min":300000, - "title":"SecRequestBodyNoFilesLimit - urlencoded, limit exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/no epilogue", "client":{ "ip":"200.249.12.31", "port":123 @@ -404,13 +425,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "41", - "Content-Type": "application/x-www-form-urlencoded" + "Content-Length": "176", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "param1=value1¶m2=value2¶m3=value3" + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--" ] }, "response":{ @@ -420,24 +445,23 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ - "debug_log":"Request body excluding files is bigger than the maximum expected.", - "http_code":400 + "http_code":200 }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 20", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 176", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] }, { "enabled":1, "version_min":300000, - "title":"SecRequestBodyNoFilesLimit - urlencoded, limit not exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CR after limit", "client":{ "ip":"200.249.12.31", "port":123 @@ -451,13 +475,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "41", - "Content-Type": "application/x-www-form-urlencoded" + "Content-Length": "177", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "param1=value1¶m2=value2¶m3=value3" + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r" ] }, "response":{ @@ -467,7 +495,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -475,15 +503,15 @@ }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 60", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 176", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] }, { "enabled":1, "version_min":300000, - "title":"SecRequestBodyNoFilesLimit - json, limit exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CR just in limit", "client":{ "ip":"200.249.12.31", "port":123 @@ -497,13 +525,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "41", - "Content-Type": "application/json" + "Content-Length": "177", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "{\"param1\":{\"param2\":\"value2\",\"param3\":\"value3\"}}" + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r" ] }, "response":{ @@ -513,25 +545,23 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ - "debug_log":"Request body excluding files is bigger than the maximum expected.", "http_code":400 }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 20", - "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 177", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] }, { "enabled":1, "version_min":300000, - "title":"SecRequestBodyNoFilesLimit - json, limit not exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF across limit", "client":{ "ip":"200.249.12.31", "port":123 @@ -545,13 +575,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "41", - "Content-Type": "application/json" + "Content-Length": "178", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "{\"param1\":{\"param2\":\"value2\",\"param3\":\"value3\"}}" + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r\n" ] }, "response":{ @@ -561,7 +595,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -569,17 +603,15 @@ }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 80", - "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 177", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] }, { "enabled":1, "version_min":300000, - "resource":"libxml2", - "title":"SecRequestBodyNoFilesLimit - xml, limit exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CR before limit, non-LF after", "client":{ "ip":"200.249.12.31", "port":123 @@ -593,13 +625,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "77", - "Content-Type": "application/xml" + "Content-Length": "203", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "ccceee" + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\rbad epilogue after just CR" ] }, "response":{ @@ -609,26 +645,23 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ - "debug_log":"Request body excluding files is bigger than the maximum expected.", - "http_code":400 + "http_code":200 }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 20", - "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 177", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] }, { "enabled":1, "version_min":300000, - "resource":"libxml2", - "title":"SecRequestBodyNoFilesLimit - xml, limit not exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/empty epilogue just in limit", "client":{ "ip":"200.249.12.31", "port":123 @@ -642,13 +675,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "77", - "Content-Type": "application/xml" + "Content-Length": "178", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "ccceee" + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r\n" ] }, "response":{ @@ -658,7 +695,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -666,16 +703,15 @@ }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 90", - "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 178", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] }, { "enabled":1, "version_min":300000, - "title":"SecRequestBodyNoFilesLimit - multipart, limit exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in part across limit #1", "client":{ "ip":"200.249.12.31", "port":123 @@ -689,21 +725,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "77", "Content-Type": "multipart/form-data; boundary=0000" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "--0000", - "Content-Disposition: form-data; name=\"a\"", - "", - "1", - "--0000", - "Content-Disposition: form-data; name=\"b\"; filename=\"c.txt\"", - "", - "2222222222222222222222222222222222222222222222222222222222222222222222", - "--0000--" + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--000X" ] }, "response":{ @@ -713,24 +745,25 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ - "debug_log":"Request body excluding files is bigger than the maximum expected.", - "http_code":400 + "debug_log":"Appending request body: 115 bytes. Limit set to: 114", + "http_code":200 }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 80", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 114", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" ] }, { "enabled":1, "version_min":300000, - "title":"SecRequestBodyNoFilesLimit - multipart, limit not exceeded", + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in part before limit #1", "client":{ "ip":"200.249.12.31", "port":123 @@ -744,21 +777,17 @@ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", - "Content-Length": "77", "Content-Type": "multipart/form-data; boundary=0000" }, - "uri":"/", + "uri":"/test.txt", "method":"POST", - "body": [ - "--0000", - "Content-Disposition: form-data; name=\"a\"", - "", - "1", - "--0000", - "Content-Disposition: form-data; name=\"b\"; filename=\"c.txt\"", - "", - "2222222222222222222222222222222222222222222222222222222222222222222222", - "--0000--" + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000X" ] }, "response":{ @@ -768,17 +797,2921 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ - "http_code":200 + "debug_log":"Appending request body: 116 bytes. Limit set to: 115", + "http_code":403 }, "rules":[ "SecRuleEngine On", - "SecRequestBodyAccess On", - "SecRequestBodyNoFilesLimit 120", - "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 115", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in part before limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000\rX" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 117 bytes. Limit set to: 116", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 116", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in part before limit #3", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000\r\n", + "X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 118 bytes. Limit set to: 117", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 117", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in part before limit #4", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000\r\n", + "CX" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 119 bytes. Limit set to: 118", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 118", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in part before limit #5", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000\r\n", + "Content-Disposition: form-data; name=\"name2X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 161 bytes. Limit set to: 160", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 160", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in final part across limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000-X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 117 bytes. Limit set to: 116", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 116", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in final part before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000--X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 118 bytes. Limit set to: 117", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 117", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in final part across limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: text/plain\r\n", + "\r\n", + "value\r\n", + "--0000\r\n", + "Content-Disposition: form-data; name=\"name2\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000-X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 206 bytes. Limit set to: 205", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 205", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/bad-header in final part before limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: text/plain\r\n", + "\r\n", + "value\r\n", + "--0000\r\n", + "Content-Disposition: form-data; name=\"name2\"\r\n", + "Content-Type: bad_type\r\n", + "\r\n", + "value\r\n", + "--0000--X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 207 bytes. Limit set to: 206", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 206", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/invalid boundary before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: text/plain\r\n", + "\r\n", + "value\r\n", + "--0000!X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 119 bytes. Limit set to: 118", + "error_log":"Multipart parsing error: Multipart: Invalid boundary.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 118", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/invalid boundary before limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: text/plain\r\n", + "\r\n", + "value\r\n", + "--0000\r!X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 120 bytes. Limit set to: 119", + "error_log":"Multipart parsing error: Multipart: Invalid boundary.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 119", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF/partial/invalid final boundary before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\r\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\r\n", + "Content-Type: text/plain\r\n", + "\r\n", + "value\r\n", + "--0000-!X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 120 bytes. Limit set to: 119", + "error_log":"Multipart parsing error: Multipart: Invalid final boundary.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 119", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in part across limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--000X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 110 bytes. Limit set to: 109", + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 109", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in part before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 111 bytes. Limit set to: 110", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 110", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in part before limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000\n", + "X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 112 bytes. Limit set to: 111", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 111", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in part before limit #3", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000\n", + "CX" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 113 bytes. Limit set to: 112", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 112", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in part before limit #4", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000\n", + "Content-Disposition: form-data; name=\"name2X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 155 bytes. Limit set to: 154", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 154", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS:name1 \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in final part across limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000-X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 112 bytes. Limit set to: 111", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 111", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in final part before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000--X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 113 bytes. Limit set to: 112", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 112", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in final part across limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "value\n", + "--0000\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000-X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 196 bytes. Limit set to: 195", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 195", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/bad-header in final part before limit #2", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "value\n", + "--0000\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "Content-Type: bad_type\n", + "\n", + "value\n", + "--0000--X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 197 bytes. Limit set to: 196", + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 196", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule MULTIPART_PART_HEADERS \"content-type:.*bad_type\" \"id:'200002',phase:2,t:none,t:lowercase,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/invalid boundary before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "value\n", + "--0000!X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 114 bytes. Limit set to: 113", + "error_log":"Multipart parsing error: Multipart: Invalid boundary.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 113", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/LF/partial/invalid final boundary before limit #1", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "--0000\n", + "Content-Disposition: form-data; name=\"name1\"; filename=\"name1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "value\n", + "--0000-!X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Appending request body: 115 bytes. Limit set to: 114", + "error_log":"Multipart parsing error: Multipart: Invalid final boundary.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 114", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/entire/bad_name without value", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "8", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "bad_name" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 8", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/partial/bad_name without value without delimeter before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "9", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "bad_nameX" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 8", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/partial/bad_name without value with delimiter before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "10", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "bad_name&X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 9", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/entire/bad_name with value", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "10", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "bad_name=1" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 10", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/partial/bad_name with value without delimeter before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "11", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "bad_name=1X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 10", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/partial/bad_name with value with delimiter before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "12", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "bad_name=1&X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 11", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/entire/bad_value", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "11", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "a=bad_value" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 11", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/partial/bad_value without delimeter before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "12", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "a=bad_valueX" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 11", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - url-encoded/partial/bad_value with delimeter before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "13", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "a=bad_value&X" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 12", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - json/bad_name after limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/json", + "Content-Length": "14" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"bad_name\":1}" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 12", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - json/bad_name before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/json", + "Content-Length": "14" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"bad_name\":1}" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 13", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS_NAMES \"bad_name\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - json/bad_value after limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/json", + "Content-Length": "17" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"a\":\"bad_value\"}" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 15", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - json/bad_value before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/json", + "Content-Length": "17" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"a\":\"bad_value\"}" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 16", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - json/ill-formed after limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/json", + "Content-Length": "17" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"a\":\"bad_value\"}}" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 17", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - json/ill-formed before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/json", + "Content-Length": "17" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"a\":\"bad_value\"}}" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 18", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule ARGS \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyLimitAction ProcessPartial - xml/bad_value after limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/xml", + "Content-Length": "16" + }, + "uri":"/", + "method":"POST", + "body": [ + "bad_value" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 11", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule XML:/* \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyLimitAction ProcessPartial - xml/bad_value before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/xml", + "Content-Length": "16" + }, + "uri":"/", + "method":"POST", + "body": [ + "bad_value" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 12", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule XML:/* \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyLimitAction ProcessPartial - xml/ill-formed after limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/xml", + "Content-Length": "20" + }, + "uri":"/", + "method":"POST", + "body": [ + "bad_value" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":403 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 19", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule XML:/* \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyLimitAction ProcessPartial - xml/ill-formed before limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Type": "application/xml", + "Content-Length": "20" + }, + "uri":"/", + "method":"POST", + "body": [ + "bad_value" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 20", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"", + "SecRule XML:/* \"bad_value\" \"id:'200002',phase:2,t:none,deny" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyLimitAction ProcessPartial - RequestBodyNoFilesLimit ignored", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "12", + "Content-Type": "application/xml" + }, + "uri":"/", + "method":"POST", + "body": [ + "\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 7", + "SecRequestBodyNoFilesLimit 3", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecResponseBodyLimitAction Reject - Engine Disabled", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*" + }, + "uri":"/?key=value&key=other_value", + "method":"GET" + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine Off", + "SecResponseBodyLimitAction Reject", + "SecResponseBodyLimit 5" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecResponseBodyLimitAction Reject - Engine Detection Only", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*" + }, + "uri":"/?key=value&key=other_value", + "method":"GET" + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine DetectionOnly", + "SecResponseBodyLimitAction Reject", + "SecResponseBodyLimit 5" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyNoFilesLimit - urlencoded, limit exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "41", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/", + "method":"POST", + "body": [ + "param1=value1¶m2=value2¶m3=value3\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Request body excluding files is bigger than the maximum expected.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 20", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyNoFilesLimit - urlencoded, limit not exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "41", + "Content-Type": "application/x-www-form-urlencoded" + }, + "uri":"/", + "method":"POST", + "body": [ + "param1=value1¶m2=value2¶m3=value3\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 60", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyNoFilesLimit - json, limit exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "41", + "Content-Type": "application/json" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"param1\":{\"param2\":\"value2\",\"param3\":\"value3\"}}\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Request body excluding files is bigger than the maximum expected.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 20", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyNoFilesLimit - json, limit not exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "41", + "Content-Type": "application/json" + }, + "uri":"/", + "method":"POST", + "body": [ + "{\"param1\":{\"param2\":\"value2\",\"param3\":\"value3\"}}\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 80", + "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyNoFilesLimit - xml, limit exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "77", + "Content-Type": "application/xml" + }, + "uri":"/", + "method":"POST", + "body": [ + "ccceee\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Request body excluding files is bigger than the maximum expected.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 20", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "resource":"libxml2", + "title":"SecRequestBodyNoFilesLimit - xml, limit not exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "77", + "Content-Type": "application/xml" + }, + "uri":"/", + "method":"POST", + "body": [ + "ccceee\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 90", + "SecRule REQUEST_HEADERS:Content-Type \"(?:application(?:/soap\\+|/)|text/)xml\" \"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML\"", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyNoFilesLimit - multipart, limit exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "77", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/", + "method":"POST", + "body": [ + "--0000\n", + "Content-Disposition: form-data; name=\"a\"\n", + "\n", + "1\n", + "--0000\n", + "Content-Disposition: form-data; name=\"b\"; filename=\"c.txt\"\n", + "\n", + "2222222222222222222222222222222222222222222222222222222222222222222222\n", + "--0000--\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "debug_log":"Request body excluding files is bigger than the maximum expected.", + "http_code":400 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 80", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyNoFilesLimit - multipart, limit not exceeded", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "77", + "Content-Type": "multipart/form-data; boundary=0000" + }, + "uri":"/", + "method":"POST", + "body": [ + "--0000\n", + "Content-Disposition: form-data; name=\"a\"\n", + "\n", + "1\n", + "--0000\n", + "Content-Disposition: form-data; name=\"b\"; filename=\"c.txt\"\n", + "\n", + "2222222222222222222222222222222222222222222222222222222222222222222222\n", + "--0000--\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyAccess On", + "SecRequestBodyNoFilesLimit 120", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/no epilogue", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "176", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 176", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CR after limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "177", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 176", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CR just in limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "177", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":400, + "error_log": "Multipart: Invalid epilogue after final boundary." + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 177", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CRLF across limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "178", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 177", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/CR before limit, non-LF after", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "203", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\rbad epilogue after just CR" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 177", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" + ] + }, + { + "enabled":1, + "version_min":300000, + "title":"SecRequestBodyLimitAction ProcessPartial - multipart/empty epilogue just in limit", + "client":{ + "ip":"200.249.12.31", + "port":123 + }, + "server":{ + "ip":"200.249.12.31", + "port":80 + }, + "request":{ + "headers":{ + "Host":"localhost", + "User-Agent":"curl/7.38.0", + "Accept":"*/*", + "Content-Length": "143", + "Content-Type": "multipart/form-data; boundary=---------------------------69343412719991675451336310646" + }, + "uri":"/test.txt", + "method":"POST", + "body":[ + "-----------------------------69343412719991675451336310646\r\n", + "Content-Disposition: form-data; name=\"name1\"\r\n", + "\r\n", + "value1\r\n", + "-----------------------------69343412719991675451336310646--\r\n" + ] + }, + "response":{ + "headers":{ + "Date":"Mon, 13 Jul 2015 20:02:41 GMT", + "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", + "Content-Type":"text/html" + }, + "body":[ + "no need.\n" + ] + }, + "expected":{ + "http_code":200 + }, + "rules":[ + "SecRuleEngine On", + "SecRequestBodyLimitAction ProcessPartial", + "SecRequestBodyLimit 178", + "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2\"" ] } ] diff --git a/test/test-cases/regression/config-calling_phases_by_name.json b/test/test-cases/regression/config-calling_phases_by_name.json index 39bd6f46d2..187776af48 100644 --- a/test/test-cases/regression/config-calling_phases_by_name.json +++ b/test/test-cases/regression/config-calling_phases_by_name.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -67,7 +67,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-include.json b/test/test-cases/regression/config-include.json index ab73de0760..df6ac15cf4 100644 --- a/test/test-cases/regression/config-include.json +++ b/test/test-cases/regression/config-include.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -67,7 +67,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -107,7 +107,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -147,7 +147,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -187,7 +187,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -228,7 +228,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -268,7 +268,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -308,7 +308,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-remove_by_id.json b/test/test-cases/regression/config-remove_by_id.json index 9f074420b8..0fd95ff7e0 100644 --- a/test/test-cases/regression/config-remove_by_id.json +++ b/test/test-cases/regression/config-remove_by_id.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -68,7 +68,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -109,7 +109,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-remove_by_msg.json b/test/test-cases/regression/config-remove_by_msg.json index 36cb3cab06..bfd73c2920 100644 --- a/test/test-cases/regression/config-remove_by_msg.json +++ b/test/test-cases/regression/config-remove_by_msg.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -68,7 +68,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-remove_by_tag.json b/test/test-cases/regression/config-remove_by_tag.json index 09681546ac..c9f77c3cfa 100644 --- a/test/test-cases/regression/config-remove_by_tag.json +++ b/test/test-cases/regression/config-remove_by_tag.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -68,7 +68,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-response_type.json b/test/test-cases/regression/config-response_type.json index 621ab38a20..1b0bcfad92 100644 --- a/test/test-cases/regression/config-response_type.json +++ b/test/test-cases/regression/config-response_type.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -68,7 +68,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -109,7 +109,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-secdefaultaction.json b/test/test-cases/regression/config-secdefaultaction.json index bb3d7d8104..980fee3148 100644 --- a/test/test-cases/regression/config-secdefaultaction.json +++ b/test/test-cases/regression/config-secdefaultaction.json @@ -28,7 +28,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -36,14 +36,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ @@ -87,7 +87,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -95,14 +95,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ @@ -161,7 +161,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -169,14 +169,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ @@ -252,7 +252,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -260,14 +260,14 @@ "Content-Length":"length\n\r" }, "body":[ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-secremoterules.json b/test/test-cases/regression/config-secremoterules.json index 5065e06b64..c9e444df2e 100644 --- a/test/test-cases/regression/config-secremoterules.json +++ b/test/test-cases/regression/config-secremoterules.json @@ -28,7 +28,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -83,7 +83,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-update-action-by-id.json b/test/test-cases/regression/config-update-action-by-id.json index 4e1a3fc24e..0f06d45a4b 100644 --- a/test/test-cases/regression/config-update-action-by-id.json +++ b/test/test-cases/regression/config-update-action-by-id.json @@ -30,7 +30,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -75,7 +75,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -117,7 +117,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -162,7 +162,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -208,7 +208,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -255,7 +255,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-update-target-by-id.json b/test/test-cases/regression/config-update-target-by-id.json index 8faecaefe6..718ed71952 100644 --- a/test/test-cases/regression/config-update-target-by-id.json +++ b/test/test-cases/regression/config-update-target-by-id.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -67,7 +67,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -107,7 +107,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -147,7 +147,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -187,7 +187,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-update-target-by-msg.json b/test/test-cases/regression/config-update-target-by-msg.json index 24fe343cd0..28673ed79f 100644 --- a/test/test-cases/regression/config-update-target-by-msg.json +++ b/test/test-cases/regression/config-update-target-by-msg.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-update-target-by-tag.json b/test/test-cases/regression/config-update-target-by-tag.json index 10d4c1b487..59cf702c5e 100644 --- a/test/test-cases/regression/config-update-target-by-tag.json +++ b/test/test-cases/regression/config-update-target-by-tag.json @@ -27,7 +27,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -67,7 +67,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -107,7 +107,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -147,7 +147,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -187,7 +187,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -227,7 +227,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -267,7 +267,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/config-xml_external_entity.json b/test/test-cases/regression/config-xml_external_entity.json index 1f5cf098dc..fa328d302d 100644 --- a/test/test-cases/regression/config-xml_external_entity.json +++ b/test/test-cases/regression/config-xml_external_entity.json @@ -22,14 +22,14 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "", - "", - "", - "]>", - "", - " &js;", - "" + "\n", + "\n", + "\n", + "]>\n", + "\n", + " &js;\n", + "\n" ] }, @@ -69,14 +69,14 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "", - "", - "", - "]>", - "", - " &js;", - "" + "\n", + "\n", + "\n", + "]>\n", + "\n", + " &js;\n", + "\n" ] }, @@ -117,14 +117,14 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "", - "", - "", - "]>", - "", - " &js;", - "" + "\n", + "\n", + "\n", + "]>\n", + "\n", + " &js;\n", + "\n" ] }, diff --git a/test/test-cases/regression/debug_log.json b/test/test-cases/regression/debug_log.json index 9e17fac69e..c3ba716211 100644 --- a/test/test-cases/regression/debug_log.json +++ b/test/test-cases/regression/debug_log.json @@ -29,7 +29,7 @@ "uri": "\/test.pl?param1=test¶2=test2", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -37,14 +37,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { diff --git a/test/test-cases/regression/directive-sec_rule_script.json b/test/test-cases/regression/directive-sec_rule_script.json index b8eb904759..9274d6db23 100644 --- a/test/test-cases/regression/directive-sec_rule_script.json +++ b/test/test-cases/regression/directive-sec_rule_script.json @@ -29,7 +29,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -78,7 +78,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -127,7 +127,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ @@ -177,7 +177,7 @@ "uri":"\/test.pl?param1= test ¶m2=test2", "method":"GET", "http_version":1.1, - "body":"" + "body":"\n" }, "response":{ "headers":{ diff --git a/test/test-cases/regression/fn-setHostname.json b/test/test-cases/regression/fn-setHostname.json index 59c5b52e8f..0b8d5f416e 100644 --- a/test/test-cases/regression/fn-setHostname.json +++ b/test/test-cases/regression/fn-setHostname.json @@ -25,7 +25,7 @@ "Content-Type":"text/plain" }, "body":[ - "denystring" + "denystring\n" ] }, "expected":{ diff --git a/test/test-cases/regression/issue-1152.json b/test/test-cases/regression/issue-1152.json index 54c78f7991..ec4ed37a1e 100644 --- a/test/test-cases/regression/issue-1152.json +++ b/test/test-cases/regression/issue-1152.json @@ -30,7 +30,7 @@ "uri": "\/test.pl?foo=bar", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -78,7 +78,7 @@ "uri": "\/test.pl?foo=bar", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -128,7 +128,7 @@ "uri": "\/test.pl?foo=bar", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -178,7 +178,7 @@ "uri": "\/test.pl?a=test&b=test&c=test&d=test", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { diff --git a/test/test-cases/regression/issue-1528.json b/test/test-cases/regression/issue-1528.json index f2257055c2..27da6a8a5f 100644 --- a/test/test-cases/regression/issue-1528.json +++ b/test/test-cases/regression/issue-1528.json @@ -17,13 +17,13 @@ "request": { "uri":"/?param=attack", "headers": "", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 1", diff --git a/test/test-cases/regression/issue-1565.json b/test/test-cases/regression/issue-1565.json index 6596404f17..74d2da8224 100644 --- a/test/test-cases/regression/issue-1565.json +++ b/test/test-cases/regression/issue-1565.json @@ -21,13 +21,13 @@ "Accept":"*/*", "Content-Length": "1539" }, - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 0." @@ -59,13 +59,13 @@ "Accept":"*/*", "Content-Length": "1539" }, - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 1" diff --git a/test/test-cases/regression/issue-1576.json b/test/test-cases/regression/issue-1576.json index eb41e1dfb6..8226f84c5a 100644 --- a/test/test-cases/regression/issue-1576.json +++ b/test/test-cases/regression/issue-1576.json @@ -20,17 +20,17 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "{", - " \"foo\":\"bar\",", - " \"mod\":\"sec\",", - " \"ops\": [", - " [\"um\", \"um e meio\"], ", - " \"dois\",", - " \"tres\",", - " { \"eins\": [\"zwei\", \"drei\"] }", - " ],", - " \"whee\": \"lhebs\"", - "}" + "{\n", + " \"foo\":\"bar\",\n", + " \"mod\":\"sec\",\n", + " \"ops\": [\n", + " [\"um\", \"um e meio\"], \n", + " \"dois\",\n", + " \"tres\",\n", + " { \"eins\": [\"zwei\", \"drei\"] }\n", + " ],\n", + " \"whee\": \"lhebs\"\n", + "}\n" ] }, "server":{ @@ -68,11 +68,11 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "[", - " \"one\",", - " \"two\",", - " \"three\"", - "]" + "[\n", + " \"one\",\n", + " \"two\",\n", + " \"three\"\n", + "]\n" ] }, "server":{ @@ -110,20 +110,20 @@ "uri":"/?key=value&key=other_value", "method":"POST", "body": [ - "{", - " \"foo\":\"bar\",", - " \"mod\":\"sec\",", - " \"ops\": {", - " \"um\": \"um e meio\", ", - " \"dois\": \"tres\",", - " \"quatro\": \"cinco\",", - " \"seis\": {", - " \"dez\": \"onze\",", - " \"doze\": \"treze\"", - " }", - " },", - " \"whee\": \"lhebs\"", - "}" + "{\n", + " \"foo\":\"bar\",\n", + " \"mod\":\"sec\",\n", + " \"ops\": {\n", + " \"um\": \"um e meio\", \n", + " \"dois\": \"tres\",\n", + " \"quatro\": \"cinco\",\n", + " \"seis\": {\n", + " \"dez\": \"onze\",\n", + " \"doze\": \"treze\"\n", + " }\n", + " },\n", + " \"whee\": \"lhebs\"\n", + "}\n" ] }, "server":{ diff --git a/test/test-cases/regression/issue-1591.json b/test/test-cases/regression/issue-1591.json index 2b32aa29a2..52caa278a0 100644 --- a/test/test-cases/regression/issue-1591.json +++ b/test/test-cases/regression/issue-1591.json @@ -22,13 +22,13 @@ "Content-Length": "1539", "Cookie": "__utma=1.32168570.12572608.1259628772.2&__utmb=1.4.10.1259628772&" }, - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 0." @@ -61,13 +61,13 @@ "Content-Length": "1539", "Cookie": "__utma=1.32168570.12572608.1259628772.2&__utmb=1.4.10.1259628772&" }, - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 1." @@ -100,13 +100,13 @@ "Content-Length": "1539", "Cookie": "__utma=1.32168570.12572608.1259628772.2&__utmb=1.4.10.1259628772&" }, - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Variable: REQUEST_HEADERS:Content-Length" diff --git a/test/test-cases/regression/issue-1725.json b/test/test-cases/regression/issue-1725.json index afd7c794e2..90c4edb2d3 100644 --- a/test/test-cases/regression/issue-1725.json +++ b/test/test-cases/regression/issue-1725.json @@ -22,14 +22,14 @@ "Content-Length": "1539", "Cookie": "__utma=1.32168570.12572608.1259628772.2&__utmb=1.4.10.1259628772&" }, - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1, "uri": "/test" }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "\/test; 0.[0-9]+; 0.[0-9]+;" diff --git a/test/test-cases/regression/issue-1743.json b/test/test-cases/regression/issue-1743.json index 5e2b2fad35..b2d9aba7f2 100644 --- a/test/test-cases/regression/issue-1743.json +++ b/test/test-cases/regression/issue-1743.json @@ -17,13 +17,13 @@ "request": { "uri":"/?x=foo%3d", "headers": "", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 1", @@ -53,13 +53,13 @@ "request": { "uri":"/?x=foo=", "headers": "", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "debug_log": "Rule returned 1", diff --git a/test/test-cases/regression/issue-1785.json b/test/test-cases/regression/issue-1785.json index ba252b144f..0cc3aaf6b8 100644 --- a/test/test-cases/regression/issue-1785.json +++ b/test/test-cases/regression/issue-1785.json @@ -30,7 +30,7 @@ "uri": "\/test.pl?foo=bar", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { diff --git a/test/test-cases/regression/issue-1812.json b/test/test-cases/regression/issue-1812.json index 47c51933bd..6dd106cb67 100644 --- a/test/test-cases/regression/issue-1812.json +++ b/test/test-cases/regression/issue-1812.json @@ -30,7 +30,7 @@ "uri": "\/test.pl?foo=£&bar=%C2%A3", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { diff --git a/test/test-cases/regression/issue-1825.json b/test/test-cases/regression/issue-1825.json index 41fc349ff8..29f8bc259f 100644 --- a/test/test-cases/regression/issue-1825.json +++ b/test/test-cases/regression/issue-1825.json @@ -1,18 +1,18 @@ -[ - { +[ + { "enabled":1, "version_min":300000, "title":"multipart Content-Disposition should allow filename* field (1/7)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -22,45 +22,45 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=utf-8''03CB1664.txt", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=utf-8''03CB1664.txt\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":"", - "body":"" + "response":{ + "headers":"", + "body":"\n" }, - "expected":{ + "expected":{ "debug_log":"Target value: \"03CB1664.txt\" \\(Variable: MULTIPART_FILENAME" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule MULTIPART_FILENAME \"@contains 0\" \"id:1,phase:2,pass,t:trim\"" ] }, - { + { "enabled":1, "version_min":300000, "title":"multipart Content-Disposition should allow filename* field (2/7)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -70,45 +70,45 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename*= ISO-8859-1''ab0-_xy.txt; filename=\"ab0-_xy.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename*= ISO-8859-1''ab0-_xy.txt; filename=\"ab0-_xy.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":"", - "body":"" + "response":{ + "headers":"", + "body":"\n" }, - "expected":{ + "expected":{ "debug_log":"Target value: \"ab0-_xy.txt\" \\(Variable: MULTIPART_FILENAME" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule MULTIPART_FILENAME \"@contains 0\" \"id:1,phase:2,pass,t:trim\"" ] }, - { + { "enabled":1, "version_min":300000, "title":"multipart Content-Disposition should allow filename* field (3/7)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -118,45 +118,45 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename*=utf-8''03CB1664.txt", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--\r" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename*=utf-8''03CB1664.txt\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\r\n" ] }, - "response":{ - "headers":"", - "body":"" + "response":{ + "headers":"", + "body":"\n" }, - "expected":{ + "expected":{ "debug_log":"Warning: no filename= but filename*" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule MULTIPART_FILENAME \"@contains 0\" \"id:1,phase:2,pass,t:trim\"" ] }, - { + { "enabled":1, "version_min":300000, "title":"multipart Content-Disposition should allow filename* field (4/7)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -166,45 +166,45 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=''03CB1664.txt", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=''03CB1664.txt\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":"", - "body":"" + "response":{ + "headers":"", + "body":"\n" }, - "expected":{ + "expected":{ "debug_log":"Multipart: Invalid Content-Disposition header \\(-16" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule MULTIPART_FILENAME \"@contains 0\" \"id:1,phase:2,pass,t:trim\"" ] }, - { + { "enabled":1, "version_min":300000, "title":"multipart Content-Disposition should allow filename* field (5/7)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -214,45 +214,45 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=UTF-8'03CB1664.txt", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=UTF-8'03CB1664.txt\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":"", - "body":"" + "response":{ + "headers":"", + "body":"\n" }, - "expected":{ + "expected":{ "debug_log":"Multipart: Invalid Content-Disposition header \\(-17" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule MULTIPART_FILENAME \"@contains 0\" \"id:1,phase:2,pass,t:trim\"" ] }, - { + { "enabled":1, "version_min":300000, "title":"multipart Content-Disposition should allow filename* field (6/7)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -262,27 +262,27 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=utf-8''%61%4G.txt", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=utf-8''%61%4G.txt\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ - "headers":"", - "body":"" + "response":{ + "headers":"", + "body":"\n" }, - "expected":{ + "expected":{ "debug_log":"Multipart: Invalid Content-Disposition header \\(-18" }, - "rules":[ + "rules":[ "SecRuleEngine On", "SecRule MULTIPART_FILENAME \"@contains 0\" \"id:1,phase:2,pass,t:trim\"" ] @@ -311,21 +311,21 @@ "uri":"/", "method":"POST", "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=utf-8''%61%62.txt", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"03CB1664.txt\"; filename*=utf-8''%61%62.txt\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, - "response":{ + "response":{ "headers":"", - "body":"" + "body":"\n" }, "expected":{ "http_code":200 diff --git a/test/test-cases/regression/issue-1831.json b/test/test-cases/regression/issue-1831.json index 773a0eec97..5db54fcb2e 100644 --- a/test/test-cases/regression/issue-1831.json +++ b/test/test-cases/regression/issue-1831.json @@ -30,7 +30,7 @@ "uri": "\/test.pl?foo=£&bar=%C2%A3", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -77,7 +77,7 @@ "uri": "\/test.pl?foo=£&bar=%C2%A3", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -127,7 +127,7 @@ "uri": "\/test.pl?foo=£&bar=%C2%A3", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -176,7 +176,7 @@ "uri": "\/test.pl?foo=£&bar=%C2%A3", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { diff --git a/test/test-cases/regression/issue-1844.json b/test/test-cases/regression/issue-1844.json index 6ccb1f5e8a..b6db9f3c25 100644 --- a/test/test-cases/regression/issue-1844.json +++ b/test/test-cases/regression/issue-1844.json @@ -23,7 +23,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=test1¶m2=value2" + "param1=test1¶m2=value2\n" ] }, "response":{ @@ -33,7 +33,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -69,7 +69,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=test2" + "param1=test2\n" ] }, "response":{ @@ -79,7 +79,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -115,7 +115,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=test3" + "param1=test3\n" ] }, "response":{ @@ -125,7 +125,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -161,7 +161,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=test4" + "param1=test4\n" ] }, "response":{ @@ -171,7 +171,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -207,7 +207,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=test5" + "param1=test5\n" ] }, "response":{ @@ -217,7 +217,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -253,7 +253,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=test5" + "param1=test5\n" ] }, "response":{ @@ -263,7 +263,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/issue-1850.json b/test/test-cases/regression/issue-1850.json index 75ac2bc5f6..039c0412f4 100644 --- a/test/test-cases/regression/issue-1850.json +++ b/test/test-cases/regression/issue-1850.json @@ -30,7 +30,7 @@ "uri": "\/test.pl?foo=£&bar=%C2%A3", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { diff --git a/test/test-cases/regression/issue-1941.json b/test/test-cases/regression/issue-1941.json index 0410ddad84..1ad87ea606 100644 --- a/test/test-cases/regression/issue-1941.json +++ b/test/test-cases/regression/issue-1941.json @@ -71,7 +71,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2&pparam=дор", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -79,14 +79,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -129,7 +129,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2&pparam=дор", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -137,14 +137,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { diff --git a/test/test-cases/regression/issue-1943.json b/test/test-cases/regression/issue-1943.json index 7dd688d556..00b2661e7c 100644 --- a/test/test-cases/regression/issue-1943.json +++ b/test/test-cases/regression/issue-1943.json @@ -29,7 +29,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2&pparam=дор", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -37,14 +37,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { @@ -86,7 +86,7 @@ "uri": "\/test.pl?param1= test ¶m2=test2&pparam=дор", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -94,14 +94,14 @@ "Content-Length": "length\n\r" }, "body": [ - "\n\r", - "\n\r", - " \n\r", - " \n\r", - " string<\/EnlightenResult>\n\r", - " <\/EnlightenResponse>\n\r", - " <\/soap:Body>\n\r", - "<\/soap:Envelope>\n\r" + "\n\r\n", + "\n\r\n", + " \n\r\n", + " \n\r\n", + " string<\/EnlightenResult>\n\r\n", + " <\/EnlightenResponse>\n\r\n", + " <\/soap:Body>\n\r\n", + "<\/soap:Envelope>\n\r\n" ] }, "expected": { diff --git a/test/test-cases/regression/issue-1956.json b/test/test-cases/regression/issue-1956.json index ead45da2a0..5afb22a398 100644 --- a/test/test-cases/regression/issue-1956.json +++ b/test/test-cases/regression/issue-1956.json @@ -19,13 +19,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=)", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", @@ -57,13 +57,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=)", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", @@ -95,13 +95,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=)", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", @@ -133,13 +133,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=)", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", @@ -171,13 +171,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=)", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", diff --git a/test/test-cases/regression/issue-1960.json b/test/test-cases/regression/issue-1960.json index 5b288977cd..fd7235da31 100644 --- a/test/test-cases/regression/issue-1960.json +++ b/test/test-cases/regression/issue-1960.json @@ -25,7 +25,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/issue-2000.json b/test/test-cases/regression/issue-2000.json index 05610b457d..6b508d88a0 100644 --- a/test/test-cases/regression/issue-2000.json +++ b/test/test-cases/regression/issue-2000.json @@ -18,7 +18,7 @@ }, "uri":"index.php?foo=bar&a=xxx", "method":"GET", - "body": "" + "body": "\n" }, "expected": { "http_code": 403, diff --git a/test/test-cases/regression/issue-2099.json b/test/test-cases/regression/issue-2099.json index fff4aa4cc8..2566e70f3f 100644 --- a/test/test-cases/regression/issue-2099.json +++ b/test/test-cases/regression/issue-2099.json @@ -18,7 +18,7 @@ }, "uri":"/remote.php/webdav?bar=foo", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"200.249.12.31", @@ -50,7 +50,7 @@ }, "uri":"/remote.php?bar=foo", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"200.249.12.31", @@ -82,7 +82,7 @@ }, "uri":"/remote.php/webdav?bar=foo", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"200.249.12.31", @@ -114,7 +114,7 @@ }, "uri":"/remote.php?bar=foo", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"200.249.12.31", @@ -146,7 +146,7 @@ }, "uri":"/test.php?a=a", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"200.249.12.31", @@ -178,7 +178,7 @@ }, "uri":"/index.php?a=a", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"200.249.12.31", @@ -190,6 +190,6 @@ "SecRule REQUEST_URI \"@contains /test.php\" \"id:100,phase:1,nolog,pass,ctl:ruleRemoveTargetByTag=attack-injection-php;ARGS:a,ctl:ruleRemoveTargetByTag=attack-rce;ARGS:a\"", "SecRule ARGS \"@contains a\" \"id:4400000,tag:'attack-injection-php',phase:2,t:none,msg:'test rule',drop\"" ] - } + } ] diff --git a/test/test-cases/regression/issue-2111.json b/test/test-cases/regression/issue-2111.json index c3faa7d216..6b9e0c494d 100644 --- a/test/test-cases/regression/issue-2111.json +++ b/test/test-cases/regression/issue-2111.json @@ -18,7 +18,7 @@ }, "uri":"index.php?foo=bar&z=xxx", "method":"GET", - "body": "" + "body": "\n" }, "server":{ "ip":"127.0.0.1", diff --git a/test/test-cases/regression/issue-2196.json b/test/test-cases/regression/issue-2196.json index 44347bd08d..58ef9c15ba 100644 --- a/test/test-cases/regression/issue-2196.json +++ b/test/test-cases/regression/issue-2196.json @@ -18,7 +18,7 @@ }, "uri":"index.php?foo=bar&a=xxx", "method":"GET", - "body": "" + "body": "\n" }, "expected": { "http_code": 200, diff --git a/test/test-cases/regression/issue-2296.json b/test/test-cases/regression/issue-2296.json index bc64d19bd2..0f3b674c45 100644 --- a/test/test-cases/regression/issue-2296.json +++ b/test/test-cases/regression/issue-2296.json @@ -29,7 +29,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -72,7 +72,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -115,7 +115,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -158,7 +158,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -202,7 +202,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -245,7 +245,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -289,7 +289,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -333,7 +333,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -376,7 +376,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -418,7 +418,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/issue-2423-msg-in-chain.json b/test/test-cases/regression/issue-2423-msg-in-chain.json index c667de0542..a9987faa75 100644 --- a/test/test-cases/regression/issue-2423-msg-in-chain.json +++ b/test/test-cases/regression/issue-2423-msg-in-chain.json @@ -109,7 +109,7 @@ "headers":{ "Host":"localhost", "Restricted":"attack", - "Other": "Value" + "Other": "Value" }, "uri":"/", "method":"GET" diff --git a/test/test-cases/regression/issue-2427.json b/test/test-cases/regression/issue-2427.json index 02f7b16f86..b31949319b 100644 --- a/test/test-cases/regression/issue-2427.json +++ b/test/test-cases/regression/issue-2427.json @@ -12,8 +12,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -23,26 +23,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"small2.txt\" ", - "Content-Type: text/plain", - "", - "This is another very small test file that contains the search content abcdef..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"small2.txt\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file that contains the search content abcdef..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -72,8 +72,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -83,26 +83,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"small2.txt\" ", - "Content-Type: text/plain", - "", - "This is another very small test file that does not contain the search content.", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"small2.txt\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file that does not contain the search content.\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ diff --git a/test/test-cases/regression/issue-3340.json b/test/test-cases/regression/issue-3340.json index 6251c860d4..bdc4e705ed 100644 --- a/test/test-cases/regression/issue-3340.json +++ b/test/test-cases/regression/issue-3340.json @@ -29,13 +29,13 @@ "uri": "/", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { "Content-Type": "text\/xml; charset=utf-8" }, - "body": "OK" + "body": "OK\n" }, "expected": { "http_code": 403 diff --git a/test/test-cases/regression/issue-394.json b/test/test-cases/regression/issue-394.json index 82827ac868..6d22ecf170 100644 --- a/test/test-cases/regression/issue-394.json +++ b/test/test-cases/regression/issue-394.json @@ -16,13 +16,13 @@ }, "request": { "headers": "", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_logs": "", diff --git a/test/test-cases/regression/issue-849.json b/test/test-cases/regression/issue-849.json index 60e0d4e2a4..e5bb9d8ee8 100644 --- a/test/test-cases/regression/issue-849.json +++ b/test/test-cases/regression/issue-849.json @@ -30,7 +30,7 @@ "uri": "\/test.pl?foo=bar", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { @@ -77,7 +77,7 @@ "uri": "\/test.pl?foo=bar", "method": "GET", "http_version": 1.1, - "body": "" + "body": "\n" }, "response": { "headers": { diff --git a/test/test-cases/regression/issue-960.json b/test/test-cases/regression/issue-960.json index 0fdb1ceaca..6abe8210ee 100644 --- a/test/test-cases/regression/issue-960.json +++ b/test/test-cases/regression/issue-960.json @@ -19,13 +19,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=test2", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", @@ -59,13 +59,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=test2", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", @@ -100,13 +100,13 @@ "Host": "www.google.com" }, "uri": "\/test.pl?param1= test ¶m2=test2", - "body": "", + "body": "\n", "method": "GET", "http_version": 1.1 }, "response": { "headers": "", - "body": "" + "body": "\n" }, "expected": { "audit_log": "", diff --git a/test/test-cases/regression/misc-variable-under-quotes.json b/test/test-cases/regression/misc-variable-under-quotes.json index c455b69dec..ea31ec5787 100644 --- a/test/test-cases/regression/misc-variable-under-quotes.json +++ b/test/test-cases/regression/misc-variable-under-quotes.json @@ -1,18 +1,18 @@ -[ - { +[ + { "enabled":1, "version_min":300000, "title":"Testing Variables (quoted) :: REQUEST_LINE - contains (1/2)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" @@ -20,37 +20,37 @@ "uri":"/?key=value&key=other_value", "method":"GET" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, - "expected":{ + "expected":{ "debug_log":"t:lowercase:" }, - "rules":[ + "rules":[ "SecRule \"REQUEST_LINE\" \"@contains index.php/admin/cms/wysiwyg/directive/\" \"id:1,phase:1,t:lowercase,ctl:auditLogParts=+E\"" ] }, - { + { "enabled":1, "version_min":300000, "title":"Testing Variables (quoted) :: REQUEST_LINE - regex (2/2)", - "client":{ + "client":{ "ip":"200.249.12.31", "port":123 }, - "server":{ + "server":{ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*" @@ -58,20 +58,20 @@ "uri":"/?key=value&key=other_value", "method":"GET" }, - "response":{ - "headers":{ + "response":{ + "headers":{ "Date":"Mon, 13 Jul 2015 20:02:41 GMT", "Last-Modified":"Sun, 26 Oct 2014 22:33:37 GMT", "Content-Type":"text/html" }, - "body":[ - "no need." + "body":[ + "no need.\n" ] }, - "expected":{ + "expected":{ "debug_log":"t:lowercase:" }, - "rules":[ + "rules":[ "SecRule \"REQUEST_LINE\" \"index.php/admin/cms/wysiwyg/directive/\" \"id:1,t:lowercase,ctl:auditLogParts=+E\"" ] } diff --git a/test/test-cases/regression/offset-variable.json b/test/test-cases/regression/offset-variable.json index 7ffe9299ba..2d88e040c8 100644 --- a/test/test-cases/regression/offset-variable.json +++ b/test/test-cases/regression/offset-variable.json @@ -18,7 +18,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -47,7 +47,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -70,7 +70,7 @@ "uri":"/index.html?param1=value1¶m2=value1", "method":"POST", "body":[ - "param1=value1¶m2=value1" + "param1=value1¶m2=value1\n" ] }, "response":{ @@ -79,7 +79,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -103,7 +103,7 @@ "uri":"/index.html?param1=value1¶m2=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -112,7 +112,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -136,7 +136,7 @@ "uri":"/index.html?param1=value1¶m2=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -145,7 +145,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -169,7 +169,7 @@ "uri":"/index.html?param1=value1¶m2=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -178,7 +178,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -202,7 +202,7 @@ "uri":"/index.html?param1=value1¶m2=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -211,7 +211,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -234,7 +234,7 @@ "uri":"/index.html?param1=value1¶m2=value1¶m3=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -243,7 +243,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -266,7 +266,7 @@ "uri":"/index.html?param1=value1¶m2=value1¶m3=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -275,7 +275,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -299,7 +299,7 @@ "uri":"/index.html?param1=value1¶m2=value1¶m3=value1", "method":"POST", "body":[ - "param1=value1¶m2=value2¶m3=value3" + "param1=value1¶m2=value2¶m3=value3\n" ] }, "response":{ @@ -308,7 +308,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -338,7 +338,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -368,7 +368,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -399,7 +399,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -431,7 +431,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -463,7 +463,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -495,7 +495,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -527,7 +527,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -559,7 +559,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -591,7 +591,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -623,7 +623,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -655,7 +655,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -687,7 +687,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -718,7 +718,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -749,7 +749,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -780,7 +780,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -812,7 +812,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -844,7 +844,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -876,7 +876,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -908,7 +908,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -950,7 +950,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -973,8 +973,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -984,22 +984,22 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1022,8 +1022,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1033,22 +1033,22 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1071,8 +1071,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1082,22 +1082,22 @@ }, "uri":"/", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1120,8 +1120,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1131,22 +1131,22 @@ }, "uri":"/wheee/file?something else", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1169,8 +1169,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1180,22 +1180,22 @@ }, "uri":"/wheee/f%20i%20l%20e%20?something else", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1218,8 +1218,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1229,22 +1229,22 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1267,8 +1267,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1278,22 +1278,22 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file2.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file2.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1316,8 +1316,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1327,26 +1327,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file2.txt\"", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file2.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1369,8 +1369,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1380,26 +1380,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1422,8 +1422,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1433,26 +1433,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1475,8 +1475,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1486,26 +1486,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1528,8 +1528,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1539,26 +1539,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1581,8 +1581,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1592,26 +1592,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1634,8 +1634,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1645,26 +1645,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1687,8 +1687,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1698,26 +1698,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1742,8 +1742,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1753,26 +1753,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1797,8 +1797,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1808,26 +1808,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1852,8 +1852,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1863,26 +1863,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1907,8 +1907,8 @@ "ip":"200.249.12.31", "port":80 }, - "request":{ - "headers":{ + "request":{ + "headers":{ "Host":"localhost", "User-Agent":"curl/7.38.0", "Accept":"*/*", @@ -1918,26 +1918,26 @@ }, "uri":"/wheee/f%20i%20l%20e%20", "method":"POST", - "body":[ - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name\"", - "", - "test", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"name2\"", - "", - "test2", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"", - "Content-Type: text/plain", - "", - "This is a very small test file..", - "----------------------------756b6d74fa1a8ee2", - "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" ", - "Content-Type: text/plain", - "", - "This is another very small test file..", - "----------------------------756b6d74fa1a8ee2--" + "body":[ + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name\"\n", + "\n", + "test\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"name2\"\n", + "\n", + "test2\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; name=\"filedata\"; filename=\"small_text_file1.txt\"\n", + "Content-Type: text/plain\n", + "\n", + "This is a very small test file..\n", + "----------------------------756b6d74fa1a8ee2\n", + "Content-Disposition: form-data; filename=\"small_text_file2.txt\"; name=\"fiasdfasdfledata\" \n", + "Content-Type: text/plain\n", + "\n", + "This is another very small test file..\n", + "----------------------------756b6d74fa1a8ee2--\n" ] }, "expected":{ @@ -1969,7 +1969,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ @@ -2000,7 +2000,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/operator-UnconditionalMatch.json b/test/test-cases/regression/operator-UnconditionalMatch.json index 5f73a2ec2e..f291bbe5a3 100644 --- a/test/test-cases/regression/operator-UnconditionalMatch.json +++ b/test/test-cases/regression/operator-UnconditionalMatch.json @@ -22,7 +22,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=value1¶m2=value2" + "param1=value1¶m2=value2\n" ] }, "response":{ @@ -32,7 +32,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/operator-detectsqli.json b/test/test-cases/regression/operator-detectsqli.json index e2e33c908f..1186f01eab 100644 --- a/test/test-cases/regression/operator-detectsqli.json +++ b/test/test-cases/regression/operator-detectsqli.json @@ -22,7 +22,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=ascii(substring(version() from 1 for 1))¶m2=value2" + "param1=ascii(substring(version() from 1 for 1))¶m2=value2\n" ] }, "response":{ @@ -32,7 +32,7 @@ "Content-Type":"text/html" }, "body":[ - "no need." + "no need.\n" ] }, "expected":{ diff --git a/test/test-cases/regression/operator-detectxss.json b/test/test-cases/regression/operator-detectxss.json index e2590193b0..075be024ec 100644 --- a/test/test-cases/regression/operator-detectxss.json +++ b/test/test-cases/regression/operator-detectxss.json @@ -22,7 +22,7 @@ "uri":"/", "method":"POST", "body": [ - "param1=