From 72a9ab9e886cdeabc4b43418a7054a5796a0ff55 Mon Sep 17 00:00:00 2001 From: sliard Date: Mon, 12 Apr 2021 15:58:22 +0200 Subject: [DMAAP-CLIENT] First sonar issues review part2 update Copyright informations fix checkstyle warning and fix code review comments remove Prop Issue-ID: DMAAP-1585 Change-Id: I445ca5d0888a555acbac70af7ed571be26d74f79 Signed-off-by: sliard --- .../onap/dmaap/mr/client/impl/MRBaseClient.java | 722 +++++++++++---------- 1 file changed, 362 insertions(+), 360 deletions(-) (limited to 'src/main/java/org/onap/dmaap/mr/client/impl/MRBaseClient.java') diff --git a/src/main/java/org/onap/dmaap/mr/client/impl/MRBaseClient.java b/src/main/java/org/onap/dmaap/mr/client/impl/MRBaseClient.java index 07cf6a7..9522c90 100644 --- a/src/main/java/org/onap/dmaap/mr/client/impl/MRBaseClient.java +++ b/src/main/java/org/onap/dmaap/mr/client/impl/MRBaseClient.java @@ -4,11 +4,13 @@ * ================================================================================ * Copyright © 2017 AT&T Intellectual Property. All rights reserved. * ================================================================================ + * Modifications Copyright © 2021 Orange. + * ================================================================================ * 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. @@ -17,387 +19,387 @@ * ============LICENSE_END========================================================= * * ECOMP is a trademark and service mark of AT&T Intellectual Property. - * + * *******************************************************************************/ + package org.onap.dmaap.mr.client.impl; +import com.att.nsa.apiClient.http.CacheUse; +import com.att.nsa.apiClient.http.HttpClient; import java.net.MalformedURLException; import java.util.Collection; import java.util.Set; import java.util.TreeSet; import java.util.concurrent.TimeUnit; - import javax.ws.rs.client.WebTarget; import javax.ws.rs.core.Response; import org.apache.http.HttpException; +import org.apache.http.HttpStatus; import org.glassfish.jersey.client.ClientConfig; import org.glassfish.jersey.internal.util.Base64; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import org.json.JSONTokener; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; - -import com.att.nsa.apiClient.http.CacheUse; -import com.att.nsa.apiClient.http.HttpClient; import org.onap.dmaap.mr.client.MRClient; import org.onap.dmaap.mr.client.MRClientFactory; -import org.onap.dmaap.mr.test.clients.ProtocolTypeConstants; +import org.onap.dmaap.mr.client.ProtocolType; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; public class MRBaseClient extends HttpClient implements MRClient { - private final static String HEADER_TRANSACTION_ID = "transactionid"; - - private final static String JSON_RESULT = "result"; - private final static String JSON_STATUS = "status"; - - private final static String AUTH_FAILED = "Authentication Failed: Username/password/AuthKey/AuthDate parameter(s) cannot be null or empty."; - private final static String LOG_TRANSACTION_ID = "TransactionId : "; - - private ClientConfig clientConfig = null; - - protected MRBaseClient(Collection hosts) throws MalformedURLException { - super(ConnectionType.HTTP, hosts, MRConstants.STD_MR_SERVICE_PORT); - - fLog = LoggerFactory.getLogger(this.getClass().getName()); - } - - protected MRBaseClient(Collection hosts, int stdSvcPort) throws MalformedURLException { - super(ConnectionType.HTTP, hosts, stdSvcPort); - - fLog = LoggerFactory.getLogger(this.getClass().getName()); - } - - protected MRBaseClient(Collection hosts, String clientSignature) throws MalformedURLException { - super(ConnectionType.HTTP, hosts, MRConstants.STD_MR_SERVICE_PORT, clientSignature, CacheUse.NONE, 1, 1L, - TimeUnit.MILLISECONDS, 32, 32, 600000); - - fLog = LoggerFactory.getLogger(this.getClass().getName()); - } - - public ClientConfig getClientConfig1() { - return clientConfig; - } - - public void setClientConfig(ClientConfig config) { - this.clientConfig = config; - } - - @Override - public void close() { - // nothing to close - } - - protected Set jsonArrayToSet(JSONArray a) { - if (a == null) - return null; - - final TreeSet set = new TreeSet<>(); - for (int i = 0; i < a.length(); i++) { - set.add(a.getString(i)); - } - return set; - } - - public void logTo(Logger log) { - fLog = log; - replaceLogger(log); - } - - protected Logger getLog() { - return fLog; - } - - private Logger fLog; - - public JSONObject post(final String path, final byte[] data, final String contentType, final String username, - final String password, final String protocalFlag) throws HttpException, JSONException { - if ((null != username && null != password)) { - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - String encoding = Base64.encodeAsString(username + ":" + password); - - response = DmaapClientUtil.postResponsewtBasicAuth(target, encoding, data, contentType); - - return getResponseDataInJson(response); - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public JSONObject postNoAuth(final String path, final byte[] data, String contentType) - throws HttpException, JSONException { - WebTarget target = null; - Response response = null; - if (contentType == null) { - contentType = "text/pain"; - } - target = DmaapClientUtil.getTarget(clientConfig,path); - - response = DmaapClientUtil.postResponsewtNoAuth(target, data, contentType); - - return getResponseDataInJson(response); - } - - public String postWithResponse(final String path, final byte[] data, final String contentType, - final String username, final String password, final String protocolFlag) - throws HttpException, JSONException { - String responseData = null; - if ((null != username && null != password)) { - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - String encoding = Base64.encodeAsString(username + ":" + password); - - response = DmaapClientUtil.postResponsewtBasicAuth(target, encoding, data, contentType); - - responseData = (String) response.readEntity(String.class); - return responseData; - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public String postNoAuthWithResponse(final String path, final byte[] data, String contentType) - throws HttpException, JSONException { - - String responseData = null; - WebTarget target = null; - Response response = null; - if (contentType == null) { - contentType = "text/pain"; - } - target = DmaapClientUtil.getTarget(clientConfig,path); - - response = DmaapClientUtil.postResponsewtNoAuth(target, data, contentType); - responseData = (String) response.readEntity(String.class); - return responseData; - } - - public JSONObject postAuth(PostAuthDataObject postAuthDO) throws HttpException, JSONException { - if ((null != postAuthDO.getUsername() && null != postAuthDO.getPassword())) { - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,postAuthDO.getPath(), postAuthDO.getUsername(), - postAuthDO.getPassword()); - response = DmaapClientUtil.postResponsewtCambriaAuth(target, postAuthDO.getAuthKey(), - postAuthDO.getAuthDate(), postAuthDO.getData(), postAuthDO.getContentType()); - return getResponseDataInJson(response); - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public String postAuthwithResponse(final String path, final byte[] data, final String contentType, - final String authKey, final String authDate, final String username, final String password, - final String protocolFlag) throws HttpException, JSONException { - String responseData = null; - if ((null != username && null != password)) { - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - response = DmaapClientUtil.postResponsewtCambriaAuth(target, authKey, authDate, data, contentType); - responseData = (String) response.readEntity(String.class); - return responseData; - - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public JSONObject get(final String path, final String username, final String password, final String protocolFlag) - throws HttpException, JSONException { - if (null != username && null != password) { - - WebTarget target = null; - Response response = null; - - if (ProtocolTypeConstants.AUTH_KEY.getValue().equalsIgnoreCase(protocolFlag)) { - target = DmaapClientUtil.getTarget(clientConfig,path); - response = DmaapClientUtil.getResponsewtCambriaAuth(target, username, password); - } else { - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - String encoding = Base64.encodeAsString(username + ":" + password); - - response = DmaapClientUtil.getResponsewtBasicAuth(target, encoding); - - } - return getResponseDataInJson(response); - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public String getResponse(final String path, final String username, final String password, - final String protocolFlag) throws HttpException, JSONException { - String responseData = null; - if (null != username && null != password) { - WebTarget target = null; - Response response = null; - if (ProtocolTypeConstants.AUTH_KEY.getValue().equalsIgnoreCase(protocolFlag)) { - target = DmaapClientUtil.getTarget(clientConfig,path); - response = DmaapClientUtil.getResponsewtCambriaAuth(target, username, password); - } else { - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - String encoding = Base64.encodeAsString(username + ":" + password); - response = DmaapClientUtil.getResponsewtBasicAuth(target, encoding); - } - MRClientFactory.setHTTPHeadersMap(response.getHeaders()); - - String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); - if (transactionid != null && !transactionid.equalsIgnoreCase("")) { - fLog.info(LOG_TRANSACTION_ID + transactionid); - } - - responseData = (String) response.readEntity(String.class); - return responseData; - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public JSONObject getAuth(final String path, final String authKey, final String authDate, final String username, - final String password, final String protocolFlag) throws HttpException, JSONException { - if (null != username && null != password) { - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - response = DmaapClientUtil.getResponsewtCambriaAuth(target, authKey, authDate); - - return getResponseDataInJson(response); - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public JSONObject getNoAuth(final String path) throws HttpException, JSONException { - - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path); - response = DmaapClientUtil.getResponsewtNoAuth(target); - - return getResponseDataInJson(response); - } - - public String getAuthResponse(final String path, final String authKey, final String authDate, final String username, - final String password, final String protocolFlag) throws HttpException, JSONException { - String responseData = null; - if (null != username && null != password) { - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - response = DmaapClientUtil.getResponsewtCambriaAuth(target, authKey, authDate); - - MRClientFactory.setHTTPHeadersMap(response.getHeaders()); - - String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); - if (transactionid != null && !transactionid.equalsIgnoreCase("")) { - fLog.info(LOG_TRANSACTION_ID + transactionid); - } - - responseData = (String) response.readEntity(String.class); - return responseData; - } else { - throw new HttpException(AUTH_FAILED); - } - } - - public String getNoAuthResponse(String path, final String username, final String password, - final String protocolFlag) throws HttpException, JSONException { - String responseData = null; - WebTarget target = null; - Response response = null; - target = DmaapClientUtil.getTarget(clientConfig,path, username, password); - response = DmaapClientUtil.getResponsewtNoAuth(target); - - MRClientFactory.setHTTPHeadersMap(response.getHeaders()); - - String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); - if (transactionid != null && !transactionid.equalsIgnoreCase("")) { - fLog.info(LOG_TRANSACTION_ID + transactionid); - } - - responseData = (String) response.readEntity(String.class); - return responseData; - - } - - private JSONObject getResponseDataInJson(Response response) throws JSONException { - try { - MRClientFactory.setHTTPHeadersMap(response.getHeaders()); - - // MultivaluedMap headersMap = - // for(String key : headersMap.keySet()) { - String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); - if (transactionid != null && !transactionid.equalsIgnoreCase("")) { - fLog.info(LOG_TRANSACTION_ID + transactionid); - } - - if (response.getStatus() == 403) { - JSONObject jsonObject = null; - jsonObject = new JSONObject(); - JSONArray jsonArray = new JSONArray(); - jsonArray.put(response.getEntity()); - jsonObject.put(JSON_RESULT, jsonArray); - jsonObject.put(JSON_STATUS, response.getStatus()); - return jsonObject; - } - String responseData = (String) response.readEntity(String.class); - - JSONTokener jsonTokener = new JSONTokener(responseData); - JSONObject jsonObject = null; - final char firstChar = jsonTokener.next(); - jsonTokener.back(); - if ('[' == firstChar) { - JSONArray jsonArray = new JSONArray(jsonTokener); - jsonObject = new JSONObject(); - jsonObject.put(JSON_RESULT, jsonArray); - jsonObject.put(JSON_STATUS, response.getStatus()); - } else { - jsonObject = new JSONObject(jsonTokener); - jsonObject.put(JSON_STATUS, response.getStatus()); - } - - return jsonObject; - } catch (JSONException excp) { - fLog.error("DMAAP - Error reading response data.", excp); - return null; - } - - } - - public String getHTTPErrorResponseMessage(String responseString) { - - String response = null; - int beginIndex = 0; - int endIndex = 0; - if (responseString.contains("")) { - - beginIndex = responseString.indexOf("body>") + 5; - endIndex = responseString.indexOf("")) { - beginIndex = responseString.indexOf("title>") + 6; - endIndex = responseString.indexOf(" hosts) throws MalformedURLException { + super(ConnectionType.HTTP, hosts, MRConstants.STD_MR_SERVICE_PORT); + + logger = LoggerFactory.getLogger(this.getClass().getName()); + } + + protected MRBaseClient(Collection hosts, int stdSvcPort) throws MalformedURLException { + super(ConnectionType.HTTP, hosts, stdSvcPort); + + logger = LoggerFactory.getLogger(this.getClass().getName()); + } + + protected MRBaseClient(Collection hosts, String clientSignature) throws MalformedURLException { + super(ConnectionType.HTTP, hosts, MRConstants.STD_MR_SERVICE_PORT, clientSignature, CacheUse.NONE, 1, 1L, + TimeUnit.MILLISECONDS, 32, 32, 600000); + + logger = LoggerFactory.getLogger(this.getClass().getName()); + } + + public ClientConfig getClientConfig1() { + return clientConfig; + } + + public void setClientConfig(ClientConfig config) { + this.clientConfig = config; + } + + @Override + public void close() { + // nothing to close + } + + protected Set jsonArrayToSet(JSONArray array) { + if (array == null) { + return null; + } + final TreeSet set = new TreeSet<>(); + for (int i = 0; i < array.length(); i++) { + set.add(array.getString(i)); + } + return set; + } + + public void logTo(Logger log) { + logger = log; + replaceLogger(log); + } + + protected Logger getLog() { + return logger; + } + + private Logger logger; + + public JSONObject post(final String path, final byte[] data, final String contentType, final String username, + final String password, final String protocalFlag) throws HttpException, JSONException { + if ((null != username && null != password)) { + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + String encoding = Base64.encodeAsString(username + ":" + password); + + response = DmaapClientUtil.postResponsewtBasicAuth(target, encoding, data, contentType); + + return getResponseDataInJson(response); + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public JSONObject postNoAuth(final String path, final byte[] data, String contentType) + throws HttpException, JSONException { + WebTarget target = null; + Response response = null; + if (contentType == null) { + contentType = "text/pain"; + } + target = DmaapClientUtil.getTarget(clientConfig, path); + + response = DmaapClientUtil.postResponsewtNoAuth(target, data, contentType); + + return getResponseDataInJson(response); + } + + public String postWithResponse(final String path, final byte[] data, final String contentType, + final String username, final String password, final String protocolFlag) + throws HttpException, JSONException { + String responseData = null; + if ((null != username && null != password)) { + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + String encoding = Base64.encodeAsString(username + ":" + password); + + response = DmaapClientUtil.postResponsewtBasicAuth(target, encoding, data, contentType); + + responseData = response.readEntity(String.class); + return responseData; + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public String postNoAuthWithResponse(final String path, final byte[] data, String contentType) + throws HttpException, JSONException { + + String responseData = null; + WebTarget target = null; + Response response = null; + if (contentType == null) { + contentType = "text/pain"; + } + target = DmaapClientUtil.getTarget(clientConfig, path); + + response = DmaapClientUtil.postResponsewtNoAuth(target, data, contentType); + responseData = response.readEntity(String.class); + return responseData; + } + + public JSONObject postAuth(PostAuthDataObject postAuthDO) throws HttpException, JSONException { + if ((null != postAuthDO.getUsername() && null != postAuthDO.getPassword())) { + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, postAuthDO.getPath(), postAuthDO.getUsername(), + postAuthDO.getPassword()); + response = DmaapClientUtil.postResponsewtCambriaAuth(target, postAuthDO.getAuthKey(), + postAuthDO.getAuthDate(), postAuthDO.getData(), postAuthDO.getContentType()); + return getResponseDataInJson(response); + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public String postAuthwithResponse(final String path, final byte[] data, final String contentType, + final String authKey, final String authDate, final String username, final String password, + final String protocolFlag) throws HttpException, JSONException { + String responseData = null; + if ((null != username && null != password)) { + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + response = DmaapClientUtil.postResponsewtCambriaAuth(target, authKey, authDate, data, contentType); + responseData = response.readEntity(String.class); + return responseData; + + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public JSONObject get(final String path, final String username, final String password, final String protocolFlag) + throws HttpException, JSONException { + if (null != username && null != password) { + + WebTarget target = null; + Response response = null; + + if (ProtocolType.AUTH_KEY.getValue().equalsIgnoreCase(protocolFlag)) { + target = DmaapClientUtil.getTarget(clientConfig, path); + response = DmaapClientUtil.getResponsewtCambriaAuth(target, username, password); + } else { + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + String encoding = Base64.encodeAsString(username + ":" + password); + + response = DmaapClientUtil.getResponsewtBasicAuth(target, encoding); + + } + return getResponseDataInJson(response); + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public String getResponse(final String path, final String username, final String password, + final String protocolFlag) throws HttpException, JSONException { + String responseData = null; + if (null != username && null != password) { + WebTarget target = null; + Response response = null; + if (ProtocolType.AUTH_KEY.getValue().equalsIgnoreCase(protocolFlag)) { + target = DmaapClientUtil.getTarget(clientConfig, path); + response = DmaapClientUtil.getResponsewtCambriaAuth(target, username, password); + } else { + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + String encoding = Base64.encodeAsString(username + ":" + password); + response = DmaapClientUtil.getResponsewtBasicAuth(target, encoding); + } + MRClientFactory.setHTTPHeadersMap(response.getHeaders()); + + String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); + if (transactionid != null && !transactionid.equalsIgnoreCase("")) { + logger.info(LOG_TRANSACTION_ID, transactionid); + } + + responseData = response.readEntity(String.class); + return responseData; + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public JSONObject getAuth(final String path, final String authKey, final String authDate, final String username, + final String password, final String protocolFlag) throws HttpException, JSONException { + if (null != username && null != password) { + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + response = DmaapClientUtil.getResponsewtCambriaAuth(target, authKey, authDate); + + return getResponseDataInJson(response); + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public JSONObject getNoAuth(final String path) throws HttpException, JSONException { + + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path); + response = DmaapClientUtil.getResponsewtNoAuth(target); + + return getResponseDataInJson(response); + } + + public String getAuthResponse(final String path, final String authKey, final String authDate, final String username, + final String password, final String protocolFlag) throws HttpException, JSONException { + String responseData = null; + if (null != username && null != password) { + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + response = DmaapClientUtil.getResponsewtCambriaAuth(target, authKey, authDate); + + MRClientFactory.setHTTPHeadersMap(response.getHeaders()); + + String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); + if (transactionid != null && !transactionid.equalsIgnoreCase("")) { + logger.info(LOG_TRANSACTION_ID, transactionid); + } + + responseData = response.readEntity(String.class); + return responseData; + } else { + throw new HttpException(AUTH_FAILED); + } + } + + public String getNoAuthResponse(String path, final String username, final String password, + final String protocolFlag) throws HttpException, JSONException { + String responseData = null; + WebTarget target = null; + Response response = null; + target = DmaapClientUtil.getTarget(clientConfig, path, username, password); + response = DmaapClientUtil.getResponsewtNoAuth(target); + + MRClientFactory.setHTTPHeadersMap(response.getHeaders()); + + String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); + if (transactionid != null && !transactionid.equalsIgnoreCase("")) { + logger.info(LOG_TRANSACTION_ID, transactionid); + } + + responseData = response.readEntity(String.class); + return responseData; + + } + + private JSONObject getResponseDataInJson(Response response) throws JSONException { + try { + MRClientFactory.setHTTPHeadersMap(response.getHeaders()); + + // MultivaluedMap headersMap = + // for(String key : headersMap.keySet()) { + String transactionid = response.getHeaderString(HEADER_TRANSACTION_ID); + if (transactionid != null && !transactionid.equalsIgnoreCase("")) { + logger.info(LOG_TRANSACTION_ID, transactionid); + } + + if (response.getStatus() == HttpStatus.SC_FORBIDDEN) { + JSONObject jsonObject = null; + jsonObject = new JSONObject(); + JSONArray jsonArray = new JSONArray(); + jsonArray.put(response.getEntity()); + jsonObject.put(JSON_RESULT, jsonArray); + jsonObject.put(JSON_STATUS, response.getStatus()); + return jsonObject; + } + String responseData = response.readEntity(String.class); + + JSONTokener jsonTokener = new JSONTokener(responseData); + JSONObject jsonObject = null; + final char firstChar = jsonTokener.next(); + jsonTokener.back(); + if ('[' == firstChar) { + JSONArray jsonArray = new JSONArray(jsonTokener); + jsonObject = new JSONObject(); + jsonObject.put(JSON_RESULT, jsonArray); + jsonObject.put(JSON_STATUS, response.getStatus()); + } else { + jsonObject = new JSONObject(jsonTokener); + jsonObject.put(JSON_STATUS, response.getStatus()); + } + + return jsonObject; + } catch (JSONException excp) { + logger.error("DMAAP - Error reading response data.", excp); + return null; + } + + } + + public String getHTTPErrorResponseMessage(String responseString) { + + String response = null; + int beginIndex = 0; + int endIndex = 0; + if (responseString.contains("")) { + + beginIndex = responseString.indexOf("body>") + 5; + endIndex = responseString.indexOf("")) { + beginIndex = responseString.indexOf("title>") + 6; + endIndex = responseString.indexOf("