/**
  * Checks the response body as a substring or regular expression match according to the
  * leading-tilde convention
  *
  * @param config ConnectionConfig object from which response-text property is extracted
  * @param response Body of HTTP response to check
  * @return Whether the response matches the response-text property
  */
 protected boolean checkResponseBody(ConnectionConfig config, String response) {
   String expectedResponse = config.getKeyedString(PROPERTY_NAME_RESPONSE_TEXT, null);
   if (expectedResponse == null) {
     return true;
   }
   if (expectedResponse.startsWith("~")) {
     Pattern bodyPat = Pattern.compile(expectedResponse.substring(1), Pattern.DOTALL);
     return bodyPat.matcher(response).matches();
   } else {
     return response.contains(expectedResponse);
   }
 }
  /** {@inheritDoc} */
  @Override
  protected boolean checkProtocol(Socket socket, ConnectionConfig config) throws IOException {
    boolean isAServer = false;

    m_queryString =
        "GET " + config.getKeyedString(PROPERTY_NAME_URL, DEFAULT_URL) + " HTTP/1.0\r\n\r\n";

    LOG.debug("Query: {}", m_queryString);

    try {
      BufferedReader lineRdr = new BufferedReader(new InputStreamReader(socket.getInputStream()));

      socket.getOutputStream().write(m_queryString.getBytes());
      char[] cbuf = new char[1024];
      int chars = 0;
      StringBuffer response = new StringBuffer();
      try {
        while ((chars = lineRdr.read(cbuf, 0, 1024)) != -1) {
          String line = new String(cbuf, 0, chars);
          LOG.debug("Read: {} bytes: [{}] from socket.", line.length(), line);
          response.append(line);
        }
      } catch (java.net.SocketTimeoutException timeoutEx) {
        if (timeoutEx.bytesTransferred > 0) {
          String line = new String(cbuf, 0, timeoutEx.bytesTransferred);
          LOG.debug("Read: {} bytes: [{}] from socket @ timeout!", line.length(), line);
          response.append(line);
        }
      }
      if (response.toString() != null && response.toString().indexOf(m_responseString) > -1) {
        if (m_checkReturnCode) {
          int maxRetCode = config.getKeyedInteger(PROPERTY_NAME_MAX_RET_CODE, 399);
          if ((DEFAULT_URL.equals(config.getKeyedString(PROPERTY_NAME_URL, DEFAULT_URL)))
              || (config.getKeyedBoolean(PROPERTY_NAME_RETURN_CODE, true) == false)) {
            maxRetCode = 600;
          }
          StringTokenizer t = new StringTokenizer(response.toString());
          t.nextToken();
          int rVal = Integer.parseInt(t.nextToken());
          LOG.debug("{} : Request returned code: {}", getPluginName(), rVal);
          if (rVal >= 99 && rVal <= maxRetCode) isAServer = true;
        } else {
          isAServer = true;
        }
        if (isAServer) {
          isAServer = checkResponseBody(config, response.toString());
        }
      }
    } catch (SocketException e) {
      LOG.debug(
          "{}: a protocol error occurred talking to host {}",
          getPluginName(),
          InetAddressUtils.str(config.getInetAddress()),
          e);
      isAServer = false;
    } catch (NumberFormatException e) {
      LOG.debug(
          "{}: failed to parse response code from host {}",
          getPluginName(),
          InetAddressUtils.str(config.getInetAddress()),
          e);
      isAServer = false;
    }
    return isAServer;
  }