// Copyright © 2015 HSL <https://www.hsl.fi> // This program is dual-licensed under the EUPL v1.2 and AGPLv3 licenses. package fi.hsl.parkandride.front; import fi.hsl.parkandride.MDCFilter; import fi.hsl.parkandride.core.domain.RequestLogKey; import fi.hsl.parkandride.core.service.BatchingRequestLogService; import org.joda.time.DateTime; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.web.servlet.HandlerMapping; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.Optional; public class RequestLoggingInterceptor extends HandlerInterceptorAdapter { private static final Logger logger = LoggerFactory.getLogger(RequestLoggingInterceptor.class); // The source header for API requests public static final String SOURCE_HEADER = MDCFilter.LIIPI_APPLICATION_ID; private final BatchingRequestLogService batchingRequestLogService; public RequestLoggingInterceptor(BatchingRequestLogService batchingRequestLogService) { this.batchingRequestLogService = batchingRequestLogService; } @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { Optional.ofNullable((String) request.getAttribute(HandlerMapping.BEST_MATCHING_PATTERN_ATTRIBUTE)) .filter(s -> s.startsWith(UrlSchema.API)) .ifPresent(urlPattern -> { final String source = request.getHeader(SOURCE_HEADER); logger.trace("Intercepted API call: <{}> for source <{}>", urlPattern, source); batchingRequestLogService.increment(new RequestLogKey(urlPattern, source, DateTime.now())); }); return super.preHandle(request, response, handler); } }