2  * Copyright 2016 Huawei Technologies Co., Ltd.
 
   4  * Licensed under the Apache License, Version 2.0 (the "License");
 
   5  * you may not use this file except in compliance with the License.
 
   6  * You may obtain a copy of the License at
 
   8  *     http://www.apache.org/licenses/LICENSE-2.0
 
  10  * Unless required by applicable law or agreed to in writing, software
 
  11  * distributed under the License is distributed on an "AS IS" BASIS,
 
  12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 
  13  * See the License for the specific language governing permissions and
 
  14  * limitations under the License.
 
  17 package org.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.restclient;
 
  19 import java.io.ByteArrayInputStream;
 
  20 import java.io.IOException;
 
  21 import java.io.InputStreamReader;
 
  22 import java.nio.charset.Charset;
 
  23 import java.util.Enumeration;
 
  24 import java.util.HashMap;
 
  26 import java.util.zip.GZIPInputStream;
 
  28 import org.apache.commons.lang.StringUtils;
 
  29 import org.eclipse.jetty.client.ContentExchange;
 
  30 import org.eclipse.jetty.client.HttpDestination;
 
  31 import org.eclipse.jetty.http.HttpFields;
 
  32 import org.eclipse.jetty.http.HttpHeaders;
 
  33 import org.eclipse.jetty.io.Buffer;
 
  34 import org.eclipse.jetty.util.StringUtil;
 
  35 import org.slf4j.Logger;
 
  36 import org.slf4j.LoggerFactory;
 
  39  * ContentExchange implementation classe to provide access to response.
 
  45  * @version 28-May-2016
 
  47 public class RestHttpContentExchange extends ContentExchange {
 
  49     private static final Logger LOGGER = LoggerFactory.getLogger(RestHttpContentExchange.class);
 
  51     private static final String PATH = "path:";
 
  53     private boolean gzip = false;
 
  55     private RestfulAsyncCallback callback = null;
 
  63      * @param cacheFields whether to cache response header.
 
  64      * @param asyncCallback callback method.
 
  66     RestHttpContentExchange(final boolean cacheFields, final RestfulAsyncCallback asyncCallback) {
 
  68         this.callback = asyncCallback;
 
  75      * @param data GZipped data.
 
  76      * @return Uncompressed data.
 
  80     public String decompressGzipToStr(final byte[] data) throws IOException {
 
  84         ByteArrayInputStream input = null;
 
  85         GZIPInputStream gzis = null;
 
  86         InputStreamReader reader = null;
 
  87         final StringBuilder out = new StringBuilder();
 
  89             input = new ByteArrayInputStream(data);
 
  90             gzis = new GZIPInputStream(input);
 
  91             reader = new InputStreamReader(gzis, Charset.forName(RestfulClientConst.ENCODING));
 
  92             final char[] buff = new char[1024];
 
  93             for(int n; (n = reader.read(buff)) != -1;) {
 
  94                 out.append(new String(buff, 0, n));
 
 100                 } catch(final IOException e) {
 
 101                     LOGGER.error("decompress Gzip reader exception:", e);
 
 107                 } catch(final IOException e) {
 
 108                     LOGGER.error("decompress Gzip exception:", e);
 
 114                 } catch(final IOException e) {
 
 115                     LOGGER.error("decompress Gzip input exception:", e);
 
 119         return out.toString();
 
 124      * View response headers Content-Encoding values if you need to extract data.<br/>
 
 128      * @throws IOException
 
 132     protected synchronized void onResponseHeader(final Buffer name, final Buffer value) throws IOException {
 
 133         super.onResponseHeader(name, value);
 
 134         final int header = HttpHeaders.CACHE.getOrdinal(name);
 
 135         if(header == HttpHeaders.CONTENT_ENCODING_ORDINAL) {
 
 136             final String encoding = StringUtil.asciiToLowerCase(value.toString());
 
 137             gzip = encoding != null && StringUtils.contains(encoding, "gzip");
 
 143     protected void onResponseComplete() throws IOException {
 
 144         if(LOGGER.isInfoEnabled()) {
 
 145             LOGGER.info("Response has Complete:" + PATH + this.getRequestURI().replace("\n", "0x0A"));
 
 147         super.onResponseComplete();
 
 148         if(callback != null) {
 
 149             final RestfulResponse rsp = getResponse();
 
 150             callback.callback(rsp);
 
 155     protected void onRequestCommitted() throws IOException {
 
 156         if(LOGGER.isInfoEnabled()) {
 
 157             LOGGER.info("Request Header has been send:" + PATH + this.getRequestURI().replace("\n", "0x0A"));
 
 159         super.onRequestCommitted();
 
 163     protected void onRequestComplete() throws IOException {
 
 164         if(LOGGER.isInfoEnabled()) {
 
 165             LOGGER.info("Request has bend send complete:" + PATH + this.getRequestURI().replace("\n", "0x0A"));
 
 167         super.onRequestComplete();
 
 171     protected void onException(final Throwable x) {
 
 172         LOGGER.warn("onException:", x);
 
 173         super.onException(x);
 
 174         if(callback != null) {
 
 175             callback.handleExcepion(x);
 
 180     protected void onConnectionFailed(final Throwable x) {
 
 181         LOGGER.warn("onConnectionFailed:", x);
 
 182         super.onConnectionFailed(x);
 
 183         if(callback != null) {
 
 184             callback.handleExcepion(x);
 
 190     protected void expire(final HttpDestination destination) {
 
 191         super.expire(destination);
 
 192         if(callback != null) {
 
 193             callback.handleExcepion(new ServiceException("request is expired, status:" + toState(getStatus())));
 
 197     public boolean isGzip() {
 
 202      * Get the response as RestfulResponse.
 
 205      * @return response object.
 
 206      * @throws IOException
 
 209     public RestfulResponse getResponse() throws IOException {
 
 210         final RestfulResponse rsp = new RestfulResponse();
 
 211         rsp.setStatus(this.getResponseStatus());
 
 213             final String responseString = decompressGzipToStr(getResponseContentBytes());
 
 214             rsp.setResponseJson(responseString);
 
 216             rsp.setResponseJson(this.getResponseContent());
 
 219         final HttpFields field = this.getResponseFields();
 
 221             final Map<String, String> header = new HashMap<>();
 
 223             final Enumeration<String> names = field.getFieldNames();
 
 224             for(final Enumeration<String> e = names; e.hasMoreElements();) {
 
 225                 final String fieldName = e.nextElement();
 
 226                 final String fieldValue = field.getStringField(fieldName);
 
 227                 header.put(fieldName, fieldValue);
 
 230             rsp.setRespHeaderMap(header);