package Ġio . github . g 0 dk ar . spring Api Comparator Ċ Ċ import Ġio . github . g 0 dk ar . spring Api Comparator . annotation . Compare Api Ċ import Ġio . github . g 0 dk ar . spring Api Comparator . internal . Api Comparator Ċ import Ġio . github . g 0 dk ar . spring Api Comparator . internal . ApiRequest Ċ import Ġio . github . g 0 dk ar . spring Api Comparator . internal . ApiResponse Ċ import Ġorg . apache . hc . client 5 . http . impl . classic . Closeable HttpClient Ċ import Ġorg . apache . hc . client 5 . http . impl . classic . HttpClient s Ċ import Ġorg . slf 4 j . Logger Ċ import Ġorg . slf 4 j . LoggerFactory Ċ import Ġorg . springframework . web . filter . Once Per Request Filter Ċ import Ġorg . springframework . web . method . Handler Method Ċ import Ġorg . springframework . web . servlet . Handler Mapping . BEST _ MATCH ING _ HANDLER _ ATTRIBUTE Ċ import Ġorg . springframework . web . util . Content Caching Request Wrapper Ċ import Ġorg . springframework . web . util . Content Caching Response Wrapper Ċ import Ġjavax . servlet . FilterChain Ċ import Ġjavax . servlet . http . HttpServletRequest Ċ import Ġjavax . servlet . http . HttpServletResponse Ċ Ċ class ĠApi Comparator Filter ( ĊĠĠĠ Ġapi Comparator HttpClient : ĠClose able HttpClient Ġ= ĠHttpClient s . create System (), ĊĠĠĠ Ġprivate Ġval Ġlog : ĠLogger Ġ= ĠLoggerFactory . getLogger ( Api Comparator Filter :: class . java ) Ċ ) Ġ: ĠOnce Per Request Filter () Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġapi Comparator Ġ= ĠApi Comparator ( api Comparator HttpClient ) ĊĊĠĠĠ Ġoverride Ġfun Ġdo Filter Internal ( ĊĠĠĠĠĠĠĠ Ġrequest : ĠHttpServletRequest , ĊĠĠĠĠĠĠĠ Ġresponse : ĠHttpServletResponse , ĊĠĠĠĠĠĠĠ Ġfilter Chain : ĠFilter Chain ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapped Request Ġ= Ġwrap Request ( request ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġwrapped Response Ġ= Ġwrap Response ( response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfilter Chain . do Filter ( wrapped Request , Ġwrapped Response ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwrapped Response . copy Body To Response () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhandler Ġ= Ġrequest . getAttribute ( BEST _ MATCH ING _ HANDLER _ ATTRIBUTE ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( handler Ġis ĠHandler Method Ġ&& Ġhandler . has Method Annotation ( Compare Api :: class . java )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ApiRequest Ġ= ĠApi Request . from ( wrapped Request ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġoriginal ApiResponse Ġ= ĠApiResponse . from ( wrapped Response ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotation Ġ= Ġhandler . getMethod Annotation ( Compare Api :: class . java ) !! ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġapi Comparator . compare ( annotation . value , Ġoriginal ApiRequest , Ġoriginal ApiResponse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog . info (" Unknown Ġhandler : Ġ{} Ġ( type ={ })", Ġhandler , Ġhandler . java Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlog . error (" Error Ġon Ġfilter Chain !", Ġe ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrap Request ( request : ĠHttpServletRequest ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( request Ġ! is ĠContent Caching Request Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent Caching Request Wrapper ( request ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequest ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġwrap Response ( response : ĠHttpServletResponse ) Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( response Ġ! is ĠContent Caching Response Wrapper ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠContent Caching Response Wrapper ( response ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresponse ĊĠĠĠĠĠĠĠ Ġ} Ċ } Ċ