DIRKRB-714 Replace Jersey client with HttpURLConnection in HasInitClient.
diff --git a/has-project/has-client/pom.xml b/has-project/has-client/pom.xml
index f3a90a7..c8b3468 100644
--- a/has-project/has-client/pom.xml
+++ b/has-project/has-client/pom.xml
@@ -29,16 +29,6 @@
     </dependency>
     <dependency>
       <groupId>com.sun.jersey</groupId>
-      <artifactId>jersey-client</artifactId>
-      <version>${jersey.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>org.glassfish.jersey.containers</groupId>
-      <artifactId>jersey-container-servlet-core</artifactId>
-      <version>${jersey.container.version}</version>
-    </dependency>
-    <dependency>
-      <groupId>com.sun.jersey</groupId>
       <artifactId>jersey-json</artifactId>
       <version>${jersey.version}</version>
     </dependency>
diff --git a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasAuthAdminClient.java b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasAuthAdminClient.java
index ec27fb5..e2d74a6 100644
--- a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasAuthAdminClient.java
+++ b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasAuthAdminClient.java
@@ -21,9 +21,6 @@
 
 import org.apache.kerby.KOptions;
 import org.apache.kerby.has.common.HasConfig;
-import org.apache.kerby.has.common.HasException;
-import org.apache.kerby.has.common.ssl.SSLFactory;
-import org.apache.kerby.has.common.util.URLConnectionFactory;
 import org.apache.kerby.kerberos.kerb.KrbException;
 import org.apache.kerby.kerberos.kerb.admin.kadmin.Kadmin;
 import org.codehaus.jettison.json.JSONArray;
@@ -40,7 +37,6 @@
 import java.io.OutputStream;
 import java.net.HttpURLConnection;
 import java.net.MalformedURLException;
-import java.net.ProtocolException;
 import java.net.URL;
 import java.util.ArrayList;
 import java.util.List;
@@ -59,63 +55,12 @@
         this.hasConfig = hasConfig;
     }
 
