### POST /api/echo "hello body"  X-Body-Mode=none
HTTP 200  body=echo:hello body
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain POST /api/echo
03 REQUEST  servlet:DispatcherServlet      doDispatch start
04 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#echo
05 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#echo
06 REQUEST  aspect:controller              before HelloController#echo args=[hello body]
07 REQUEST  controller                     echo received 10 chars
08 REQUEST  aspect:controller              after  HelloController#echo returned=echo:hello body (String)
09 REQUEST  interceptor:B                  postHandle status=200 modelAndView=null
10 REQUEST  interceptor:A                  postHandle status=200 modelAndView=null
11 REQUEST  interceptor:B                  afterCompletion ex=null
12 REQUEST  interceptor:A                  afterCompletion ex=null
13 REQUEST  servlet:DispatcherServlet      doDispatch end
14 REQUEST  filter:accessLog(order 10)     after chain status=200 asyncStarted=false
15 REQUEST  filter:raw(order 5)            after chain

### POST /api/echo "hello body"  X-Body-Mode=consume
HTTP 400  body={"handled":"unreadable body"}
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain POST /api/echo
03 REQUEST  filter:body(order 30)          read raw stream: 10 bytes, passing the ORIGINAL request on
04 REQUEST  servlet:DispatcherServlet      doDispatch start
05 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#echo
06 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#echo
07 REQUEST  advice:@ExceptionHandler       handling HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.ankurm.filteraop.web.HelloController.echo(java.lang.String)
08 REQUEST  interceptor:B                  afterCompletion ex=null
09 REQUEST  interceptor:A                  afterCompletion ex=null
10 REQUEST  servlet:DispatcherServlet      doDispatch end
11 REQUEST  filter:accessLog(order 10)     after chain status=400 asyncStarted=false
12 REQUEST  filter:raw(order 5)            after chain

### POST /api/echo "hello body"  X-Body-Mode=cache
HTTP 200  body=echo:hello body
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain POST /api/echo
03 REQUEST  filter:body(order 30)          CCRW before chain: getContentAsByteArray().length=0
04 REQUEST  servlet:DispatcherServlet      doDispatch start
05 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#echo
06 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#echo
07 REQUEST  aspect:controller              before HelloController#echo args=[hello body]
08 REQUEST  controller                     echo received 10 chars
09 REQUEST  aspect:controller              after  HelloController#echo returned=echo:hello body (String)
10 REQUEST  interceptor:B                  postHandle status=200 modelAndView=null
11 REQUEST  interceptor:A                  postHandle status=200 modelAndView=null
12 REQUEST  interceptor:B                  afterCompletion ex=null
13 REQUEST  interceptor:A                  afterCompletion ex=null
14 REQUEST  servlet:DispatcherServlet      doDispatch end
15 REQUEST  filter:body(order 30)          CCRW after chain: getContentAsByteArray().length=10 -> "hello body"
16 REQUEST  filter:accessLog(order 10)     after chain status=200 asyncStarted=false
17 REQUEST  filter:raw(order 5)            after chain

### POST /api/echo "hello body"  X-Body-Mode=consume-wrapped
HTTP 400  body={"handled":"unreadable body"}
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain POST /api/echo
03 REQUEST  filter:body(order 30)          CCRW drained by the filter: 10 bytes read, getContentAsByteArray().length=10
04 REQUEST  servlet:DispatcherServlet      doDispatch start
05 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#echo
06 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#echo
07 REQUEST  advice:@ExceptionHandler       handling HttpMessageNotReadableException: Required request body is missing: public java.lang.String com.ankurm.filteraop.web.HelloController.echo(java.lang.String)
08 REQUEST  interceptor:B                  afterCompletion ex=null
09 REQUEST  interceptor:A                  afterCompletion ex=null
10 REQUEST  servlet:DispatcherServlet      doDispatch end
11 REQUEST  filter:body(order 30)          CCRW after chain: getContentAsByteArray().length=10 -> "hello body"
12 REQUEST  filter:accessLog(order 10)     after chain status=400 asyncStarted=false
13 REQUEST  filter:raw(order 5)            after chain

