2 * ============LICENSE_START=======================================================
4 * ================================================================================
5 * Copyright (C) 2017 AT&T Intellectual Property. All rights reserved.
6 * ================================================================================
7 * Licensed under the Apache License, Version 2.0 (the "License");
8 * you may not use this file except in compliance with the License.
9 * You may obtain a copy of the License at
11 * http://www.apache.org/licenses/LICENSE-2.0
13 * Unless required by applicable law or agreed to in writing, software
14 * distributed under the License is distributed on an "AS IS" BASIS,
15 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16 * See the License for the specific language governing permissions and
17 * limitations under the License.
18 * ============LICENSE_END=========================================================
21 package org.openecomp.sdc.fe.servlets;
23 import java.util.concurrent.TimeUnit;
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
28 import org.eclipse.jetty.client.api.Response;
29 import org.openecomp.sdc.common.api.Constants;
30 import org.openecomp.sdc.fe.config.Configuration;
31 import org.openecomp.sdc.fe.config.ConfigurationManager;
32 import org.openecomp.sdc.fe.config.FeEcompErrorManager;
33 import org.openecomp.sdc.fe.mdc.MdcData;
34 import org.openecomp.sdc.fe.utils.BeProtocol;
35 import org.slf4j.Logger;
36 import org.slf4j.LoggerFactory;
39 import com.google.common.cache.Cache;
40 import com.google.common.cache.CacheBuilder;
42 public class FeProxyServlet extends SSLProxyServlet {
43 private static final long serialVersionUID = 1L;
44 private static final String URL = "%s://%s%s%s";
45 private static final String ONBOARDING_CONTEXT = "/onboarding-api";
46 private static final String DCAED_CONTEXT = "/dcae-api";
47 private static final Logger log = LoggerFactory.getLogger(FeProxyServlet.class.getName());
48 private static Cache<String, MdcData> mdcDataCache = CacheBuilder.newBuilder().expireAfterWrite(10, TimeUnit.SECONDS).build();
51 // public URI rewriteURI(HttpServletRequest request) {
53 // logFeRequest(request);
54 // } catch (Exception e) {
55 // FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
56 // log.error("Unexpected FE request logging error :", e);
58 // String originalUrl = request.getRequestURL().toString();
59 // String redirectedUrl = getModifiedUrl(request);
61 // log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
63 // return URI.create(redirectedUrl);
67 protected String rewriteTarget(HttpServletRequest request) {
69 logFeRequest(request);
70 } catch (Exception e) {
71 FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
72 log.error("Unexpected FE request logging error :", e);
74 String originalUrl = request.getRequestURL().toString();
75 String redirectedUrl = getModifiedUrl(request);
77 log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
83 // protected void onResponseSuccess(HttpServletRequest request, HttpServletResponse response, Response proxyResponse) {
85 // logFeResponse(request, proxyResponse);
86 // } catch (Exception e) {
87 // FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
88 // log.error("Unexpected FE response logging error :", e);
90 // super.onResponseSuccess(request, response, proxyResponse);
92 //protected void onProxyResponseSuccess(HttpServletRequest clientRequest, HttpServletResponse proxyResponse, Response serverResponse) {
94 protected void onProxyResponseSuccess(HttpServletRequest request, HttpServletResponse proxyResponse, Response response) {
96 logFeResponse(request, response);
97 } catch (Exception e) {
98 FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
99 log.error("Unexpected FE response logging error :", e);
101 super.onProxyResponseSuccess(request, proxyResponse, response);
104 private void logFeRequest(HttpServletRequest httpRequest) {
108 Long transactionStartTime = System.currentTimeMillis();
109 // UUID - In FE, we are supposed to get the below header from UI.
110 // We do not generate it if it's missing - BE does.
111 String uuid = httpRequest.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
112 String serviceInstanceID = httpRequest.getHeader(Constants.X_ECOMP_SERVICE_ID_HEADER);
114 if (uuid != null && uuid.length() > 0) {
115 // UserId for logging
116 String userId = httpRequest.getHeader(Constants.USER_ID_HEADER);
118 String remoteAddr = httpRequest.getRemoteAddr();
119 String localAddr = httpRequest.getLocalAddr();
121 mdcDataCache.put(uuid, new MdcData(serviceInstanceID, userId, remoteAddr, localAddr, transactionStartTime));
123 updateMdc(uuid, serviceInstanceID, userId, remoteAddr, localAddr, null);
125 inHttpRequest(httpRequest);
128 private void logFeResponse(HttpServletRequest request, Response proxyResponse) {
129 String uuid = request.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
130 String transactionRoundTime = null;
133 MdcData mdcData = mdcDataCache.getIfPresent(uuid);
134 if (mdcData != null) {
135 Long transactionStartTime = mdcData.getTransactionStartTime();
136 if (transactionStartTime != null) {// should'n ever be null, but
137 // just to be defensive
138 transactionRoundTime = Long.toString(System.currentTimeMillis() - transactionStartTime);
140 updateMdc(uuid, mdcData.getServiceInstanceID(), mdcData.getUserId(), mdcData.getRemoteAddr(), mdcData.getLocalAddr(), transactionRoundTime);
143 outHttpResponse(proxyResponse);
148 // Extracted for purpose of clear method name, for logback %M parameter
149 private void inHttpRequest(HttpServletRequest httpRequest) {
150 log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol());
153 // Extracted for purpose of clear method name, for logback %M parameter
154 private void outHttpResponse(Response proxyResponse) {
155 log.info("SC=\"{}\"", proxyResponse.getStatus());
158 private void updateMdc(String uuid, String serviceInstanceID, String userId, String remoteAddr, String localAddr, String transactionStartTime) {
159 MDC.put("uuid", uuid);
160 MDC.put("serviceInstanceID", serviceInstanceID);
161 MDC.put("userId", userId);
162 MDC.put("remoteAddr", remoteAddr);
163 MDC.put("localAddr", localAddr);
164 MDC.put("timer", transactionStartTime);
167 private String getModifiedUrl(HttpServletRequest request) {
168 Configuration config = getConfiguration(request);
169 if (config == null) {
170 log.error("failed to retrive configuration.");
171 throw new RuntimeException("failed to read FE configuration");
173 String uri = request.getRequestURI();
177 if (uri.contains(ONBOARDING_CONTEXT)){
178 uri = uri.replace("/sdc1/feProxy"+ONBOARDING_CONTEXT,ONBOARDING_CONTEXT);
179 protocol = config.getOnboarding().getProtocolBe();
180 host = config.getOnboarding().getHostBe();
181 port = config.getOnboarding().getPortBe().toString();
183 else if(uri.contains(DCAED_CONTEXT)){
184 uri = uri.replace("/sdc1/feProxy"+DCAED_CONTEXT,DCAED_CONTEXT);
185 protocol = config.getBeProtocol();
186 host = config.getBeHost();
187 if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
188 port = config.getBeHttpPort().toString();
190 port = config.getBeSslPort().toString();
194 uri = uri.replace("/sdc1/feProxy","/sdc2");
195 protocol = config.getBeProtocol();
196 host = config.getBeHost();
197 if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
198 port = config.getBeHttpPort().toString();
200 port = config.getBeSslPort().toString();
205 String authority = getAuthority(host, port);
206 String queryString = getQueryString(request);
207 return String.format(URL,protocol,authority,uri,queryString);
212 // String scheme = config.getBeProtocol();
213 // String uri = request.getRequestURI().toString();
214 // StringBuilder url = new StringBuilder();
215 // url.append(scheme).append("://").append(config.getBeHost());
217 // if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
218 // url.append(config.getBeHttpPort());
220 // url.append(config.getBeSslPort());
223 // String queryString = request.getQueryString(); // d=789
224 // if (queryString != null) {
225 // url.append("?").append(queryString);
228 // String redirectedUrl = url.toString();
229 // String onboardingForwardContext = config.getOnboardingForwardContext();
230 // if (onboardingForwardContext == null || onboardingForwardContext.isEmpty()) {
231 // onboardingForwardContext = "/onboarding-api";
233 // redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/dcae-api", "/dcae");
234 // redirectedUrl = redirectedUrl.replace("/sdc1/feProxy/onboarding-api", onboardingForwardContext);
235 // redirectedUrl = redirectedUrl.replace("/sdc1/feProxy", "/sdc2");
236 // return redirectedUrl;
242 private Configuration getConfiguration(HttpServletRequest request) {
243 return ((ConfigurationManager) request.getSession().getServletContext().getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).getConfiguration();
246 private String getAuthority(String host, String port) {
252 authority=host+":"+port;
257 private String getQueryString(HttpServletRequest request) {
258 String queryString = request.getQueryString();
259 if (queryString != null) {
260 queryString="?"+queryString;