Repository: ambari Updated Branches: refs/heads/branch-2.4 a389aa5ba -> 5abe50ca7
AMBARI-16656. Error while loading slider view: Unable to initialize Slider view. (Gaurav Nagar via dipayanb) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/5abe50ca Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/5abe50ca Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/5abe50ca Branch: refs/heads/branch-2.4 Commit: 5abe50ca7beeac6bec6091bc5c373c3566fa6834 Parents: a389aa5 Author: Dipayan Bhowmick <[email protected]> Authored: Fri May 13 18:47:30 2016 +0530 Committer: Dipayan Bhowmick <[email protected]> Committed: Fri May 13 18:50:40 2016 +0530 ---------------------------------------------------------------------- .../view/slider/rest/client/BaseHttpClient.java | 27 +++-- .../rest/client/URLStreamProviderBasicAuth.java | 105 +++++++++++++++++++ 2 files changed, 122 insertions(+), 10 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/5abe50ca/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/BaseHttpClient.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/BaseHttpClient.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/BaseHttpClient.java index 3d4a08d..ce30a10 100644 --- a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/BaseHttpClient.java +++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/BaseHttpClient.java @@ -75,6 +75,10 @@ public class BaseHttpClient { return viewContext.getURLStreamProvider(); } + public URLStreamProviderBasicAuth getUrlStreamProviderBasicAuth() { + return new URLStreamProviderBasicAuth(getUrlStreamProvider(),getUserId(),getPassword()); + } + public String getUrl() { return url; } @@ -113,39 +117,42 @@ public class BaseHttpClient { public JsonElement doGetJson(String url, String path) throws HttpException, IOException { - String response = null; + InputStream inputStream = null; try { Map<String, String> headers = new HashMap<String, String>(); if (isNeedsAuthentication()) { - response = ambariApi.readFromAmbari( + inputStream = getUrlStreamProviderBasicAuth().readFrom( url + path, "GET", (String) null, headers); } else { - response = IOUtils.toString(viewContext.getURLStreamProvider().readAsCurrent( - url + path, "GET", (String) null, headers)); + inputStream = getUrlStreamProvider().readAsCurrent( + url + path, "GET", (String) null, headers); } - } catch (Exception e) { + } catch (IOException e) { logger.error("Error while reading from url " + url + path, e); HttpException httpException = new HttpException( e.getLocalizedMessage()); throw httpException; } - JsonElement jsonElement = new JsonParser().parse(response); + JsonElement jsonElement = new JsonParser().parse(new JsonReader( + new InputStreamReader(inputStream))); return jsonElement; } public String doGet(String path) throws HttpException, IOException { String response = null; try { + InputStream inputStream = null; if (isNeedsAuthentication()) { - response = ambariApi.readFromAmbari( + inputStream = getUrlStreamProviderBasicAuth().readFrom( getUrl() + path, "GET", (String) null, new HashMap<String, String>()); } else { - response = IOUtils.toString(viewContext.getURLStreamProvider().readAsCurrent( + inputStream = getUrlStreamProvider().readAsCurrent( getUrl() + path, "GET", (String) null, - new HashMap<String, String>())); + new HashMap<String, String>()); } - } catch (Exception e) { + response = IOUtils.toString(inputStream); + } catch (IOException e) { logger.error("Error while reading from url " + getUrl() + path, e); HttpException httpException = new HttpException( e.getLocalizedMessage()); http://git-wip-us.apache.org/repos/asf/ambari/blob/5abe50ca/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/URLStreamProviderBasicAuth.java ---------------------------------------------------------------------- diff --git a/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/URLStreamProviderBasicAuth.java b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/URLStreamProviderBasicAuth.java new file mode 100644 index 0000000..2d32fd7 --- /dev/null +++ b/contrib/views/slider/src/main/java/org/apache/ambari/view/slider/rest/client/URLStreamProviderBasicAuth.java @@ -0,0 +1,105 @@ +/** + * 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.ambari.view.slider.rest.client; + +import org.apache.ambari.view.URLStreamProvider; +import org.apache.commons.codec.binary.Base64; + +import java.io.IOException; +import java.io.InputStream; +import java.util.HashMap; +import java.util.Map; + +/** + * Wrapper for URLStreamProvider that adds authentication header. + */ +public class URLStreamProviderBasicAuth implements URLStreamProvider { + private URLStreamProvider urlStreamProvider; + private String username; + private String password; + private String requestedBy = "views"; + + public URLStreamProviderBasicAuth(URLStreamProvider urlStreamProvider, String username, String password) { + this.urlStreamProvider = urlStreamProvider; + this.username = username; + this.password = password; + } + + /** + * X-Requested-By header value + * @param requestedBy value of X-Requested-By header + */ + public void setRequestedBy(String requestedBy) { + this.requestedBy = requestedBy; + } + + @Override + public InputStream readFrom(String url, String method, String data, Map<String, String> headers) throws IOException { + return urlStreamProvider.readFrom(url, method, data, addHeaders(headers)); + } + + @Override + public InputStream readFrom(String url, String method, InputStream data, Map<String, String> headers) throws IOException { + return urlStreamProvider.readFrom(url, method, data, addHeaders(headers)); + } + + @Override + public InputStream readAs(String url, String method, String data, Map<String, String> headers, String doAs) throws IOException { + return urlStreamProvider.readAs(url, method, data, addHeaders(headers), doAs); + } + + @Override + public InputStream readAs(String url, String method, InputStream data, Map<String, String> headers, String doAs) throws IOException { + return urlStreamProvider.readAs(url, method, data, addHeaders(headers), doAs); + } + + @Override + public InputStream readAsCurrent(String url, String method, String data, Map<String, String> headers) throws IOException { + return urlStreamProvider.readAsCurrent(url, method, data, addHeaders(headers)); + } + + @Override + public InputStream readAsCurrent(String url, String method, InputStream data, Map<String, String> headers) throws IOException { + return urlStreamProvider.readAsCurrent(url, method, data, addHeaders(headers)); + } + + private HashMap<String, String> addHeaders(Map<String, String> customHeaders) { + HashMap<String, String> newHeaders = new HashMap<String, String>(); + if (customHeaders != null) + newHeaders.putAll(customHeaders); + + if (urlStreamProvider != null) { + // basic auth is not needed for AmbariStreamProvider + addBasicAuthHeaders(newHeaders); + } + addRequestedByHeaders(newHeaders); + return newHeaders; + } + + private void addRequestedByHeaders(HashMap<String, String> newHeaders) { + newHeaders.put("X-Requested-By", requestedBy); + } + + private void addBasicAuthHeaders(HashMap<String, String> headers) { + String authString = username + ":" + password; + byte[] authEncBytes = Base64.encodeBase64(authString.getBytes()); + String authStringEnc = new String(authEncBytes); + + headers.put("Authorization", "Basic " + authStringEnc); + } +}
