diff options
author | Ittay Stern <ittay.stern@att.com> | 2019-09-19 13:10:26 +0300 |
---|---|---|
committer | Ittay Stern <ittay.stern@att.com> | 2019-09-19 14:28:08 +0300 |
commit | 2be2e77d30a3cd547c1a37fb2f280b5fabf1ecd6 (patch) | |
tree | eaba9dc69dca7777dc6c6ac0e12b8ff26fa643f1 /vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java | |
parent | 497e040b5569b0b0139a5cbc8115a63bc7f99244 (diff) |
Rename PromiseRequestIdFilter, extract isWrapNeeded and incomingRequestId methods
Change-Id: Idb39f7d5e723598e34e737522c4f73d8de3df93c
Issue-ID: VID-253
Signed-off-by: Ittay Stern <ittay.stern@att.com>
Diffstat (limited to 'vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java')
-rw-r--r-- | vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java | 131 |
1 files changed, 131 insertions, 0 deletions
diff --git a/vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java b/vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java new file mode 100644 index 000000000..c6b18785a --- /dev/null +++ b/vid-app-common/src/main/java/org/onap/vid/controller/filter/PromiseRequestIdFilter.java @@ -0,0 +1,131 @@ +/*- + * ============LICENSE_START======================================================= + * VID + * ================================================================================ + * Copyright (C) 2017 - 2019 AT&T Intellectual Property. All rights reserved. + * ================================================================================ + * 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. + * ============LICENSE_END========================================================= + */ + +package org.onap.vid.controller.filter; + + +import static org.onap.portalsdk.core.util.SystemProperties.ECOMP_REQUEST_ID; + +import com.google.common.collect.ImmutableList; +import java.io.IOException; +import java.util.Collections; +import java.util.Enumeration; +import java.util.UUID; +import java.util.regex.Pattern; +import javax.servlet.FilterChain; +import javax.servlet.ServletException; +import javax.servlet.ServletRequest; +import javax.servlet.ServletResponse; +import javax.servlet.annotation.WebFilter; +import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpServletRequestWrapper; +import javax.servlet.http.HttpServletResponse; +import org.apache.commons.lang3.StringUtils; +import org.springframework.web.filter.GenericFilterBean; + +@WebFilter(urlPatterns = "/*") +public class PromiseRequestIdFilter extends GenericFilterBean { + + private static final String REQUEST_ID_RESPONSE_HEADER = ECOMP_REQUEST_ID + "-echo"; + + private static final Pattern uuidRegex = Pattern.compile("[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}"); + + @Override + public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) + throws IOException, ServletException { + + if (request instanceof HttpServletRequest) { + request = wrapIfNeeded(request); + + if (response instanceof HttpServletResponse) { + final String actualRequestId = ((HttpServletRequest) request).getHeader(ECOMP_REQUEST_ID); + ((HttpServletResponse) response).addHeader(REQUEST_ID_RESPONSE_HEADER, actualRequestId); + } + } + + chain.doFilter(request, response); + } + + public ServletRequest wrapIfNeeded(ServletRequest request) { + final HttpServletRequest httpRequest = (HttpServletRequest) request; + final String originalRequestId = incomingRequestId(httpRequest); + + if (isWrapNeeded(originalRequestId)) { + request = new PromiseRequestIdRequestWrapper(httpRequest); + } + + return request; + } + + private boolean verifyAndValidateUuid(String value) { + return uuidRegex.matcher(value).matches(); + } + + protected boolean isWrapNeeded(String originalRequestId) { + return StringUtils.isEmpty(originalRequestId) + || !verifyAndValidateUuid(originalRequestId); + } + + protected String incomingRequestId(HttpServletRequest httpRequest) { + return httpRequest.getHeader(ECOMP_REQUEST_ID); + } + + private static class PromiseRequestIdRequestWrapper extends HttpServletRequestWrapper { + + private final UUID requestId; + + PromiseRequestIdRequestWrapper(HttpServletRequest request) { + super(request); + requestId = UUID.randomUUID(); + } + + @Override + public String getHeader(String name) { + return isRequestIdHeaderName(name) ? + requestId.toString() : super.getHeader(name); + } + + @Override + public Enumeration<String> getHeaders(String name) { + if (isRequestIdHeaderName(name)) { + return Collections.enumeration(Collections.singleton(requestId.toString())); + } else { + return super.getHeaders(name); + } + } + + @Override + public Enumeration<String> getHeaderNames() { + + if (null == super.getHeader(ECOMP_REQUEST_ID)) { + return Collections.enumeration(ImmutableList.<String>builder() + .add(ECOMP_REQUEST_ID) + .addAll(Collections.list(super.getHeaderNames())) + .build()); + } + + return super.getHeaderNames(); + } + + private boolean isRequestIdHeaderName(String name) { + return ECOMP_REQUEST_ID.equalsIgnoreCase(name); + } + } +} |