fix swagger issue
[sdc.git] / catalog-fe / src / main / java / org / openecomp / sdc / fe / servlets / FeProxyServlet.java
1 /*-
2  * ============LICENSE_START=======================================================
3  * SDC
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
10  * 
11  *      http://www.apache.org/licenses/LICENSE-2.0
12  * 
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=========================================================
19  */
20
21 package org.openecomp.sdc.fe.servlets;
22
23 import java.util.concurrent.TimeUnit;
24
25 import javax.servlet.http.HttpServletRequest;
26 import javax.servlet.http.HttpServletResponse;
27
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;
37 import org.slf4j.MDC;
38
39 import com.google.common.cache.Cache;
40 import com.google.common.cache.CacheBuilder;
41
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();
49
50
51         @Override
52         protected String rewriteTarget(HttpServletRequest request) {
53                 try {
54                         logFeRequest(request);
55                 } catch (Exception e) {
56                         FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Request");
57                         log.error("Unexpected FE request logging error :", e);
58                 }
59                 String originalUrl = request.getRequestURL().toString();
60                 String redirectedUrl = getModifiedUrl(request);
61
62                 log.debug("FeProxyServlet Redirecting request from: {} , to: {}", originalUrl, redirectedUrl);
63
64                 return redirectedUrl;
65         }
66
67         @Override
68         protected void onProxyResponseSuccess(HttpServletRequest request, HttpServletResponse proxyResponse, Response response) {
69                 try {
70                         logFeResponse(request, response);
71                 } catch (Exception e) {
72                         FeEcompErrorManager.getInstance().logFeHttpLoggingError("FE Response");
73                         log.error("Unexpected FE response logging error :", e);
74                 }
75                 super.onProxyResponseSuccess(request, proxyResponse, response);
76         }
77
78         private void logFeRequest(HttpServletRequest httpRequest) {
79
80                 MDC.clear();
81
82                 Long transactionStartTime = System.currentTimeMillis();
83                 // UUID - In FE, we are supposed to get the below header from UI.
84                 // We do not generate it if it's missing - BE does.
85                 String uuid = httpRequest.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
86                 String serviceInstanceID = httpRequest.getHeader(Constants.X_ECOMP_SERVICE_ID_HEADER);
87
88                 if (uuid != null && uuid.length() > 0) {
89                         // UserId for logging
90                         String userId = httpRequest.getHeader(Constants.USER_ID_HEADER);
91
92                         String remoteAddr = httpRequest.getRemoteAddr();
93                         String localAddr = httpRequest.getLocalAddr();
94
95                         mdcDataCache.put(uuid, new MdcData(serviceInstanceID, userId, remoteAddr, localAddr, transactionStartTime));
96
97                         updateMdc(uuid, serviceInstanceID, userId, remoteAddr, localAddr, null);
98                 }
99                 inHttpRequest(httpRequest);
100         }
101
102         private void logFeResponse(HttpServletRequest request, Response proxyResponse) {
103                 String uuid = request.getHeader(Constants.X_ECOMP_REQUEST_ID_HEADER);
104                 String transactionRoundTime = null;
105
106                 if (uuid != null) {
107                         MdcData mdcData = mdcDataCache.getIfPresent(uuid);
108                         if (mdcData != null) {
109                                 Long transactionStartTime = mdcData.getTransactionStartTime();
110                                 if (transactionStartTime != null) {// should'n ever be null, but
111                                                                                                         // just to be defensive
112                                         transactionRoundTime = Long.toString(System.currentTimeMillis() - transactionStartTime);
113                                 }
114                                 updateMdc(uuid, mdcData.getServiceInstanceID(), mdcData.getUserId(), mdcData.getRemoteAddr(), mdcData.getLocalAddr(), transactionRoundTime);
115                         }
116                 }
117                 outHttpResponse(proxyResponse);
118
119                 MDC.clear();
120         }
121
122         // Extracted for purpose of clear method name, for logback %M parameter
123         private void inHttpRequest(HttpServletRequest httpRequest) {
124                 log.info("{} {} {}", httpRequest.getMethod(), httpRequest.getRequestURI(), httpRequest.getProtocol());
125         }
126
127         // Extracted for purpose of clear method name, for logback %M parameter
128         private void outHttpResponse(Response proxyResponse) {
129                 log.info("SC=\"{}\"", proxyResponse.getStatus());
130         }
131
132         private void updateMdc(String uuid, String serviceInstanceID, String userId, String remoteAddr, String localAddr, String transactionStartTime) {
133                 MDC.put("uuid", uuid);
134                 MDC.put("serviceInstanceID", serviceInstanceID);
135                 MDC.put("userId", userId);
136                 MDC.put("remoteAddr", remoteAddr);
137                 MDC.put("localAddr", localAddr);
138                 MDC.put("timer", transactionStartTime);
139         }
140
141     private String getModifiedUrl(HttpServletRequest request) {
142                 Configuration config = getConfiguration(request);
143                 if (config == null) {
144                         log.error("failed to retrive configuration.");
145                         throw new RuntimeException("failed to read FE configuration");
146                 }
147                 String uri = request.getRequestURI();
148         String protocol;
149         String host;
150         String port;
151                 if (uri.contains(ONBOARDING_CONTEXT)){
152             uri = uri.replace("/sdc1/feProxy"+ONBOARDING_CONTEXT,ONBOARDING_CONTEXT);
153             protocol = config.getOnboarding().getProtocolBe();
154             host = config.getOnboarding().getHostBe();
155             port = config.getOnboarding().getPortBe().toString();
156                 }
157                 else if(uri.contains(DCAED_CONTEXT)){
158             uri = uri.replace("/sdc1/feProxy"+DCAED_CONTEXT,DCAED_CONTEXT);
159             protocol = config.getBeProtocol();
160             host = config.getBeHost();
161             if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
162                 port = config.getBeHttpPort().toString();
163             } else {
164                 port = config.getBeSslPort().toString();
165             }
166                 }
167                 else{
168                     uri = uri.replace("/sdc1/feProxy","/sdc2");
169             protocol = config.getBeProtocol();
170             host = config.getBeHost();
171             if (config.getBeProtocol().equals(BeProtocol.HTTP.getProtocolName())) {
172                 port = config.getBeHttpPort().toString();
173             } else {
174                 port = config.getBeSslPort().toString();
175             }
176
177                 }
178
179         String authority = getAuthority(host, port);
180         String queryString = getQueryString(request);
181         return  String.format(URL,protocol,authority,uri,queryString);
182
183
184
185
186
187         }
188
189
190
191     private Configuration getConfiguration(HttpServletRequest request) {
192                 return ((ConfigurationManager) request.getSession().getServletContext().getAttribute(Constants.CONFIGURATION_MANAGER_ATTR)).getConfiguration();
193         }
194
195     private String getAuthority(String host, String port) {
196         String authority;
197         if (port==null){
198             authority=host;
199         }
200         else{
201             authority=host+":"+port;
202         }
203         return authority;
204     }
205
206     private String getQueryString(HttpServletRequest request) {
207         String queryString = request.getQueryString();
208         if (queryString != null) {
209             queryString="?"+queryString;
210         }
211         else{
212             queryString="";
213         }
214         return queryString;
215     }
216 }