-    protected HttpURLConnection getHttpsConnection(URL url, boolean isSpnego) throws Exception {
-        HasConfig conf = new HasConfig();
-
-        conf.setString(SSLFactory.SSL_HOSTNAME_VERIFIER_KEY, "ALLOW_ALL");
-        String sslClientConf = hasConfig.getSslClientConf();
-        conf.setString(SSLFactory.SSL_CLIENT_CONF_KEY, sslClientConf);
-        conf.setBoolean(SSLFactory.SSL_REQUIRE_CLIENT_CERT_KEY, false);
-
-        URLConnectionFactory connectionFactory = URLConnectionFactory
-            .newDefaultURLConnectionFactory(conf);
-        return (HttpURLConnection) connectionFactory.openConnection(url, isSpnego, hasConfig);
+    private String getKadminBaseURL() throws KrbException {
+        return HasClientUtil.getBaseUrl(hasConfig, "kadmin");
     }
 
-    /**
-     * Create an authenticated connection to the Has server.
-     * <p>
-     * It uses Hadoop-auth client authentication which by default supports
-     * Kerberos HTTP SPNEGO, Pseudo/Simple and anonymous.
-     *
-     * @param url    the URL to open a HTTP connection to.
-     * @param method the HTTP method for the HTTP connection.
-     * @return an authenticated connection to the has server.
-     * @throws IOException if an IO error occurred.
-     */
-    protected HttpURLConnection createConnection(URL url, String method) {
-        HttpURLConnection conn = null;
-        if (hasConfig.getHttpsPort() != null && hasConfig.getHttpsHost() != null) {
-            try {
-                conn = getHttpsConnection(url, true);
-            } catch (Exception e) {
-                throw new RuntimeException("Error occurred when creating https connection. " + e.getMessage());
-            }
-        }
-        if (method.equals("POST") || method.equals("PUT")) {
-            conn.setDoOutput(true);
-        }
-        return conn;
-    }
-
-    private String getKadminBaseURL() {
-        return getBaseUrl("kadmin");
-    }
-
-    private String getHadminBaseURL() {
-        return getBaseUrl("hadmin");
-    }
-
-    private String getBaseUrl(String input) {
-        String url = null;
-        if (hasConfig.getHttpsPort() != null && hasConfig.getHttpsHost() != null) {
-            url = "https://" + hasConfig.getHttpsHost() + ":" + hasConfig.getHttpsPort()
-                + "/has/v1/" + input + "/";
-        }
-        if (url == null) {
-            throw new RuntimeException("Please set the https address and port.");
-        }
-        return url;
+    private String getHadminBaseURL() throws KrbException {
+        return HasClientUtil.getBaseUrl(hasConfig, "hadmin");
     }
 
     @Override
@@ -129,25 +74,15 @@
             throw new KrbException("Failed to create a URL object.", e);
         }
 
-        httpConn = createConnection(url, "POST");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "POST", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
         try {
-            httpConn.setRequestMethod("POST");
-        } catch (ProtocolException e) {
-            LOG.error("Fail to add principal. " + e);
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
-        try {
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                LOG.info(getResponse(httpConn));
+                LOG.info(HasClientUtil.getResponse(httpConn));
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
             throw new KrbException("IO error occurred.", e);
@@ -166,24 +101,15 @@
             throw new KrbException("Failed to create a URL object.", e);
         }
 
-        httpConn = createConnection(url, "POST");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "POST", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
         try {
-            httpConn.setRequestMethod("POST");
-        } catch (ProtocolException e) {
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
-        try {
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                LOG.info(getResponse(httpConn));
+                LOG.info(HasClientUtil.getResponse(httpConn));
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
             throw new KrbException("IO error occurred.", e);
@@ -192,7 +118,7 @@
 
     @Override
     public void addPrincipal(String principal, String password, KOptions kOptions) throws KrbException {
-
+        throw new KrbException("Unsupported feature");
     }
 
     @Override
@@ -206,22 +132,13 @@
             throw new KrbException("Failed to create a URL object.", e);
         }
 
-        httpConn = createConnection(url, "DELETE");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "DELETE", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
         try {
-            httpConn.setRequestMethod("DELETE");
-        } catch (ProtocolException e) {
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
-        try {
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                LOG.info(getResponse(httpConn));
+                LOG.info(HasClientUtil.getResponse(httpConn));
             } else {
                 throw new KrbException("Connection deined.");
             }
@@ -232,7 +149,7 @@
 
     @Override
     public void modifyPrincipal(String principal, KOptions kOptions) throws KrbException {
-
+        throw new KrbException("Unsupported feature");
     }
 
     @Override
@@ -247,24 +164,15 @@
             throw new KrbException("Failed to create a URL object.", e);
         }
 
-        httpConn = createConnection(url, "POST");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "POST", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
         try {
-            httpConn.setRequestMethod("POST");
-        } catch (ProtocolException e) {
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
-        try {
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                LOG.info(getResponse(httpConn));
+                LOG.info(HasClientUtil.getResponse(httpConn));
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
             throw new KrbException("IO error occurred.", e);
@@ -281,25 +189,19 @@
         } catch (MalformedURLException e) {
             throw new KrbException("Failed to create a URL object.", e);
         }
+        LOG.info("Remote Admin Url: " + url);
 
-        httpConn = createConnection(url, "GET");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
-        try {
-            httpConn.setRequestMethod("GET");
-        } catch (ProtocolException e) {
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
         String response;
         try {
             httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                response = getResponse(httpConn);
+                response = HasClientUtil.getResponse(httpConn);
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
             LOG.error("IO error occurred." + e.getMessage());
@@ -319,26 +221,16 @@
             throw new KrbException("Failed to create a URL object. ", e);
         }
 
-        httpConn = createConnection(url, "GET");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
-        try {
-            httpConn.setRequestMethod("GET");
-        } catch (ProtocolException e) {
-            LOG.error("Failed to set the method for URL request." + e.getMessage());
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
         String response;
         try {
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                response = getResponse(httpConn);
+                response = HasClientUtil.getResponse(httpConn);
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
             throw new KrbException("IO error occurred.", e);
@@ -379,19 +271,12 @@
             throw new KrbException("Failed to create a URL object.", e);
         }
 
-        HttpURLConnection httpConn = createConnection(url, "GET");
-        httpConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
-        try {
-            httpConn.setRequestMethod("GET");
-        } catch (ProtocolException e) {
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
-        httpConn.setDoOutput(true);
-        httpConn.setDoInput(true);
+        HttpURLConnection httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", true);
+
         try {
             httpConn.connect();
             if (httpConn.getResponseCode() != 200) {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
             FileOutputStream fos = new FileOutputStream(keytab);
             InputStream in = httpConn.getInputStream();
@@ -419,19 +304,12 @@
             } catch (MalformedURLException e) {
                 throw new KrbException("Failed to create a URL object.");
             }
-            httpConn = createConnection(url, "GET");
-            httpConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
-            try {
-                httpConn.setRequestMethod("GET");
-            } catch (ProtocolException e) {
-                throw new KrbException("Failed to set the method for URL request.", e);
-            }
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
+            httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", true);
+
             try {
                 httpConn.connect();
                 if (httpConn.getResponseCode() != 200) {
-                    throw new KrbException(getResponse(httpConn));
+                    throw new KrbException(HasClientUtil.getResponse(httpConn));
                 }
                 FileOutputStream fos = new FileOutputStream(keytabFile);
                 InputStream in = httpConn.getInputStream();
@@ -495,23 +373,6 @@
 
     }
 
-    private String getResponse(HttpURLConnection httpConn) throws IOException {
-        StringBuilder data = new StringBuilder();
-        InputStream inputStream;
-        if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
-            inputStream = httpConn.getInputStream();
-        } else {
-            /* Error from server */
-            inputStream = httpConn.getErrorStream();
-        }
-        BufferedReader br = new BufferedReader(new InputStreamReader(inputStream));
-        String s;
-        while ((s = br.readLine()) != null) {
-            data.append(s);
-        }
-        return data.toString();
-    }
-
     public List<String> addPrincipalsByRole(String hostRoles) throws KrbException {
         HttpURLConnection httpConn;
 
@@ -522,17 +383,8 @@
             throw new KrbException(e.getMessage());
         }
 
-        httpConn = createConnection(url, "POST");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "PUT", true);
 
-        httpConn.setRequestProperty("Content-Type",
-                "application/json; charset=UTF-8");
-        try {
-            httpConn.setRequestMethod("PUT");
-        } catch (ProtocolException e) {
-            throw new KrbException(e.getMessage());
-        }
-        httpConn.setDoOutput(true);
-        httpConn.setDoInput(true);
         String response;
         try {
             httpConn.connect();
@@ -541,9 +393,9 @@
             out.flush();
             out.close();
             if (httpConn.getResponseCode() == 200) {
-                response = getResponse(httpConn);
+                response = HasClientUtil.getResponse(httpConn);
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (Exception e) {
             throw new KrbException(e.getMessage());
@@ -551,28 +403,19 @@
         return stringtoList(response);
     }
 
-    public void setEnableOfConf(String isEnable) throws HasException {
+    public void setEnableOfConf(String isEnable) throws KrbException {
         HttpURLConnection httpConn;
 
         URL url;
         try {
             url = new URL(getHadminBaseURL() + "setconf?isEnable=" + isEnable);
         } catch (MalformedURLException e) {
-            throw new HasException(e);
+            throw new KrbException(e.getMessage());
         }
 
-        httpConn = createConnection(url, "PUT");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "PUT", true);
 
-        httpConn.setRequestProperty("Content-Type",
-                "application/json; charset=UTF-8");
         try {
-            httpConn.setRequestMethod("PUT");
-        } catch (ProtocolException e) {
-            throw new HasException(e);
-        }
-        try {
-            httpConn.setDoOutput(true);
-            httpConn.setDoInput(true);
             httpConn.connect();
             InputStream inputStream = httpConn.getResponseCode() == 200
                     ? httpConn.getInputStream() : httpConn.getErrorStream();
@@ -590,11 +433,11 @@
             }
         } catch (Exception e) {
             LOG.error("Fail to connect to server. " + e);
-            throw new HasException(e);
+            throw new KrbException(e.getMessage());
         }
     }
 
-    public File getKeytabByHostAndRole(String host, String role) throws HasException {
+    public File getKeytabByHostAndRole(String host, String role) throws KrbException {
         String keytabName = host + ".zip";
         HttpURLConnection httpConn;
         String request = getHadminBaseURL() + "exportKeytabsbyrole?host=" + host;
@@ -607,20 +450,11 @@
         try {
             url = new URL(request);
         } catch (MalformedURLException e) {
-            throw new HasException(e);
+            throw new KrbException(e.getMessage());
         }
 
-        httpConn = createConnection(url, "GET");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
-        try {
-            httpConn.setRequestMethod("GET");
-        } catch (ProtocolException e) {
-            throw new HasException(e);
-        }
-        httpConn.setDoOutput(true);
-        httpConn.setDoInput(true);
         try {
             httpConn.connect();
 
@@ -638,7 +472,7 @@
             fos.close();
             in.close();
         } catch (IOException e) {
-            throw new HasException(e);
+            throw new KrbException(e.getMessage());
         }
         System.out.println("Accept keytab file \"" + keytabName + "\" from server.");
 
@@ -655,24 +489,17 @@
             throw new KrbException("Failed to create a URL object.", e);
         }
 
-        httpConn = createConnection(url, "GET");
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", true);
 
-        httpConn.setRequestProperty("Content-Type",
-            "application/json; charset=UTF-8");
-        try {
-            httpConn.setRequestMethod("GET");
-        } catch (ProtocolException e) {
-            throw new KrbException("Failed to set the method for URL request.", e);
-        }
         String response;
         try {
             httpConn.setDoInput(true);
             httpConn.connect();
 
             if (httpConn.getResponseCode() == 200) {
-                response = getResponse(httpConn);
+                response = HasClientUtil.getResponse(httpConn);
             } else {
-                throw new KrbException(getResponse(httpConn));
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
             LOG.error("IO error occurred." + e.getMessage());
diff --git a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClient.java b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClient.java
index 14cbd23..bfef56a 100755
--- a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClient.java
+++ b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClient.java
@@ -17,10 +17,6 @@
  */
 package org.apache.kerby.has.client;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientHandlerException;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
 import org.apache.commons.codec.binary.Base64;
 import org.apache.commons.text.CharacterPredicates;
 import org.apache.commons.text.RandomStringGenerator;
@@ -312,35 +308,7 @@
                     + responseStatus);
             }
         } else {
-            WebResource webResource;
-            Client client = Client.create();
-            String[] hosts = config.getHttpHost().split(",");
-            for (String host : hosts) {
-                webResource = client
-                    .resource("http://" + host.trim() + ":" + config.getHttpPort()
-                        + "/has/v1?type=" + type + "&authToken="
-                        + tokenString);
-                try {
-                    ClientResponse response = webResource.accept("application/json")
-                        .put(ClientResponse.class);
-
-                    if (response.getStatus() != 200) {
-                        LOG.warn("WARN! " + response.getEntity(String.class));
-                        responseStatus = response.getStatus();
-                        continue;
-                    }
-                    json = response.getEntity(JSONObject.class);
-                    success = true;
-                    break;
-                } catch (ClientHandlerException e) {
-                    LOG.warn("WARN! " + e.toString());
-                    continue;
-                }
-            }
-            if (!success) {
-                throw new HasException("Failed : HTTP error code : "
-                    + responseStatus);
-            }
+            throw new HasException("Please set https host and port.");
         }
 
         LOG.debug("Return from Server .... \n");
@@ -506,18 +474,43 @@
      */
     private X509Certificate getCertificate(String host, String port) throws HasException {
         X509Certificate certificate;
-        Client client = Client.create();
-        WebResource webResource = client.resource("http://" + host + ":" + port + "/has/v1/getcert");
-        ClientResponse response = webResource.get(ClientResponse.class);
-        if (response.getStatus() != 200) {
-            throw new HasException(response.getEntity(String.class));
+
+        HttpURLConnection httpConn = null;
+
+        URL url;
+        try {
+            url = new URL("http://" + host + ":" + port + "/has/v1/getcert");
+        } catch (MalformedURLException e) {
+            throw new HasException("Failed to create a URL object.", e);
         }
         try {
-            CertificateFactory factory = CertificateFactory.getInstance("X.509");
-            InputStream in = response.getEntityInputStream();
-            certificate = (X509Certificate) factory.generateCertificate(in);
-        } catch (CertificateException e) {
-            throw new HasException("Failed to get certificate from HAS server", e);
+            httpConn = (HttpURLConnection) url.openConnection();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+        httpConn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
+        try {
+            httpConn.setRequestMethod("GET");
+        } catch (ProtocolException e) {
+            LOG.error("Fail to add principal. " + e);
+            throw new HasException("Failed to set the method for URL request.", e);
+        }
+
+        try {
+            httpConn.connect();
+            if (httpConn.getResponseCode() != 200) {
+                throw new HasException(HasClientUtil.getResponse(httpConn));
+            }
+            try {
+                CertificateFactory factory = CertificateFactory.getInstance("X.509");
+                InputStream in = HasClientUtil.getInputStream(httpConn);
+                certificate = (X509Certificate) factory.generateCertificate(in);
+            } catch (CertificateException e) {
+                throw new HasException("Failed to get certificate from HAS server", e);
+            }
+
+        } catch (IOException e) {
+            throw new HasException("IO error occurred.", e);
         }
 
         return certificate;
diff --git a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClientUtil.java b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClientUtil.java
new file mode 100644
index 0000000..56ebd98
--- /dev/null
+++ b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasClientUtil.java
@@ -0,0 +1,126 @@
+/**
+ *  Licensed to the Apache Software Foundation (ASF) under one
+ *  or more contributor license agreements.  See the NOTICE file
+ *  distributed with this work for additional information
+ *  regarding copyright ownership.  The ASF licenses this file
+ *  to you under the Apache License, Version 2.0 (the
+ *  "License"); you may not use this file except in compliance
+ *  with the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing,
+ *  software distributed under the License is distributed on an
+ *  "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ *  KIND, either express or implied.  See the License for the
+ *  specific language governing permissions and limitations
+ *  under the License.
+ *
+ */
+package org.apache.kerby.has.client;
+
+import org.apache.kerby.has.common.HasConfig;
+import org.apache.kerby.has.common.ssl.SSLFactory;
+import org.apache.kerby.has.common.util.URLConnectionFactory;
+import org.apache.kerby.kerberos.kerb.KrbException;
+
+import java.io.BufferedReader;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.net.HttpURLConnection;
+import java.net.ProtocolException;
+import java.net.URL;
+
+public class HasClientUtil {
+
+    public static HttpURLConnection getHttpsConnection(HasConfig hasConfig, URL url, boolean isSpnego)
+            throws Exception {
+        HasConfig conf = new HasConfig();
+
+        conf.setString(SSLFactory.SSL_HOSTNAME_VERIFIER_KEY, "ALLOW_ALL");
+        String sslClientConf = hasConfig.getSslClientConf();
+        conf.setString(SSLFactory.SSL_CLIENT_CONF_KEY, sslClientConf);
+        conf.setBoolean(SSLFactory.SSL_REQUIRE_CLIENT_CERT_KEY, false);
+
+        URLConnectionFactory connectionFactory = URLConnectionFactory
+                .newDefaultURLConnectionFactory(conf);
+        return (HttpURLConnection) connectionFactory.openConnection(url, isSpnego, hasConfig);
+    }
+
+    /**
+     * Create an authenticated connection to the Has server.
+     * <p>
+     * It uses Hadoop-auth client authentication which by default supports
+     * Kerberos HTTP SPNEGO, Pseudo/Simple and anonymous.
+     *
+     * @param hasConfig the HAS client config.
+     * @param url    the URL to open a HTTP connection to.
+     * @param method the HTTP method for the HTTP connection.
+     * @param  isSpnego  true or false.
+     * @return an authenticated connection to the has server.
+     * @throws IOException if an IO error occurred.
+     */
+    public static HttpURLConnection createConnection(HasConfig hasConfig, URL url, String method, boolean isSpnego)
+            throws KrbException {
+        HttpURLConnection conn = null;
+        if (hasConfig.getHttpsPort() != null && hasConfig.getHttpsHost() != null) {
+            try {
+                conn = getHttpsConnection(hasConfig, url, isSpnego);
+            } catch (Exception e) {
+                throw new KrbException("Error occurred when creating https connection. "
+                        + e.getMessage());
+            }
+        }
+        try {
+            conn.setRequestMethod(method);
+        } catch (ProtocolException e) {
+            throw new KrbException("Failed to set the method for URL request.", e);
+        }
+        if (method.equals("POST") || method.equals("PUT")) {
+            conn.setDoOutput(true);
+        }
+        conn.setRequestProperty("Content-Type", "application/json; charset=UTF-8");
+        return conn;
+    }
+
+    public static String getBaseUrl(HasConfig hasConfig, String input) throws KrbException {
+        String url = null;
+        if (hasConfig.getHttpsPort() != null && hasConfig.getHttpsHost() != null) {
+            url = "https://" + hasConfig.getHttpsHost() + ":" + hasConfig.getHttpsPort()
+                    + "/has/v1/" + input + "/";
+        }
+        if (url == null) {
+            throw new KrbException("Please set the https address and port.");
+        }
+        return url;
+    }
+
+    public static String getResponse(HttpURLConnection httpConn) throws IOException {
+        StringBuilder data = new StringBuilder();
+
+        InputStream inputStream = getInputStream(httpConn);
+        BufferedReader br;
+        if (inputStream != null) {
+          br = new BufferedReader(new InputStreamReader(inputStream));
+        } else {
+            throw new IOException("Failed to get the InputStream");
+        }
+        String s;
+        while ((s = br.readLine()) != null) {
+            data.append(s);
+        }
+        return data.toString();
+    }
+
+    public static InputStream getInputStream(HttpURLConnection httpConn) throws IOException {
+        InputStream inputStream;
+        if (httpConn.getResponseCode() < HttpURLConnection.HTTP_BAD_REQUEST) {
+            inputStream = httpConn.getInputStream();
+        } else {
+            /* Error from server */
+            inputStream = httpConn.getErrorStream();
+        }
+        return inputStream;
+    }
+}
diff --git a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasInitClient.java b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasInitClient.java
index 675b1b7..fb52130 100644
--- a/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasInitClient.java
+++ b/has-project/has-client/src/main/java/org/apache/kerby/has/client/HasInitClient.java
@@ -17,27 +17,18 @@
  */
 package org.apache.kerby.has.client;
 
-import com.sun.jersey.api.client.Client;
-import com.sun.jersey.api.client.ClientResponse;
-import com.sun.jersey.api.client.WebResource;
-import com.sun.jersey.api.client.config.ClientConfig;
-import com.sun.jersey.api.client.config.DefaultClientConfig;
-import com.sun.jersey.client.urlconnection.HTTPSProperties;
-import com.sun.jersey.core.util.MultivaluedMapImpl;
 import org.apache.kerby.has.common.HasConfig;
-import org.apache.kerby.has.common.HasException;
 import org.apache.kerby.kerberos.kerb.KrbException;
-import org.glassfish.jersey.SslConfigurator;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.net.ssl.HostnameVerifier;
-import javax.net.ssl.SSLContext;
-import javax.net.ssl.SSLSession;
-import javax.ws.rs.core.MultivaluedMap;
 import java.io.File;
+import java.io.FileOutputStream;
 import java.io.IOException;
 import java.io.InputStream;
+import java.net.HttpURLConnection;
+import java.net.MalformedURLException;
+import java.net.URL;
 
 /**
  * HAS client API for applications to interact with HAS server
@@ -58,181 +49,231 @@
         return confDir;
     }
 
-    private WebResource getWebResource(String restName) {
-        Client client;
-        String server = null;
-        if (hasConfig.getHttpsPort() != null && hasConfig.getHttpsHost() != null) {
-            server = "https://" + hasConfig.getHttpsHost() + ":" + hasConfig.getHttpsPort()
-                    + "/has/v1/" + restName;
-            LOG.info("Admin request url: " + server);
-            HasConfig conf = new HasConfig();
-            try {
-                conf.addIniConfig(new File(hasConfig.getSslClientConf()));
-            } catch (IOException e) {
-                throw new RuntimeException("Errors occurred when adding ssl conf. "
-                    + e.getMessage());
-            }
-            SslConfigurator sslConfigurator = SslConfigurator.newInstance()
-                    .trustStoreFile(conf.getString("ssl.client.truststore.location"))
-                    .trustStorePassword(conf.getString("ssl.client.truststore.password"));
-            sslConfigurator.securityProtocol("SSL");
-            SSLContext sslContext = sslConfigurator.createSSLContext();
-            ClientConfig clientConfig = new DefaultClientConfig();
-            clientConfig.getProperties().put(HTTPSProperties.PROPERTY_HTTPS_PROPERTIES,
-                    new HTTPSProperties(new HostnameVerifier() {
-                        @Override
-                        public boolean verify(String s, SSLSession sslSession) {
-                            return false;
-                        }
-                    }, sslContext));
-            client = Client.create(clientConfig);
-        } else {
-            client = Client.create();
-        }
-        if (server == null) {
-            throw new RuntimeException("Please set the https address and port.");
-        }
-        return client.resource(server);
+    private String getInitBaseURL() throws KrbException {
+        return HasClientUtil.getBaseUrl(hasConfig, "init");
     }
 
-    public void startKdc() {
-        WebResource webResource = getWebResource("init/kdcstart");
-        ClientResponse response = webResource.get(ClientResponse.class);
-        String message = null;
+    private String getConfigBaseURL() throws KrbException {
+        return HasClientUtil.getBaseUrl(hasConfig, "conf");
+    }
+
+    public String startKdc() throws KrbException {
+        HttpURLConnection httpConn;
+
+        URL url;
         try {
-            message = getResponse(response);
-        } catch (HasException e) {
-            System.err.println(e.getMessage());
+            url = new URL(getInitBaseURL() + "kdcstart");
+        } catch (MalformedURLException e) {
+            throw new KrbException("Failed to create a URL object.", e);
         }
-        if (response.getStatus() == 200) {
-            System.out.println(message);
-        } else {
-            System.err.println(message);
-        }
-    }
 
-    public InputStream initKdc() {
-        WebResource webResource = getWebResource("init/kdcinit");
-        ClientResponse response = webResource.get(ClientResponse.class);
-        if (response.getStatus() == 200) {
-            return response.getEntityInputStream();
-        } else {
-            try {
-                System.err.println(getResponse(response));
-            } catch (HasException e) {
-                System.err.println(e.getMessage());
-            }
-            return null;
-        }
-    }
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "PUT", false);
 
-    private String getResponse(ClientResponse response) throws HasException {
-        InputStream is = response.getEntityInputStream();
-        final byte[] b = new byte[1024];
-        int read;
-        final StringBuilder msg = new StringBuilder();
         try {
-            while ((read = is.read(b)) > 0) {
-                msg.append(new String(b, 0, read));
+            httpConn.connect();
+
+            if (httpConn.getResponseCode() == 200) {
+                String response = HasClientUtil.getResponse(httpConn);
+                LOG.info(response);
+                return response;
+            } else {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
             }
         } catch (IOException e) {
-            throw new HasException(e.getMessage());
-        }
-        return msg.toString();
-    }
-
-    public String getKrb5conf() throws KrbException {
-        WebResource webResource = getWebResource("conf/getkrb5conf");
-        ClientResponse response = webResource.get(ClientResponse.class);
-        String message;
-        try {
-            message = getResponse(response);
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
-        }
-        if (response.getStatus() == 200) {
-            return message;
-        } else {
-            throw new KrbException(message);
+            throw new KrbException("IO error occurred. " + e.getMessage());
         }
     }
 
-    public String getHasClientConf() throws KrbException {
-        WebResource webResource = getWebResource("conf/gethasclientconf");
-        ClientResponse response = webResource.get(ClientResponse.class);
-        String message;
+    public void initKdc(File keytab) throws KrbException {
+        HttpURLConnection httpConn;
+
+        URL url;
         try {
-            message = getResponse(response);
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
+            url = new URL(getInitBaseURL() + "kdcinit");
+        } catch (MalformedURLException e) {
+            throw new KrbException("Failed to create a URL object.", e);
         }
-        if (response.getStatus() == 200) {
-            return message;
-        } else {
-            throw new KrbException(message);
+
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", false);
+
+        try {
+            httpConn.connect();
+            if (httpConn.getResponseCode() != 200) {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
+            }
+            FileOutputStream fos = new FileOutputStream(keytab);
+            InputStream in = httpConn.getInputStream();
+            byte[] buffer = new byte[3 * 1024];
+            int read;
+            while ((read = in.read(buffer)) > 0) {
+                fos.write(buffer, 0, read);
+            }
+            fos.close();
+            in.close();
+        } catch (IOException e) {
+            throw new KrbException("IO error occurred. " + e.getMessage());
+        }
+    }
+
+    public void getKrb5conf(File file) throws KrbException {
+
+        HttpURLConnection httpConn;
+
+        URL url;
+        try {
+            url = new URL(getConfigBaseURL() + "getkrb5conf");
+        } catch (MalformedURLException e) {
+            throw new KrbException("Failed to create a URL object.", e);
+        }
+
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", false);
+
+        try {
+            httpConn.connect();
+            if (httpConn.getResponseCode() != 200) {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
+            }
+            FileOutputStream fos = new FileOutputStream(file);
+            InputStream in = httpConn.getInputStream();
+            byte[] buffer = new byte[3 * 1024];
+            int read;
+            while ((read = in.read(buffer)) > 0) {
+                fos.write(buffer, 0, read);
+            }
+            fos.close();
+            in.close();
+        } catch (IOException e) {
+            throw new KrbException("IO error occurred. " + e.getMessage());
+        }
+    }
+
+    public void getHasClientConf(File file) throws KrbException {
+
+        HttpURLConnection httpConn;
+
+        URL url;
+        try {
+            url = new URL(getConfigBaseURL() + "gethasclientconf");
+        } catch (MalformedURLException e) {
+            throw new KrbException("Failed to create a URL object.", e);
+        }
+
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "GET", false);
+
+        try {
+            httpConn.connect();
+            if (httpConn.getResponseCode() != 200) {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
+            }
+            FileOutputStream fos = new FileOutputStream(file);
+            InputStream in = httpConn.getInputStream();
+            byte[] buffer = new byte[3 * 1024];
+            int read;
+            while ((read = in.read(buffer)) > 0) {
+                fos.write(buffer, 0, read);
+            }
+            fos.close();
+            in.close();
+        } catch (IOException e) {
+            throw new KrbException("IO error occurred. " + e.getMessage());
         }
     }
 
     public String setPlugin(String plugin) throws KrbException {
-        WebResource webResource = getWebResource("conf/setplugin");
-        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
-        params.add("plugin", plugin);
-        ClientResponse response = webResource.queryParams(params).put(ClientResponse.class);
-        String message;
+
+        HttpURLConnection httpConn;
+
+        URL url;
         try {
-            message = getResponse(response);
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
+            url = new URL(getConfigBaseURL() + "setplugin?plugin=" + plugin);
+        } catch (MalformedURLException e) {
+            throw new KrbException("Failed to create a URL object.", e);
         }
-        if (response.getStatus() == 200) {
-            return message;
-        } else {
-            throw new KrbException(message);
+
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "PUT", false);
+
+        try {
+            httpConn.connect();
+
+            if (httpConn.getResponseCode() == 200) {
+                String response = HasClientUtil.getResponse(httpConn);
+                LOG.info(response);
+                return response;
+            } else {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
+            }
+        } catch (IOException e) {
+            throw new KrbException("IO error occurred. " + e.getMessage());
         }
     }
 
     public String configKdc(String port, String realm, String host) throws KrbException {
-        WebResource webResource = getWebResource("conf/configkdc");
-        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
-        params.add("port", port);
-        params.add("realm", realm);
-        params.add("host", host);
-        ClientResponse response = webResource.queryParams(params).put(ClientResponse.class);
-        String message;
+
+        HttpURLConnection httpConn;
+
+        URL url;
         try {
-            message = getResponse(response);
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
+            url = new URL(getConfigBaseURL() + "configkdc?port=" + port + "&realm="
+                    + realm + "&host=" + host);
+        } catch (MalformedURLException e) {
+            throw new KrbException("Failed to create a URL object.", e);
         }
-        if (response.getStatus() == 200) {
-            return message;
-        } else {
-            throw new KrbException(message);
+
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "PUT", false);
+
+        try {
+            httpConn.connect();
+
+            if (httpConn.getResponseCode() == 200) {
+                String response = HasClientUtil.getResponse(httpConn);
+                LOG.info(response);
+                return response;
+            } else {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
+            }
+        } catch (IOException e) {
+            throw new KrbException("IO error occurred. " + e.getMessage());
         }
     }
-    public String configBackend(String backendType, String dir, String url, String user,
+
+    public String configBackend(String backendType, String dir, String mysqlUrl, String user,
                               String password) throws KrbException {
-        WebResource webResource = getWebResource("conf/configbackend");
-        MultivaluedMap<String, String> params = new MultivaluedMapImpl();
-        params.add("backendType", backendType);
+
+        HttpURLConnection httpConn;
+
+        URL url;
         if (backendType.equals("json")) {
-            params.add("dir", dir);
+            try {
+                url = new URL(getConfigBaseURL() + "configbackend?backendType=" + backendType
+                        + "&dir=" + dir);
+            } catch (MalformedURLException e) {
+                throw new KrbException("Failed to create a URL object.", e);
+            }
         } else if (backendType.equals("mysql")) {
-            params.add("url", url);
-            params.add("user", user);
-            params.add("password", password);
-        }
-        ClientResponse response = webResource.queryParams(params).put(ClientResponse.class);
-        String message;
-        try {
-            message = getResponse(response);
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
-        }
-        if (response.getStatus() == 200) {
-            return message;
+            try {
+                url = new URL(getConfigBaseURL() + "configbackend?backendType=" + backendType
+                        + "&url=" + mysqlUrl + "&user=" + user + "&password=" + password);
+            } catch (MalformedURLException e) {
+                throw new KrbException("Failed to create a URL object.", e);
+            }
         } else {
-            throw new KrbException(message);
+            throw new KrbException("Unsupported backend: " + backendType);
+        }
+
+        httpConn = HasClientUtil.createConnection(hasConfig, url, "PUT", false);
+
+        try {
+            httpConn.connect();
+
+            if (httpConn.getResponseCode() == 200) {
+                String response = HasClientUtil.getResponse(httpConn);
+                LOG.info(response);
+                return response;
+            } else {
+                throw new KrbException(HasClientUtil.getResponse(httpConn));
+            }
+        } catch (IOException e) {
+            throw new KrbException("IO error occurred. " + e.getMessage());
         }
     }
 }
diff --git a/has-project/has-common/src/main/java/org/apache/kerby/has/common/util/URLConnectionFactory.java b/has-project/has-common/src/main/java/org/apache/kerby/has/common/util/URLConnectionFactory.java
index cf74340..90481de 100644
--- a/has-project/has-common/src/main/java/org/apache/kerby/has/common/util/URLConnectionFactory.java
+++ b/has-project/has-common/src/main/java/org/apache/kerby/has/common/util/URLConnectionFactory.java
@@ -80,7 +80,7 @@
    * try to load SSL certificates when it is specified.
    */
   public static URLConnectionFactory newDefaultURLConnectionFactory(HasConfig conf) {
-    ConnectionConfigurator conn = null;
+    ConnectionConfigurator conn;
     try {
       conn = newSslConnConfigurator(DEFAULT_SOCKET_TIMEOUT, conf);
     } catch (Exception e) {
diff --git a/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/ConfFilter.java b/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/ConfFilter.java
index e300886..b6491b3 100644
--- a/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/ConfFilter.java
+++ b/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/ConfFilter.java
@@ -40,7 +40,7 @@
                     new File(hasServer.getConfDir(), "has-server.conf"));
             String isEnableConf = hasConfig.getEnableConf();
             if (!isEnableConf.equals("true")) {
-                throw new RuntimeException("The KDC has started, please stop KDC before setting.");
+                throw new IOException("The KDC has started, please stop KDC before setting.");
             }
             filterChain.doFilter(servletRequest, servletResponse);
         } catch (HasException e) {
diff --git a/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/ConfigApi.java b/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/ConfigApi.java
index 73a2a55..2a70a34 100644
--- a/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/ConfigApi.java
+++ b/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/ConfigApi.java
@@ -63,7 +63,7 @@
      */
     @PUT
     @Path("/setplugin")
-    @Consumes({MediaType.TEXT_PLAIN})
+    @Consumes({MediaType.APPLICATION_JSON})
     @Produces({MediaType.TEXT_PLAIN})
     public Response setPlugin(@QueryParam("plugin") final String plugin) {
         if (httpRequest.isSecure()) {
@@ -174,7 +174,7 @@
      */
     @PUT
     @Path("/configkdc")
-    @Consumes({MediaType.TEXT_PLAIN})
+    @Consumes({MediaType.APPLICATION_JSON})
     @Produces({MediaType.TEXT_PLAIN})
     public Response configKdc(
         @QueryParam("port") final int port,
diff --git a/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/InitApi.java b/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/InitApi.java
index b4b7648..b7ded08 100644
--- a/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/InitApi.java
+++ b/has-project/has-server/src/main/java/org/apache/kerby/has/server/web/rest/InitApi.java
@@ -25,6 +25,7 @@
 import javax.servlet.ServletContext;
 import javax.servlet.http.HttpServletRequest;
 import javax.ws.rs.GET;
+import javax.ws.rs.PUT;
 import javax.ws.rs.Path;
 import javax.ws.rs.Produces;
 import javax.ws.rs.core.Context;
@@ -64,7 +65,7 @@
         return Response.status(Response.Status.FORBIDDEN).entity("HTTPS required.\n").build();
     }
 
-    @GET
+    @PUT
     @Path("/kdcstart")
     @Produces(MediaType.TEXT_PLAIN)
     public Response kdcStart() {
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/DisableConfRemoteCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/DisableConfRemoteCmd.java
index c152ad2..9a6d6a3 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/DisableConfRemoteCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/DisableConfRemoteCmd.java
@@ -20,7 +20,6 @@
 package org.apache.kerby.kerberos.tool.admin.cmd;
 
 import org.apache.kerby.has.client.HasAuthAdminClient;
-import org.apache.kerby.has.common.HasException;
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 /**
@@ -39,10 +38,6 @@
     @Override
     public void execute(String[] items) throws KrbException {
         HasAuthAdminClient client = getAuthAdminClient();
-        try {
-            client.setEnableOfConf("false");
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
-        }
+        client.setEnableOfConf("false");
     }
 }
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/EnableConfRemoteCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/EnableConfRemoteCmd.java
index 28011a8..6b72db3 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/EnableConfRemoteCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/EnableConfRemoteCmd.java
@@ -20,7 +20,6 @@
 package org.apache.kerby.kerberos.tool.admin.cmd;
 
 import org.apache.kerby.has.client.HasAuthAdminClient;
-import org.apache.kerby.has.common.HasException;
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 /**
@@ -40,10 +39,6 @@
     public void execute(String[] items) throws KrbException {
 
         HasAuthAdminClient client = getAuthAdminClient();
-        try {
-            client.setEnableOfConf("true");
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
-        }
+        client.setEnableOfConf("true");
     }
 }
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ExportKeytabsRemoteCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ExportKeytabsRemoteCmd.java
index 52513ca..5d5614d 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ExportKeytabsRemoteCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ExportKeytabsRemoteCmd.java
@@ -20,7 +20,6 @@
 package org.apache.kerby.kerberos.tool.admin.cmd;
 
 import org.apache.kerby.has.client.HasAuthAdminClient;
-import org.apache.kerby.has.common.HasException;
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 public class ExportKeytabsRemoteCmd extends AdminRemoteCmd {
@@ -48,10 +47,6 @@
         if (items.length >= 3) {
             role = items[2];
         }
-        try {
-            client.getKeytabByHostAndRole(host, role);
-        } catch (HasException e) {
-            throw new KrbException(e.getMessage());
-        }
+        client.getKeytabByHostAndRole(host, role);
     }
 }
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ListPrincipalsRemoteCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ListPrincipalsRemoteCmd.java
index b46f95c..470ca33 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ListPrincipalsRemoteCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/admin/cmd/ListPrincipalsRemoteCmd.java
@@ -57,7 +57,8 @@
             principalLists = client.getPrincipals(exp);
         }
 
-        if (principalLists.size() == 0 || principalLists.size() == 1 && principalLists.get(0).isEmpty()) {
+        if (principalLists == null || principalLists.size() == 0
+                || principalLists.size() == 1 && principalLists.get(0).isEmpty()) {
             return;
         } else {
             System.out.println("Principals are listed:");
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetHasClientConfCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetHasClientConfCmd.java
index f195e0e..01bcddf 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetHasClientConfCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetHasClientConfCmd.java
@@ -23,9 +23,6 @@
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
 
 /**
  * Remote get has-client.conf cmd
@@ -56,17 +53,7 @@
             }
         }
         File hasConf = new File(path, "has-client.conf");
-        String content = client.getHasClientConf();
-        if (content == null) {
-            System.err.println("Failed to get has.conf.");
-            return;
-        }
-        try {
-            PrintStream ps = new PrintStream(new FileOutputStream(hasConf));
-            ps.println(content);
-            System.out.println("has-client.conf has saved in : " + hasConf.getAbsolutePath());
-        } catch (FileNotFoundException e) {
-            System.err.println(e.getMessage());
-        }
+        client.getHasClientConf(hasConf);
+        System.out.println("has-client.conf has saved in : " + hasConf.getAbsolutePath());
     }
 }
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetKrb5ConfCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetKrb5ConfCmd.java
index 58df209..8a4b062 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetKrb5ConfCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/GetKrb5ConfCmd.java
@@ -23,9 +23,6 @@
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.PrintStream;
 
 /**
  * Remote get krb5.conf cmd
@@ -56,17 +53,7 @@
             }
         }
         File krb5Conf = new File(path, "krb5.conf");
-        String content = client.getKrb5conf();
-        if (content == null) {
-            System.err.println("Failed to get krb5.conf.");
-            return;
-        }
-        try {
-            PrintStream ps = new PrintStream(new FileOutputStream(krb5Conf));
-            ps.println(content);
-            System.out.println("krb5.conf has saved in : " + krb5Conf.getAbsolutePath());
-        } catch (FileNotFoundException e) {
-            System.err.println(e.getMessage());
-        }
+        client.getKrb5conf(krb5Conf);
+        System.out.println("krb5.conf has saved in : " + krb5Conf.getAbsolutePath());
     }
 }
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/InitKdcCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/InitKdcCmd.java
index d9ad062..1b68799 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/InitKdcCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/InitKdcCmd.java
@@ -23,10 +23,6 @@
 import org.apache.kerby.kerberos.kerb.KrbException;
 
 import java.io.File;
-import java.io.FileNotFoundException;
-import java.io.FileOutputStream;
-import java.io.IOException;
-import java.io.InputStream;
 
 /**
  * Remote init kdc cmd
@@ -58,25 +54,8 @@
         File adminKeytab = new File(path, "admin.keytab");
 
         HasInitClient client = getClient();
-        InputStream content = client.initKdc();
 
-        if (content == null) {
-            return;
-        }
-
-        try (FileOutputStream fos = new FileOutputStream(adminKeytab)) {
-            byte[] buffer = new byte[4 * 1024];
-            int read;
-            while ((read = content.read(buffer)) > 0) {
-                fos.write(buffer, 0, read);
-            }
-            fos.close();
-            content.close();
-        } catch (FileNotFoundException e) {
-            System.err.println("the admin keytab file not found. " + e.getMessage());
-        } catch (IOException e) {
-            System.err.println("Errors occurred when getting the admin.keytab. " + e.getMessage());
-        }
+        client.initKdc(adminKeytab);
 
         System.out.println("admin.keytab has saved in : " + adminKeytab.getAbsolutePath()
             + ",\nplease safely save it to use kadmin.");
diff --git a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/StartKdcCmd.java b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/StartKdcCmd.java
index 36405b2..a5fa8ef 100644
--- a/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/StartKdcCmd.java
+++ b/kerby-tool/has-tool/src/main/java/org/apache/kerby/kerberos/tool/init/cmd/StartKdcCmd.java
@@ -47,6 +47,6 @@
             return;
         }
         HasInitClient client = getClient();
-        client.startKdc();
+        System.out.println(client.startKdc());
     }
 }