diff --git a/build.gradle b/build.gradle
index 7acaa39..f1d0b88 100644
--- a/build.gradle
+++ b/build.gradle
@@ -65,6 +65,8 @@ dependencies {
api 'io.github.resilience4j:resilience4j-micrometer:1.7.1'
api 'io.micrometer:micrometer-core:1.5.17'
api 'io.micrometer:micrometer-registry-prometheus:1.5.17'
+
+ implementation "com.google.code.gson:gson:2.3.1"
//api "com.eactive:mina-core-1.0.10-custom:1.0:custom@jar"
api ("org.apache.mina:mina-filter-ssl:1.0.10") {
diff --git a/settings.gradle b/settings.gradle
index 0791851..082155b 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -3,7 +3,9 @@ rootProject.name = 'elink-online-common'
include 'elink-online-core-jpa'
include 'elink-online-core'
include 'elink-online-transformer'
+include 'elink-online-alarm'
project (':elink-online-core-jpa').projectDir = new File(settingsDir, "../elink-online-core-jpa")
project (':elink-online-core').projectDir = new File(settingsDir, "../elink-online-core")
-project (':elink-online-transformer').projectDir = new File(settingsDir, "../elink-online-transformer")
\ No newline at end of file
+project (':elink-online-transformer').projectDir = new File(settingsDir, "../elink-online-transformer")
+project (':elink-online-alarm').projectDir = new File(settingsDir, "../elink-online-alarm")
\ No newline at end of file
diff --git a/src/main/java/com/eactive/eai/adapter/db/sql/AdapterUtils.java b/src/main/java/com/eactive/eai/adapter/db/sql/AdapterUtils.java
index 28279ec..2da8689 100644
--- a/src/main/java/com/eactive/eai/adapter/db/sql/AdapterUtils.java
+++ b/src/main/java/com/eactive/eai/adapter/db/sql/AdapterUtils.java
@@ -14,8 +14,8 @@ public class AdapterUtils {
map.put("Unid", "ID00000001");
String prefix = "%", surfix = "%";
- System.out.println(updateSql);
- System.out.println(getUpdateQuery(updateSql, map, prefix, surfix));
+ // System.out.println(updateSql);
+ // System.out.println(getUpdateQuery(updateSql, map, prefix, surfix));
}
public static Properties getAdapterProerties(String propGroupName) {
diff --git a/src/main/java/com/eactive/eai/adapter/db/sql/DBInboudSqlAdapter.java b/src/main/java/com/eactive/eai/adapter/db/sql/DBInboudSqlAdapter.java
index 7a4797b..050c3ac 100644
--- a/src/main/java/com/eactive/eai/adapter/db/sql/DBInboudSqlAdapter.java
+++ b/src/main/java/com/eactive/eai/adapter/db/sql/DBInboudSqlAdapter.java
@@ -56,7 +56,7 @@ public class DBInboudSqlAdapter {
if(isLocal != null && "true".equalsIgnoreCase(isLocal)) {
isLocalTest = true;
}
- System.out.println("$$$ DBInboudSqlAdapter] isLocalTest = " + isLocalTest);
+ // System.out.println("$$$ DBInboudSqlAdapter] isLocalTest = " + isLocalTest);
}
public boolean execute() {
diff --git a/src/main/java/com/eactive/eai/adapter/http/HttpMethodType.java b/src/main/java/com/eactive/eai/adapter/http/HttpMethodType.java
index 5631af6..8d14662 100644
--- a/src/main/java/com/eactive/eai/adapter/http/HttpMethodType.java
+++ b/src/main/java/com/eactive/eai/adapter/http/HttpMethodType.java
@@ -5,6 +5,7 @@ public enum HttpMethodType {
PUT,
DELETE,
GET,
+ PATCH,
UNKNOWN;
public static HttpMethodType getValue(String value) {
try {
diff --git a/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java b/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java
index 80655b5..64e0e6d 100644
--- a/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java
+++ b/src/main/java/com/eactive/eai/adapter/http/client/HttpClient5AdapterServiceSupport.java
@@ -40,6 +40,7 @@ import com.eactive.eai.adapter.AdapterManager;
import com.eactive.eai.adapter.Keys;
import com.eactive.eai.adapter.http.secure.HttpClient5SSLContextFactory;
import com.eactive.eai.common.TransactionContextKeys;
+import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.util.HttpAdapterExtraLogUtil;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.httpouttlsinfo.HttpOutTlsInfoVO;
@@ -78,7 +79,7 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap
String trustStorePassword = null;
int connectionTimeout = 0;
- int timeout = -1;
+ int timeout = 10000; // 기존값 -1 인데, 의미가 없음, -1로 설정될경우 client에서 에러남.
int traceLevel = 0;
long slowTranTime = 2000L;
@@ -88,6 +89,13 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap
if (!StringUtils.isEmpty(url2grp)) {
url = url2grp;
}
+
+ boolean isDrMode = Boolean.valueOf(PropManager.getInstance().getProperty(DR_PROP_GROUP, DR_PROP_KEY, "false"));
+
+ if (isDrMode) {
+ url = prop.getProperty(DR_URL);
+ }
+
method = prop.getProperty(METHOD);
parameterName = prop.getProperty(PARAMETER_NAME, PARAMETER_MESSAGE);
contentType = prop.getProperty(CONTENT_TYPE, "");
@@ -99,7 +107,7 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap
adapterHeader = prop.getProperty(ADAPTER_HEADER, "");
String traceLevelTemp = prop.getProperty(TRACE_LEVEL, "0");
- String timeoutTemp = prop.getProperty(HTTP_TIME_OUT, "0");
+ String timeoutTemp = "10000"; // 타임아웃 기준이 불명확해 운영 혼란 발생 → 인터페이스 TIMEOUT으로 단일화
useMtls = StringUtils.equalsIgnoreCase(prop.getProperty(HttpClientAdapterServiceKey.USE_MTLS),"Y");
keyStorePath = prop.getProperty(HttpClientAdapterServiceKey.KEYSTORE_PATH);
@@ -418,6 +426,8 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap
};
this.client = HttpClients.custom()
+ .disableDefaultUserAgent()
+ .disableContentCompression()
.addRequestInterceptorLast(requestLogInterceptor)
.addResponseInterceptorFirst(responseLogInterceptor)
.setConnectionManager(connectionManager)
@@ -507,12 +517,6 @@ public abstract class HttpClient5AdapterServiceSupport implements HttpClientAdap
requestConfigBuilder.setResponseTimeout(vo.getTimeout(), TimeUnit.MILLISECONDS);
}
- /*
- if (HTTP_VERSION_1_1.equals(vo.getHttpVersion())) {
- method.addHeader("Connection", "close");
- }
- */
-
org.apache.hc.core5.http.HttpVersion httpVersion ;
if (HTTP_VERSION_1_0.equals(vo.getHttpVersion())) {
httpVersion = org.apache.hc.core5.http.HttpVersion.HTTP_1_0;
diff --git a/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceKey.java b/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceKey.java
index 0238cbc..4de44f4 100644
--- a/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceKey.java
+++ b/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceKey.java
@@ -8,6 +8,9 @@ public interface HttpClientAdapterServiceKey {
public static final String HTTP_TYPE = "HTTP_TYPE";
public static final String URL = "URL";
+ public static final String DR_PROP_GROUP = "DR";
+ public static final String DR_PROP_KEY = "dr.enable";
+ public static final String DR_URL = "URL_DR";
public static final String URL_2GRP = "URL_2GRP";
public static final String METHOD = "METHOD";
@@ -66,6 +69,7 @@ public interface HttpClientAdapterServiceKey {
public static final String INBOUND_METHOD = "INBOUND_METHOD";
public static final String INBOUND_URI = "INBOUND_URI";
public static final String INBOUND_EXTURI = "INBOUND_EXTURI";
+ public static final String INBOUND_EXTPARAMS = "INBOUND_EXTPARAMS";
public static final String INBOUND_HEADER = "INBOUND_HEADER";
public static final String HTTP_VERSION = "HTTP_VERSION";
diff --git a/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceSupport.java b/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceSupport.java
index 941a92b..f72bfc9 100644
--- a/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceSupport.java
+++ b/src/main/java/com/eactive/eai/adapter/http/client/HttpClientAdapterServiceSupport.java
@@ -27,6 +27,7 @@ import com.eactive.eai.adapter.http.secure.CustomHttpsSocketFactory;
import com.eactive.eai.adapter.http.secure.CustomSSLProtocolSocketFactory;
import com.eactive.eai.adapter.http.secure.EasySSLProtocolSocketFactory;
import com.eactive.eai.adapter.http.secure.SSLContextFactory;
+import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.util.Logger;
import com.eactive.eai.httpouttlsinfo.HttpOutTlsInfoManager;
import com.eactive.eai.httpouttlsinfo.HttpOutTlsInfoVO;
@@ -83,7 +84,7 @@ public abstract class HttpClientAdapterServiceSupport implements HttpClientAdapt
adapterHeader = prop.getProperty(ADAPTER_HEADER, "");
String traceLevelTemp = prop.getProperty(TRACE_LEVEL, "0");
- String timeoutTemp = prop.getProperty(HTTP_TIME_OUT);
+ String timeoutTemp = "10000";// 타임아웃 기준이 불명확해 운영 혼란 발생 → 인터페이스 TIMEOUT으로 단일화
useMtls = StringUtils.equalsIgnoreCase(prop.getProperty(HttpClientAdapterServiceKey.USE_MTLS), "Y");
keyStorePath = prop.getProperty(HttpClientAdapterServiceKey.KEYSTORE_PATH);
@@ -100,6 +101,12 @@ public abstract class HttpClientAdapterServiceSupport implements HttpClientAdapt
if (StringUtils.isNotBlank(interfaceTimeout) && NumberUtils.toInt(interfaceTimeout) > 0) {
timeoutTemp = interfaceTimeout;
}
+
+ boolean isDrMode = Boolean.valueOf(PropManager.getInstance().getProperty(DR_PROP_GROUP, DR_PROP_KEY, "false"));
+
+ if (isDrMode) {
+ url = prop.getProperty(DR_URL);
+ }
url = StringUtils.trim(url);
parameterName = StringUtils.trim(parameterName);
@@ -116,6 +123,7 @@ public abstract class HttpClientAdapterServiceSupport implements HttpClientAdapt
try {
connectionTimeout = Integer.parseInt(connectionTimeoutTemp);
} catch (Exception e) {
+ connectionTimeout = 3000;
logger.debug("HttpClientAdapterSupport] connectionTimeoutTemp not int");
}
try {
diff --git a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java
index 5bfc866..2468b2f 100644
--- a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java
+++ b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceBody.java
@@ -5,6 +5,7 @@ import com.eactive.eai.adapter.http.client.HttpClient5AdapterServiceSupport;
import com.eactive.eai.adapter.http.client.HttpClientAdapterServiceKey;
import com.eactive.eai.adapter.http.client.HttpClientAdapterVO;
import com.eactive.eai.common.TransactionContextKeys;
+import com.eactive.eai.common.message.MessageType;
import com.eactive.eai.common.util.CommonLib;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.lang3.StringUtils;
@@ -57,14 +58,16 @@ public class HttpClient5AdapterServiceBody extends HttpClient5AdapterServiceSupp
} else if (data instanceof byte[]) {
sendData = new String((byte[]) data, vo.getEncode());
}
-
- ObjectMapper mapper = new ObjectMapper();
- ObjectNode jsonNode = (ObjectNode) mapper.readTree(sendData);
- ObjectNode headerPart = (ObjectNode) jsonNode.get("header_part");
-
- if( headerPart.get("mciIntfId") != null && headerPart.get("mciIntfId").asText().trim().length() > 0 ) {
- headerPart.put("eaiIntfId", "");
- sendData = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);
+
+ if(MessageType.JSON.equals(prop.getProperty("messageType"))) {
+ ObjectMapper mapper = new ObjectMapper();
+ ObjectNode jsonNode = (ObjectNode) mapper.readTree(sendData);
+ ObjectNode headerPart = (ObjectNode) jsonNode.get("header_part");
+
+ if( headerPart.get("mciIntfId") != null && headerPart.get("mciIntfId").asText().trim().length() > 0 ) {
+ headerPart.put("eaiIntfId", "");
+ sendData = mapper.writerWithDefaultPrettyPrinter().writeValueAsString(jsonNode);
+ }
}
if ("Y".equals(vo.getUrlEncodeYn())) {
diff --git a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java
index db918b9..2b699de 100644
--- a/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java
+++ b/src/main/java/com/eactive/eai/adapter/http/client/impl/HttpClient5AdapterServiceRest.java
@@ -7,15 +7,24 @@ import java.net.ConnectException;
import java.net.SocketTimeoutException;
import java.net.URI;
import java.nio.charset.StandardCharsets;
+import java.text.SimpleDateFormat;
import java.util.ArrayList;
+import java.util.Base64;
+import java.util.Date;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.List;
import java.util.Map;
+import java.util.Map.Entry;
import java.util.Properties;
+import java.util.Set;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
-import com.eactive.eai.common.property.PropManager;
+// encrypt test by jwhong
+import javax.crypto.Cipher;
+import javax.crypto.spec.SecretKeySpec;
+
import org.apache.commons.lang3.ArrayUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.time.StopWatch;
@@ -24,6 +33,7 @@ import org.apache.hc.client5.http.classic.methods.HttpDelete;
import org.apache.hc.client5.http.classic.methods.HttpGet;
import org.apache.hc.client5.http.classic.methods.HttpPost;
import org.apache.hc.client5.http.classic.methods.HttpPut;
+import org.apache.hc.client5.http.classic.methods.HttpPatch;
import org.apache.hc.client5.http.classic.methods.HttpUriRequestBase;
import org.apache.hc.client5.http.config.RequestConfig;
import org.apache.hc.client5.http.entity.UrlEncodedFormEntity;
@@ -51,8 +61,6 @@ import org.springframework.security.oauth2.provider.ClientDetails;
import org.springframework.web.util.UriComponents;
import org.springframework.web.util.UriComponentsBuilder;
-import com.eactive.eai.adapter.AdapterGroupVO;
-import com.eactive.eai.adapter.AdapterManager;
import com.eactive.eai.adapter.AdapterPropManager;
import com.eactive.eai.adapter.http.HttpMemoryLogger;
import com.eactive.eai.adapter.http.HttpMethodType;
@@ -60,50 +68,39 @@ import com.eactive.eai.adapter.http.client.HttpClient5AdapterServiceSupport;
import com.eactive.eai.adapter.http.client.HttpClientAdapterServiceKey;
import com.eactive.eai.adapter.http.client.HttpClientAdapterVO;
import com.eactive.eai.adapter.http.dynamic.HttpAdapterServiceKey;
-import com.eactive.eai.adapter.http.dynamic.filter.AdapterAllowIPListFilter;
-import com.eactive.eai.adapter.http.dynamic.filter.ApiAuthFilter;
-import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilter;
-import com.eactive.eai.adapter.http.dynamic.filter.HttpAdapterFilterType;
-import com.eactive.eai.adapter.http.dynamic.filter.IpWhiteListFilter;
-import com.eactive.eai.adapter.http.dynamic.filter.JwtAuthFilter;
+import com.eactive.eai.authserver.service.OAuth2Manager;
import com.eactive.eai.common.TransactionContextKeys;
import com.eactive.eai.common.authoutbound.AccessTokenManagerByDB;
import com.eactive.eai.common.exception.ExceptionUtil;
import com.eactive.eai.common.message.MessageType;
+import com.eactive.eai.common.property.PropManager;
import com.eactive.eai.common.util.CommonLib;
import com.jayway.jsonpath.DocumentContext;
import com.jayway.jsonpath.JsonPath;
+import com.kjbank.encrypt.exchange.crypto.AES256Cipher;
+import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher;
+import com.kjbank.encrypt.exchange.crypto.AESCipher;
+import com.kjbank.encrypt.exchange.crypto.ECDHESA256Cipher;
+import com.nimbusds.jwt.SignedJWT;
import com.openbanking.eai.common.token.AccessTokenManager;
import com.openbanking.eai.common.token.AccessTokenVO;
import com.openbanking.eai.common.token.OAuth2AccessTokenVO;
import edu.emory.mathcs.backport.java.util.Arrays;
-// encrypt test by jwhong
-import javax.crypto.Cipher;
-import javax.crypto.spec.SecretKeySpec;
-import java.nio.charset.StandardCharsets;
-import java.util.Base64;
-import com.kjbank.encrypt.exchange.crypto.AES256Cipher;
-import com.kjbank.encrypt.exchange.crypto.AESCipher;
-import com.nimbusds.jwt.SignedJWT;
-import com.kjbank.encrypt.exchange.crypto.AES256GCMCipher;
-import com.eactive.eai.authserver.service.OAuth2Manager;
-
-
/**
* 1. 기능 : EAI HTTP OutBound 용 어댑터로 수동 시스템의 HTTP 웹 컴포넌트를 GET/POST 방식으로 호출할 수 있는
* 기능을 제공한다.
* 2. 처리 개요 :
* * - 2020-09-25: Http Header 받아서 처리할 수 있게 기능 추가
- * 3. 주의사항
+ * 3. 주의사항
*
* @author :
* @version : v 1.0.0
* @see : HttpClientAdapterServiceFactory.java,
* HttpClientAdapterServiceSupport.java
* @since :
- *
+ *
*/
public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupport
implements HttpClientAdapterServiceKey {
@@ -115,11 +112,15 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
public static final String HTTP_STATUS = "HTTP_STATUS";
public static final String HEADER_KEYS = "HEADER_KEYS";
public static final String AUTH_TOKEN = "AUTH_TOKEN";
-
+ public static final String HTTP_HEADER_SETTING = "HTTP_HEADER_SETTING";
+
public static final String PAYLOAD_PARAM_NAME_CLIENT_ID = "client_id"; // jwhong
+ static final String KJB_ROOTLESS_ARRAY = "{ \"KJB_ROOTLESS_ARRAY\" : ";
+
private boolean useAdapterToken;
private boolean encryptResponseApply;
+ private String httpHeaderSettingByAdapter = "{}";
/**
* 1. 기능 : REST API 통신에 사용
@@ -163,9 +164,13 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
// 레이아웃 메시지 타입 REST URL 추출 시 활용. Default JSON
String messageType = prop.getProperty("MESSAGE_TYPE", MessageType.JSON);
String inboundMethod = tempProp.getProperty(HttpAdapterServiceKey.INBOUND_METHOD, "POST");
-
- //Outbound 요청에 대한 응답 메시지의 복호화 여부 결정위해
+ //String inboundToken = tempProp.getProperty(HttpAdapterServiceKey.INBOUND_TOKEN, "");
+
+ //Outbound 요청에 대한 응답 메시지의 복호화 여부 결정위해 jwhong
encryptResponseApply = StringUtils.equalsIgnoreCase(prop.getProperty("ENCRYPT_RESPONSE_APPLY", "N"), "Y");
+
+ //업체 300응답시 특정 http status code 경우 에러 아닌걸로 처리. 광주은행
+ String errIgnore = prop.getProperty("ERROR_IGNORE_CODE", "");
/**
* @formatter:off
@@ -237,12 +242,14 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
logger.debug("HttpClientAdapterServiceRest] dataObject1 = [" + dataObject + "]");
+ // Path Variable 처리를 위해 Inbound에서 전달한 Variable Map
+ Map inboundPathVariables = (Map) tempProp.get(HttpAdapterServiceKey.INBOUND_PATH_VARIABLES);
// interface 에 설정된게 우선한다.
String uri = null;
if (dataObject == null) {
- uri = changeUrl(messageType, vo.getUrl(), restOptionData, sendData);
+ uri = changeUrl(messageType, vo.getUrl(), restOptionData, sendData, inboundPathVariables);
} else {
- uri = changeUrl(messageType, vo.getUrl(), restOptionData, dataObject);
+ uri = changeUrl(messageType, vo.getUrl(), restOptionData, dataObject, inboundPathVariables);
}
logger.debug("HttpClientAdapterServiceRest] dataObject2 = [" + dataObject + "]");
@@ -278,6 +285,9 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
case PUT:
method = new HttpPut(uri);
break;
+ case PATCH:
+ method = new HttpPatch(uri);
+ break;
default:
method = new HttpGet(uri);
break;
@@ -299,12 +309,14 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
// OAuth2AccessToken check 부분을 뒤에서 여기로 위치를 옮김, 나이스지키미 암호화 KEY를 얻기 위해서. JWHONG
OAuth2AccessTokenVO accessToken = null;
String auth ="";
+ Date currentDate = new Date();
if (useAdapterToken) {
AccessTokenManagerByDB tokenManager = AccessTokenManagerByDB.getInstance();
accessToken = (OAuth2AccessTokenVO) tokenManager.getAccessTokenVO(vo.getAdapterGroupName());
// 토큰이 없거나 만료 됐으면 재발급
- if (accessToken == null || accessToken.isExpired()) {
+ //if (accessToken == null || accessToken.isExpired()) {
+ if (accessToken == null || accessToken.isExpired() || accessToken.getAccessToken() == null ) { // jwhong
String oldToken = accessToken == null ? null : accessToken.getAccessToken();
accessToken = (OAuth2AccessTokenVO) tokenManager.retryAccessTokenVO(vo.getAdapterGroupName(), prop,
oldToken);
@@ -317,31 +329,37 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
Properties properties = AdapterPropManager.getInstance().getProperties(vo.getAdapterName()); // jwhong
String encryptAlgorithm = properties.getProperty("ENCRYPT_ALGORITHM"); // jwhong
- if (useAdapterToken && "AES256-NICEON".equals(encryptAlgorithm)) {
- String niceToken = accessToken.getAccessToken();
- String clientId = JwtClientIdExtractor(niceToken);
- long currentTime = System.currentTimeMillis();
- auth = niceToken + ":" + currentTime + ":" + clientId ;
- auth = Base64.getEncoder().encodeToString(auth.getBytes("UTF-8"));
-
- setNiceOnAuthHeaders(method, auth);
- } else {
+ if (useAdapterToken && "AES256-NICEON".equals(encryptAlgorithm)) {
+ String niceToken = accessToken.getAccessToken();
+ if ( niceToken == null || niceToken == "") {
+ throw new Exception("NiceOn Token is empty, TOKEN failed to be issued, TOKEN = [" + niceToken + "]");
+ }
+ String clientId = accessToken.getClientId(); // HttpClientAccessTokenServiceWithBase64NiceOn 서 넣어줌
+ long currentTime = currentDate.getTime() / 1000;
+ auth = niceToken + ":" + currentTime + ":" + clientId ;
+ logger.debug("HttpClientAdapterServiceRest] NiceOn auth = [" + auth + "]");
+ auth = Base64.getEncoder().encodeToString(auth.getBytes("UTF-8"));
+ logger.debug("HttpClientAdapterServiceRest] NiceOn Base64 encoded auth = [" + auth + "]");
+
+ setNiceOnAuthHeaders(method, auth);
+ } else {
setAuthHeaders(method, accessToken); // 원래 있던 logic
- }
+ }
if (logger.isDebug()) {
logger.debug("HttpClientAdapterServiceRest] SEND (" + vo.getAdapterGroupName()
- + ") RequestHeader [Authorization=" + method.getHeader("Authorization") + "]");
+ + ") RequestHeader [" + method.getHeader("Authorization").getName() + ": " + method.getHeader("Authorization").getValue() + "]");
}
}
if(!StringUtils.isBlank(authToken)) {
setAuthHeaders(method, authToken);
}
- // 여기 까지
-
+ // 여기 까지
+
configureHttpClient(requestConfigBuilder, vo, method);
+ assignFilterHeaders(method, tempProp); // OutBound PreFilter에서 설정한 Header내용 설정.
switch (HttpMethodType.getValue(rmethod)) {
case GET:
@@ -363,9 +381,12 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
break;
case PUT:
case POST:
+ case PATCH:
// assignPostBody(dataObject, contentType, vo.getEncode(), method);
//assignPostBody(dataContent, contentType, vo.getEncode(), method); // jwhong commnet
- assignPostBody(dataContent, contentType, vo.getEncode(), method, vo.getAdapterName(), auth);
+ // KJBank API 추적정보를 Header에 제공. jwhong
+ String inboundToken= assignRequestKJHeaders(method, prop, tempProp );
+ assignPostBody(dataContent, contentType, vo.getEncode(), method, vo.getAdapterName(), auth, inboundToken, currentDate);
break;
default:
break;
@@ -376,12 +397,12 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
+ method.getEntity() + "] ");
}
- // OAuth2AccessToken 원래 있던 위치 JWHONG
+ // OAuth2AccessToken 원래 있던 위치 JWHONG
// 전달 header 셋팅
// Adapter 레벨 header 보다 data로 넘어온 httpHeader를 우선 적용(header명이 같다면 덮어씀)
- assignRequestHeaders(method, httpHeader);
-
+ assignRequestHeaders(method, httpHeader, prop);
+
int status = -1;
try {
@@ -423,7 +444,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
// encrypt algorithm type 추출 from adapter property jwhong
Properties properties = AdapterPropManager.getInstance().getProperties(vo.getAdapterName()); // jwhong
String encryptAlgorithm = properties.getProperty("ENCRYPT_ALGORITHM"); // jwhong
-
+
try {
if (logger.isDebug()) {
logger.debug("[method getName]" + method.getMethod());
@@ -436,14 +457,14 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
//responseMessage = EntityUtils.toByteArray(response.getEntity());
// 역기서 responseMessage를 decryption 해야 하나 by jwhong
-
+
responseMessageOri = EntityUtils.toByteArray(response.getEntity());
- System.out.println("responseMessageOri 바이트 배열 길이: " + responseMessageOri.length);
-
- responseMessage = doOutboundPostFilter(responseMessageOri, encryptAlgorithm, vo.getAdapterName(), accessToken); // jwhong
+ logger.debug("[responseMessageOri 바이트 배열 길이 ]" + responseMessageOri.length);
+
+ responseMessage = doOutboundPostFilter(responseMessageOri, encryptAlgorithm, vo.getAdapterName(), accessToken); // jwhong
// 여기까지
-
- responseHeaders = response.getHeaders();
+
+ responseHeaders = response.getHeaders();
if (logger.isDebug()) {
logger.debug("[received status]" + status);
@@ -464,7 +485,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
* OAuth 토큰 응답 체크(Adapter properties로 설정)
* 응답코드에 따라 유효한 토큰 확인(토큰 재발급 여부 확인)
* API 서비스 마다 정책이 다름(보통 400대에서 체크하나 200에서도 체크할 수 있음)
- *
+ *
* TOKEN_ERROR_CODE_KEY: 응답 json error code key
* __ex) $.dataHeader.resultCode
* TOKEN_ERROR_CODE_VALUES: 토큰 재발급이 필요한 응답 error codes(ex: O0001,O0002,O0003)
@@ -473,17 +494,20 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
* @formatter:on
*/
boolean needReissue = false;
-
+
Properties responseHeaderProp = assignRelayDataToInbound(tempProp, responseHeaders);
String responseString = new String(responseMessage, vo.getEncode());
-
+
Map map = new HashMap();
tempProp.put(HttpAdapterServiceKey.OUTBOUND_PROPERTY_MAP, map);
map.put(HttpAdapterServiceKey.OUTBOUND_RESPONSE_HEADERS, responseHeaderProp);
map.put(HttpAdapterServiceKey.OUTBOUND_RESPONSE_MESSAGE, responseString);
map.put(HttpAdapterServiceKey.OUTBOUND_RESPONSE_STATUS, status);
- if (status >= 200 && status <= 207) {
+
+ if (isStatusInIgnore(status,errIgnore )) {
+ // 이경우 정상으로 처리함
+ } else if (status >= 200 && status <= 207) {
if (useAdapterToken && StringUtils.equals(tokenErrorHttpStatusCode, "200")) {
needReissue = checkTokenRetry(responseMessage, tokenErrorCodeKey, tokenErrorCodeValues,
vo.getEncode());
@@ -497,7 +521,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
"http receive status fail value=%d adapterName=%s.%s uri=%s method=%s response Data=%s",
status, vo.getAdapterGroupName(), vo.getAdapterName(), uri, rmethod, responseString);
// logger.error(errMsg);
-
+
if (status >= 400 && status < 500) {
if (useAdapterToken) {
needReissue = checkTokenRetry(responseMessage, tokenErrorCodeKey, tokenErrorCodeValues,
@@ -508,7 +532,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
throw new Exception(errMsg);
}
} else {
-
+
throw new Exception(errMsg);
}
}
@@ -592,6 +616,13 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
"RECV [" + new String(responseMessage, vo.getEncode()) + "]"
+ CommonLib.getDumpMessage(responseMessage));
}
+
+ String jsonStr = new String(responseMessage, vo.getEncode());
+
+ if ( jsonStr.trim().startsWith("[") ) {
+ jsonStr = KJB_ROOTLESS_ARRAY + jsonStr + "}";
+ responseMessage = jsonStr.getBytes(vo.getEncode());
+ }
return assignResponseHeaders(method, responseMessage, headerGroupName, vo.getEncode(), messageType,
@@ -640,7 +671,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
if (responseHeaders == null || responseHeaders.length == 0) {
return headerProp;
}
-
+
for (Header header : responseHeaders) {
headerProp.put(header.getName(), header.getValue());
}
@@ -650,7 +681,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
/**
* 현재 1단계 레이아웃에만 적용되도록 구현됨.
- *
+ *
* @param method
* @param responseMessage
* @param headerGroupName
@@ -662,7 +693,7 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
*/
@SuppressWarnings("unchecked")
private String assignResponseHeaders(HttpUriRequestBase method, byte[] responseMessage, String headerGroupName,
- String encode, String messageType, String relayHeaderKeys, int status, Properties responseHeaderProp) throws Exception {
+ String encode, String messageType, String relayHeaderKeys, int status, Properties responseHeaderProp) throws Exception {
if (!MessageType.JSON.equals(messageType) || StringUtils.isBlank(headerGroupName)
|| StringUtils.isBlank(relayHeaderKeys)) {
return new String(responseMessage, encode);
@@ -708,40 +739,41 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
method.setHeader("Authorization",
String.format("%s %s", AccessTokenVO.BEARER_TYPE, accessToken.getAccessToken()));
}
-
- /* nice on 나이스 지키미 용으로 생성함
+
+ /* nice on 나이스 지키미 용으로 생성함
* jwhong 2015-11-04
*/
private void setNiceOnAuthHeaders(HttpUriRequestBase method, String auth) throws Exception {
- method.setHeader("Authorization",
- String.format("%s %s", AccessTokenVO.BEARER_TYPE, auth)); // 나이스지키미 format임
- method.setHeader("ProductID", "2303345072");
+ method.setHeader("Authorization",
+ String.format("%s %s", "bearer", auth)); // 나이스지키미 format임, bearer을 소문자로 보내야함
+ String productId = PropManager.getInstance().getProperty("NiceOnProperty","productId.value");
+ method.setHeader("ProductID", productId);
//method.setHeader("Authorization",
// String.format("%s %s", AccessTokenVO.BEARER_TYPE, accessToken.getAccessToken()));
}
- /* nice clientid 추출을 위하여 추가한 내용임. jwhong
- *
- */
- private String JwtClientIdExtractor(String inboundToken) {
+ /* nice clientid 추출을 위하여 추가한 내용임. jwhong
+ *
+ */
+ private String JwtClientIdExtractor(String inboundToken) {
- String tokenClientId ="";
- try {
- SignedJWT signedJWT = SignedJWT.parse(inboundToken);
- tokenClientId = (String) signedJWT.getJWTClaimsSet().getClaim(PAYLOAD_PARAM_NAME_CLIENT_ID);
+ String tokenClientId ="";
+ try {
+ SignedJWT signedJWT = SignedJWT.parse(inboundToken);
+ tokenClientId = (String) signedJWT.getJWTClaimsSet().getClaim(PAYLOAD_PARAM_NAME_CLIENT_ID);
} catch (Exception e) {
logger.error(e.getMessage());
tokenClientId = "";
}
-
- System.out.println("Token Client ID: " + tokenClientId);
- return tokenClientId;
- }
-
+ logger.debug("[ NICE Token Client ID ]" + tokenClientId);
+ return tokenClientId;
+
+ }
+
private boolean checkTokenRetry(byte[] responseMessage, String tokenErrorCodeKey, String tokenErrorCodeValues,
- String encode) {
+ String encode) {
if (responseMessage == null) {
return false;
}
@@ -770,43 +802,177 @@ public class HttpClient5AdapterServiceRest extends HttpClient5AdapterServiceSupp
return false;
}
- private void assignRequestHeaders(HttpUriRequestBase method, Object httpHeader) {
- if (httpHeader == null) {
+ private void assignRequestHeaders(HttpUriRequestBase method, Object httpHeader, Properties prop) {
+ if (httpHeader != null) {
+ if (httpHeader instanceof JSONObject) {
+ JSONObject jsonObject = (JSONObject) httpHeader;
+ for (Object key : jsonObject.keySet()) {
+ Object obj = jsonObject.get(key);
+ if ((obj instanceof JSONObject) || (obj instanceof JSONArray)) {
+ continue;
+ }
+
+ method.setHeader((String) key, (String) obj);
+
+ if (logger.isDebugEnabled()) {
+ logger.debug("Request Header :" + (String) key + "=[" + (String) obj + "]");
+ }
+
+ }
+ }
+ }
+ //전문에서 추출한 httpHeader값 외 어댑터에서 최종적으로 적용되도록,
+ String httpSettingJsonStr = prop.getProperty( HTTP_HEADER_SETTING );
+
+ if( StringUtils.isBlank(httpSettingJsonStr) )
+ {
+ if( logger.isInfoEnabled() ) {
+ logger.info("HTTP_HEADER_SETTING value is not JSONObject Type, skip.");
+ }
+
return;
}
-
- if (httpHeader instanceof JSONObject) {
- JSONObject jsonObject = (JSONObject) httpHeader;
- for (Object key : jsonObject.keySet()) {
- Object obj = jsonObject.get(key);
+
+ try {
+ JSONObject httpValues = (JSONObject) JSONValue.parse(httpSettingJsonStr);
+
+ for (Object key : httpValues.keySet()) {
+ Object obj = httpValues.get(key);
if ((obj instanceof JSONObject) || (obj instanceof JSONArray)) {
continue;
}
-
- method.setHeader((String) key, (String) obj);
-
+
+ method.setHeader((String) key, obj);
+
if (logger.isDebugEnabled()) {
logger.debug("Request Header :" + (String) key + "=[" + (String) obj + "]");
}
}
+
+ }catch (Exception e) {
+ logger.error("HTTP_HEADER_SETTING value is not JSONObject Type, skip.", e);
+ }
+
+ }
+
+ private void assignFilterHeaders(HttpUriRequestBase method, Properties tempProp) {
+ try {
+ Properties filterHeaders = (Properties)tempProp.get("FILTERHEADER");
+ if (filterHeaders != null){
+ for (Entry