/** * Create and register a new trace token with a random id. * @param properties Additional properties to include in the token. * @return The id of the created token. */ public static String createAndRegisterNewRequestToken(String... properties) { checkArgument((properties.length % 2) == 0, "odd number of elements in properties"); String newToken = UUID.randomUUID().toString(); registerRequestToken(newToken); if (properties.length != 0) { addTraceTokenProperties(properties); } return newToken; }
private void registerNewRequestToken(HttpServletRequest request) throws UnknownHostException { byte[] randomBytes = new byte[15]; SECURE_RANDOM.get().nextBytes(randomBytes); registerRequestToken(tokenPrefix + encodeAddress(InetAddress.getByName(clientAddressExtractor.clientAddressFor(request))) + BASE64_URL_ENCODER.encodeToString(randomBytes) ); } }
@Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) servletRequest; HttpServletResponse response = (HttpServletResponse) servletResponse; String token = request.getHeader("X-Proofpoint-TraceToken"); if (token == null || token.isEmpty()) { registerNewRequestToken(request); } else if (token.charAt(0) == '{') { try { registerTraceToken(TRACE_TOKEN_JSON_CODEC.fromJson(token)); } catch (RuntimeException e) { registerNewRequestToken(request); } } else { registerRequestToken(token); } chain.doFilter(request, response); }