### POST /api/echo "hello body"  X-Body-Mode=replay
HTTP 200  body=echo:hello body
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain POST /api/echo
03 REQUEST  filter:body(order 30)          own replayable wrapper: 10 bytes read up front
04 REQUEST  servlet:DispatcherServlet      doDispatch start
05 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#echo
06 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#echo
07 REQUEST  aspect:controller              before HelloController#echo args=[hello body]
08 REQUEST  controller                     echo received 10 chars
09 REQUEST  aspect:controller              after  HelloController#echo returned=echo:hello body (String)
10 REQUEST  interceptor:B                  postHandle status=200 modelAndView=null
11 REQUEST  interceptor:A                  postHandle status=200 modelAndView=null
12 REQUEST  interceptor:B                  afterCompletion ex=null
13 REQUEST  interceptor:A                  afterCompletion ex=null
14 REQUEST  servlet:DispatcherServlet      doDispatch end
15 REQUEST  filter:accessLog(order 10)     after chain status=200 asyncStarted=false
16 REQUEST  filter:raw(order 5)            after chain

### GET /api/hello/ankur  X-Resp-Mode=copy (ContentCachingResponseWrapper)
HTTP 200  body=Hello, ankur  Content-Length=12
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain GET /api/hello/ankur
03 REQUEST  servlet:DispatcherServlet      doDispatch start
04 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#hello
05 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#hello
06 REQUEST  aspect:controller              before HelloController#hello args=[ankur]
07 REQUEST  controller                     hello(ankur)
08 REQUEST  aspect:service                 before GreetingService#greet args=[ankur]
09 REQUEST  aspect:service                 after  GreetingService#greet returned=Hello, ankur
10 REQUEST  aspect:controller              after  HelloController#hello returned=Hello, ankur (String)
11 REQUEST  interceptor:B                  postHandle status=200 modelAndView=null
12 REQUEST  interceptor:A                  postHandle status=200 modelAndView=null
13 REQUEST  interceptor:B                  afterCompletion ex=null
14 REQUEST  interceptor:A                  afterCompletion ex=null
15 REQUEST  servlet:DispatcherServlet      doDispatch end
16 REQUEST  filter:body(order 30)          response wrapper holds 12 bytes
17 REQUEST  filter:body(order 30)          copyBodyToResponse() called
18 REQUEST  filter:accessLog(order 10)     after chain status=200 asyncStarted=false
19 REQUEST  filter:raw(order 5)            after chain

### GET /api/hello/ankur  X-Resp-Mode=forget (ContentCachingResponseWrapper)
HTTP 200  (empty body)  Content-Length=0
01 REQUEST  filter:raw(order 5)            before chain
02 REQUEST  filter:accessLog(order 10)     before chain GET /api/hello/ankur
03 REQUEST  servlet:DispatcherServlet      doDispatch start
04 REQUEST  interceptor:A                  preHandle  handler=HandlerMethod HelloController#hello
05 REQUEST  interceptor:B                  preHandle  handler=HandlerMethod HelloController#hello
06 REQUEST  aspect:controller              before HelloController#hello args=[ankur]
07 REQUEST  controller                     hello(ankur)
08 REQUEST  aspect:service                 before GreetingService#greet args=[ankur]
09 REQUEST  aspect:service                 after  GreetingService#greet returned=Hello, ankur
10 REQUEST  aspect:controller              after  HelloController#hello returned=Hello, ankur (String)
11 REQUEST  interceptor:B                  postHandle status=200 modelAndView=null
12 REQUEST  interceptor:A                  postHandle status=200 modelAndView=null
13 REQUEST  interceptor:B                  afterCompletion ex=null
14 REQUEST  interceptor:A                  afterCompletion ex=null
15 REQUEST  servlet:DispatcherServlet      doDispatch end
16 REQUEST  filter:body(order 30)          response wrapper holds 12 bytes
17 REQUEST  filter:body(order 30)          copyBodyToResponse() NOT called
18 REQUEST  filter:accessLog(order 10)     after chain status=200 asyncStarted=false
19 REQUEST  filter:raw(order 5)            after chain
