[
  {
    "enabled": 1,
    "version_min": 300000,
    "title": "Testing JSON request body parser 1/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": "*/*",
        "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120",
        "Content-Type": "application/json",
        "Content-Length": "39"
      },
      "uri": "/?key=value&key=other_value",
      "method": "POST",
      "body": [
        "{",
        "       \"foo\":\"bar\",",
        "       \"mod\":\"sec\"",
        "}"
      ]
    },
    "response": {
      "headers": {
        "Content-Length": "0"
      },
      "body": [
        ""
      ]
    },
    "expected": {
      "debug_log": "Target value: \"bar\" \\(Variable: ARGS:json.foo\\)",
      "http_code": 200
    },
    "rules": [
      "SecRuleEngine On",
      "SecRequestBodyAccess On",
      "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"",
      "SecRule ARGS:json.foo \"bar\" \"id:'200441',phase:3,log\""
    ]
  },
  {
    "enabled": 1,
    "version_min": 300000,
    "title": "Testing JSON request body parser 2/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": "*/*",
        "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120",
        "Content-Type": "application/json",
        "Content-Length": "68"
      },
      "uri": "/?key=value&key=other_value",
      "method": "POST",
      "body": [
        "{",
        "\"first_level\":",
        "{",
        "       \"first_key\":\"bar\",",
        "       \"second_key\":\"sec\"",
        "}",
        "}"
      ]
    },
    "response": {
      "headers": {
        "Content-Length": "0"
      },
      "body": [
        ""
      ]
    },
    "expected": {
      "debug_log": "Target value: \"bar\" \\(Variable: ARGS:json.first_level.first_key\\)",
      "http_code": 200
    },
    "rules": [
      "SecRuleEngine On",
      "SecRequestBodyAccess On",
      "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"",
      "SecRule ARGS \"bar\" \"id:'200441',phase:3,log\""
    ]
  },
  {
    "enabled": 1,
    "version_min": 300000,
    "title": "Testing JSON request body parser - issue #1822 (1/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": "*/*",
        "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120",
        "Content-Type": "application/json",
        "Content-Length": "0"
      },
      "uri": "/?key=value&key=other_value",
      "method": "POST",
      "body": [
        ""
      ]
    },
    "response": {
      "headers": {
        "Content-Length": "0"
      },
      "body": [
        ""
      ]
    },
    "expected": {
      "debug_log": "Target value: \"0\" .Variable: REQBODY_ERROR.",
      "http_code": 200
    },
    "rules": [
      "SecRuleEngine On",
      "SecRequestBodyAccess On",
      "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"",
      "SecRule REQBODY_ERROR \"0\" \"id:'200441',phase:3,log\""
    ]
  },
  {
    "enabled": 1,
    "version_min": 300000,
    "title": "Testing JSON request body parser - issue #1822 (2/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": "*/*",
        "Cookie": "PHPSESSID=rAAAAAAA2t5uvjq435r4q7ib3vtdjq120",
        "Content-Type": "application/json",
        "Content-Length": "1"
      },
      "uri": "/?key=value&key=other_value",
      "method": "POST",
      "body": [
        "a"
      ]
    },
    "response": {
      "headers": {
        "Content-Length": "0"
      },
      "body": [
        ""
      ]
    },
    "expected": {
      "debug_log": "Target value: \"1\" .Variable: REQBODY_ERROR.",
      "http_code": 200
    },
    "rules": [
      "SecRuleEngine On",
      "SecRequestBodyAccess On",
      "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=JSON\"",
      "SecRule REQBODY_ERROR \"0\" \"id:'200441',phase:3,log\""
    ]
  },
  {
    "enabled": 1,
    "version_min": 300000,
    "title": "Testing JSON request body parser - depth not over 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",
        "Content-Type": "application/json",
        "Content-Length": "70"
      },
      "uri": "/?foo=bar",
      "method": "POST",
      "body": [
        "{",
        "   \"key1\":",
        "{",
        "   \"key2\":",
        "{",
        "   \"key3\":",
        "{",
        "   \"key4\":",
        "{",
        "   \"key5\":\"thevalue\"",
        "}}}}}"
      ]
    },
    "response": {
      "headers": {
        "Content-Length": "0"
      },
      "body": [
        ""
      ]
    },
    "expected": {
      "debug_log": "json.key1.key2.key3.key4.key5",
      "http_code": 200
    },
    "rules": [
      "SecRuleEngine On",
      "SecRequestBodyJsonDepthLimit 5",
      "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,pass,nolog,ctl:requestBodyProcessor=JSON\"",
      "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:403,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}'\""
    ]
  },
  {
    "enabled": 1,
    "version_min": 300000,
    "title": "Testing JSON request body parser - depth over 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",
        "Content-Type": "application/json",
        "Content-Length": "70"
      },
      "uri": "/?foo=bar",
      "method": "POST",
      "body": [
        "{",
        "   \"key1\":",
        "{",
        "   \"key2\":",
        "{",
        "   \"key3\":",
        "{",
        "   \"key4\":",
        "{",
        "   \"key5\":\"thevalue\"",
        "}}}}}"
      ]
    },
    "response": {
      "headers": {
        "Content-Length": "0"
      },
      "body": [
        ""
      ]
    },
    "expected": {
      "debug_log": "Failed to parse request body",
      "http_code": 403
    },
    "rules": [
      "SecRuleEngine On",
      "SecRequestBodyJsonDepthLimit 4",
      "SecRule REQUEST_HEADERS:Content-Type \"application/json\" \"id:'200001',phase:1,t:none,pass,nolog,ctl:requestBodyProcessor=JSON\"",
      "SecRule REQBODY_ERROR \"!@eq 0\" \"id:'200002', phase:2,t:none,log,deny,status:403,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}'\""
    ]
  }
]
