3

Want to implement a proxy on top of Spring API Gateway to log requests/responses. I defined my own filters for incoming request and outcoming responses.

REQUEST GATEWAY FILTER:

public class RequestGatewayFilter extends AbstractGatewayFilterFactory<RequestGatewayFilter.Config> {

private static final Logger logger = LogManager.getLogger(RequestGatewayFilter.class);

public RequestGatewayFilter() {
    super(Config.class);
}

@Autowired
CustomProxyLogger customLogger;

@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        ServerHttpRequest.Builder builder = exchange.getRequest().mutate()
                .header(PR_CORRELATION_ID, UUID.randomUUID().toString());
        ServerHttpRequest request = builder.build();
        customLogger.logRequest(logger, request);
        return chain.filter(exchange.mutate().request(request).build());
    };
}

}

RESPONSE GATEWAY FILTER:

public class ResponseGatewayFilter extends AbstractGatewayFilterFactory<ResponseGatewayFilter.Config> {

private static final Logger logger = LogManager.getLogger(ResponseGatewayFilter.class);

public ResponseGatewayFilter() {
    super(Config.class);
}

@Autowired
CustomProxyLogger customLogger;

@Override
public GatewayFilter apply(Config config) {
    return (exchange, chain) -> {
        return chain.filter(exchange).then(Mono.fromRunnable(() -> {
            ServerHttpResponse response = exchange.getResponse();
            customLogger.logResponse(logger, exchange);
        }));
    };
}

I have to log request and response body. I tried several ways for example as explained on How to correctly read Flux<DataBuffer> and convert it to a single inputStream In this case the map function did not execute anytime.

Also tried casting ServerHttpRequest to HttpServletRequest in order to get body from there but this throws Cast Exception.

None worked....

Any ideas or possible approaches to solve this 'get body' problem ?

  • Not answering your direct question, but if applicable be careful to not log [PII](https://en.wikipedia.org/wiki/Personally_identifiable_information). – Andrew S Jan 14 '19 at 21:09

1 Answers1

-4

Simply create another one Filter and log all requests, responses.

    @Component
    public class RequestResponseLoggingFilter implements Filter {

...

        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
            HttpServletRequest req = (HttpServletRequest) request;
            HttpServletResponse res = (HttpServletResponse) response;
            LOG.info(request);
            chain.doFilter(request, response);
            LOG.info(response);
        }

    }
Pasha
  • 1,768
  • 6
  • 22
  • 43