docs: private void analyse(StructuralNode node) throws Exception {
  	// if analysed already, return;
          // move to host part
          if (node.getHistoryReference() == null) {
              return;
          }
  
          if (!parent.nodeInScope(node.getName())) {
              return;
          }
  
          // ZAP: Removed unnecessary cast.
          HttpMessage baseMsg = node.getHistoryReference().getHttpMessage();
          URI baseUri = (URI) baseMsg.getRequestHeader().getURI().clone();
  
          baseUri.setQuery(null);
          //System.out.println("analysing: " + baseUri.toString());
  
          // already exist one.  no need to test
          if (mapVisited.get(baseUri.toString()) != null) {
              return;
          }
  
          String path = getRandomPathSuffix(node, baseUri);
          HttpMessage msg = baseMsg.cloneRequest();
  
          URI uri = (URI) baseUri.clone();
          uri.setPath(path);
          msg.getRequestHeader().setURI(uri);
          //System.out.println("analysing 2: " + uri);
  
          sendAndReceive(msg);
  
  	// standard RFC response, no further check is needed
          if (msg.getResponseHeader().getStatusCode() == HttpStatusCode.NOT_FOUND) {
              addAnalysedHost(baseUri, msg, SampleResponse.ERROR_PAGE_RFC);
              return;
          }
  
          if (HttpStatusCode.isRedirection(msg.getResponseHeader().getStatusCode())) {
              addAnalysedHost(baseUri, msg, SampleResponse.ERROR_PAGE_REDIRECT);
              return;
          }
  
          if (msg.getResponseHeader().getStatusCode() != HttpStatusCode.OK) {
              addAnalysedHost(baseUri, msg, SampleResponse.ERROR_PAGE_NON_RFC);
              return;
          }
  
          HttpMessage msg2 = baseMsg.cloneRequest();
          URI uri2 = msg2.getRequestHeader().getURI();
          String path2 = getRandomPathSuffix(node, uri2);
          uri2 = (URI) baseUri.clone();
          uri2.setPath(path2);
          msg2.getRequestHeader().setURI(uri2);
          sendAndReceive(msg2);
  
          // remove HTML HEAD as this may contain expiry time which dynamic changes		
          String resBody1 = msg.getResponseBody().toString().replaceAll(p_REMOVE_HEADER, "");
          String resBody2 = msg2.getResponseBody().toString().replaceAll(p_REMOVE_HEADER, "");
  
          // check if page is static.  If so, remember this static page
          if (resBody1.equals(resBody2)) {
              msg.getResponseBody().setBody(resBody1);
              addAnalysedHost(baseUri, msg, SampleResponse.ERROR_PAGE_STATIC);
              return;
          }
  
          // else check if page is dynamic but deterministic
          resBody1 = resBody1.replaceAll(getPathRegex(uri), "").replaceAll("\\s[012]\\d:[0-5]\\d:[0-5]\\d\\s", "");
          resBody2 = resBody2.replaceAll(getPathRegex(uri2), "").replaceAll("\\s[012]\\d:[0-5]\\d:[0-5]\\d\\s", "");
          if (resBody1.equals(resBody2)) {
              msg.getResponseBody().setBody(resBody1);
              addAnalysedHost(baseUri, msg, SampleResponse.ERROR_PAGE_DYNAMIC_BUT_DETERMINISTIC);
              return;
          }
  
          // else mark app "undeterministic".
          addAnalysedHost(baseUri, msg, SampleResponse.ERROR_PAGE_UNDETERMINISTIC);
  
      }