/*
* Copyright 2016 Huawei Technologies Co., Ltd.
*
* Licensed 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.onap.vfc.nfvo.vnfm.svnfm.vnfmadapter.common.restclient;
import java.io.*;
import java.nio.charset.Charset;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.zip.GZIPInputStream;
import org.eclipse.jetty.client.api.Request;
import org.eclipse.jetty.http.HttpFields;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
* ContentExchange implementation classe to provide access to response.
*
*
*
*
* @author
* @version 28-May-2016
*/
public class RestHttpContentExchange {
private static final int STATUS_PARSING_HEADERS = 500;
private static final int STATUS_PARSING_CONTENT = 500;
private String _encoding = "utf-8";
private byte[] _responseContent;
private static final Logger LOGGER = LoggerFactory.getLogger(RestHttpContentExchange.class);
private static final String PATH = "path:";
private boolean gzip = false;
private HttpFields _responseFields;
private byte[] _responseContentByte;
String _responseContentString;
int _responseStatus;
Request request;
boolean _rsponseAbort;
// private HttpFields setCacheFields(boolean cacheHeaders) {
// _responseFields = cacheHeaders ? new HttpFields() : null;
// return _responseFields;
// }
/**
* @return the scheme of the URL
*/
// public Buffer getScheme()
// {
// return _scheme;
// }
/**
* Extract message.
*
*
* @param data GZipped data.
* @return Uncompressed data.
* @throws IOException
* @since
*/
public String decompressGzipToStr(final byte[] data) throws IOException {
if (data == null) {
return "";
}
final StringBuilder out = new StringBuilder();
try (ByteArrayInputStream input = new ByteArrayInputStream(data);
GZIPInputStream gzis = new GZIPInputStream(input);
InputStreamReader reader = new InputStreamReader(gzis, Charset.forName(RestfulClientConst.ENCODING));) {
final char[] buff = new char[1024];
for (int n; (n = reader.read(buff)) != -1; ) {
out.append(new String(buff, 0, n));
}
}
return out.toString();
}
private boolean isGzip() {
return gzip;
}
public void setResponseContentString(String responseContentString){
this._responseContentString=responseContentString;
}
public void setResponseContentBytes (byte[] responseContentBytes){
this._responseContentByte=responseContentBytes ;
}
public void setResponseStatus ( int responseStatus ){
this._responseStatus = responseStatus ;
}
public void setResponseFields ( HttpFields responseFields ){
this._responseFields= responseFields ;
}
public synchronized String getResponseContentString() throws UnsupportedEncodingException {
if (_responseContentString != null)
return _responseContentString;
return null;
}
synchronized byte[] getResponseContentBytes() {
if (_responseContentByte != null)
return _responseContentByte;
return null;
}
synchronized int getResponseStatus() {
// if (_responseStatus >= 500)
// throw new IllegalStateException("internal server error");
return _responseStatus;
}
synchronized HttpFields getResponseFields() {
// if (_responseStatus >= STATUS_PARSING_CONTENT)
// throw new IllegalStateException("Headers not completely received yet");
return _responseFields;
}
/**
* Get the response as RestfulResponse.
*
*
* @return response object.
* @throws IOException
* @since
*/
public RestfulResponse getResponse() throws IOException {
final RestfulResponse rsp = new RestfulResponse();
rsp.setStatus(getResponseStatus());
if (isGzip()) {
final String responseString = decompressGzipToStr(getResponseContentBytes());
rsp.setResponseJson(responseString);
} else {
rsp.setResponseJson(this.getResponseContentString());
}
final HttpFields field = this.getResponseFields();
if (field != null) {
final Map header = new HashMap<>();
final Enumeration names = field.getFieldNames();
for (final Enumeration e = names; e.hasMoreElements(); ) {
final String fieldName = e.nextElement();
final String fieldValue = field.getField(fieldName).getValue();
header.put(fieldName, fieldValue);
}
rsp.setRespHeaderMap(header);
}
return rsp;
}
// @Override
// public void onContent(Response response, ByteBuffer content, Callback callback) {
// System.out.println("ContentExchange inside " + response.getStatus());
// super.onContent(response, content, callback);
// this._responseContentString = StandardCharsets.UTF_8.decode(content).toString();
// this._responseContent = content.array();
// }
//
// @Override
// public void onBegin(Response response) {
//
// }
//
// @Override
// public void onComplete(Result result) {
//
// }
//
// @Override
// public void onContent(Response response, ByteBuffer content) {
//
// }
//
// @Override
// public void onFailure(Response response, Throwable failure) {
// this._responseStatus = response.getStatus();
// this._rsponseAbort = response.abort(failure);
// }
//
// @Override
// public boolean onHeader(Response response, HttpField field) {
// this._responseFields = response.getHeaders();
// return false;
// }
//
// @Override
// public void onHeaders(Response response) {
//
// }
//
// @Override
// public void onSuccess(Response response) {
// this._responseStatus = response.getStatus();
// }
}