docs: public void sendAndReceive(HttpMessage msg, boolean isFollowRedirect) throws IOException {
  
  		log.debug("sendAndReceive " + msg.getRequestHeader().getMethod() + " "
  				+ msg.getRequestHeader().getURI() + " start");
  		msg.setTimeSentMillis(System.currentTimeMillis());
  
  		try {
  			notifyRequestListeners(msg);
  			if (!isFollowRedirect
  					|| !(msg.getRequestHeader().getMethod().equalsIgnoreCase(HttpRequestHeader.POST) || msg
  							.getRequestHeader().getMethod().equalsIgnoreCase(HttpRequestHeader.PUT))) {
  				// ZAP: Reauthentication when sending a message from the perspective of a User
  				sendAuthenticated(msg, isFollowRedirect);
  				return;
  			}
  
  			// ZAP: Reauthentication when sending a message from the perspective of a User
  			sendAuthenticated(msg, false);
  
  			HttpMessage temp = msg.cloneAll();
  			temp.setRequestingUser(getUser(msg));
  			// POST/PUT method cannot be redirected by library. Need to follow by code
  
  			// loop 1 time only because httpclient can handle redirect itself after first GET.
  			for (int i = 0; i < 1
  					&& (HttpStatusCode.isRedirection(temp.getResponseHeader().getStatusCode()) && temp
  							.getResponseHeader().getStatusCode() != HttpStatusCode.NOT_MODIFIED); i++) {
  				String location = temp.getResponseHeader().getHeader(HttpHeader.LOCATION);
  				URI baseUri = temp.getRequestHeader().getURI();
  				URI newLocation = new URI(baseUri, location, false);
  				temp.getRequestHeader().setURI(newLocation);
  
  				temp.getRequestHeader().setMethod(HttpRequestHeader.GET);
  				temp.getRequestHeader().setHeader(HttpHeader.CONTENT_LENGTH, null);
  				// ZAP: Reauthentication when sending a message from the perspective of a User
  				sendAuthenticated(temp, true);
  			}
  
  			msg.setResponseHeader(temp.getResponseHeader());
  			msg.setResponseBody(temp.getResponseBody());
  
  		} finally {
  			msg.setTimeElapsedMillis((int) (System.currentTimeMillis() - msg.getTimeSentMillis()));
  			log.debug("sendAndReceive " + msg.getRequestHeader().getMethod() + " "
  					+ msg.getRequestHeader().getURI() + " took " + msg.getTimeElapsedMillis());
  
  			notifyResponseListeners(msg);
  		}
  	}