docs: public void processHttpResponseMessage(HttpMessage message) {
  
  		// Get the session tokens for this site
  		HttpSessionTokensSet siteTokensSet = extension.getHttpSessionTokensSet(getSite());
  
  		// No tokens for this site, so no processing
  		if (siteTokensSet == null) {
  			log.debug("No session tokens for: " + this.getSite());
  			return;
  		}
  		// Create an auxiliary map of token values and insert keys for every token
  		Map<String, Cookie> tokenValues = new HashMap<>();
  
  		// Get new values that were set for tokens (e.g. using SET-COOKIE headers), if any
  		
  		List<HttpCookie> cookiesToSet = message.getResponseHeader().getHttpCookies(message.getRequestHeader().getHostName());
  		for (HttpCookie cookie : cookiesToSet) {
  			String lcCookieName = cookie.getName();
  			if (siteTokensSet.isSessionToken(lcCookieName)) {
  				try {
  					// Use 0 if max-age less than -1, Cookie class does not accept negative (expired) max-age (-1 has special
  					// meaning).
  					long maxAge = cookie.getMaxAge() < -1 ? 0 : cookie.getMaxAge();
  					Cookie ck = new Cookie(cookie.getDomain(),lcCookieName,cookie.getValue(),cookie.getPath(),(int) maxAge,cookie.getSecure());				
  					tokenValues.put(lcCookieName, ck);
  				} catch (IllegalArgumentException e) {
  					log.warn("Failed to create cookie [" + cookie + "] for site [" + getSite() + "]: " + e.getMessage());
  				}
  			}
  		}
  
  		// Get the cookies present in the request
  		List<HttpCookie> requestCookies = message.getRequestHeader().getHttpCookies();
  
  		// XXX When an empty HttpSession is set in the message and the response
  		// contains session cookies, the empty HttpSession is reused which
  		// causes the number of messages matched to be incorrect.
  
  		// Get the session, based on the request header
  		HttpSession session = message.getHttpSession();
  		if (session == null || !session.isValid()) {
  			session = getMatchingHttpSession(requestCookies, siteTokensSet);
  			if (log.isDebugEnabled()) {
  				log.debug("Matching session for response message (from site " + getSite() + "): " + session);
  			}
  		} else {
  			if (log.isDebugEnabled()) {
  				log.debug("Matching cached session for response message (from site " + getSite() + "): "
  						+ session);
  			}
  		}
  
  		boolean newSession = false;
  		// If the session didn't exist, create it now
  		if (session == null) {
  			session = new HttpSession(generateUniqueSessionName(),
  					extension.getHttpSessionTokensSet(getSite()));
  			this.addHttpSession(session);
  
  			// Add all the existing tokens from the request, if they don't replace one in the
  			// response
  			for (HttpCookie cookie : requestCookies) {
  				String cookieName = cookie.getName();
  				if (siteTokensSet.isSessionToken(cookieName)) {
  					if (!tokenValues.containsKey(cookieName)) {
  						
  						// We must ensure that a cookie as always a valid domain and path in order to be able to reuse it.
  						// HttpClient will discard invalid cookies
  						
  						String domain = cookie.getDomain();
  						if (domain == null) {
  							domain = message.getRequestHeader().getHostName();
  						}
  						
  						String path = cookie.getPath();
  						if (path == null) {
  							path = "/"; // Default path
  						}
  							
  						Cookie ck = new Cookie(domain, cookieName, cookie.getValue(), path,	(int) cookie.getMaxAge(), cookie.getSecure());
  						tokenValues.put(cookieName,ck);
  					}
  				}
  			}
  			newSession = true;
  		}
  
  		// Update the session
  		if (!tokenValues.isEmpty()) {
  			for (Entry<String, Cookie> tv : tokenValues.entrySet()) {
  				session.setTokenValue(tv.getKey(), tv.getValue());
  			}
  		}
  
  		if (newSession && log.isDebugEnabled()) {
  			log.debug("Created a new session as no match was found: " + session);
  		}
  
  		// Update the count of messages matched
  		session.setMessagesMatched(session.getMessagesMatched() + 1);
  
  		this.model.fireHttpSessionUpdated(session);
  		
  		// Store the session in the HttpMessage for caching purpose
  		message.setHttpSession(session);
  	}