Add content-type header if missing 79/114779/1
authorDan Timoney <dtimoney@att.com>
Tue, 10 Nov 2020 21:49:04 +0000 (16:49 -0500)
committerDan Timoney <dtimoney@att.com>
Tue, 10 Nov 2020 21:49:04 +0000 (16:49 -0500)
Added new filter that inserts a Content-Type header (default value
application/json) if none is provided.

Change-Id: I4e06913851816448576aad35deb9a809a0dbcda7
Issue-ID: CCSDK-2977
Signed-off-by: Dan Timoney <dtimoney@att.com>
ms/sliboot/src/main/java/org/onap/ccsdk/apps/ms/sliboot/controllers/RestconfApiController.java
services/src/main/java/org/onap/ccsdk/apps/filters/ContentTypeFilter.java [new file with mode: 0644]

index f37fe13..4498184 100644 (file)
@@ -54,7 +54,7 @@ import java.util.*;
 @javax.annotation.Generated(value = "io.swagger.codegen.languages.SpringCodegen", date = "2020-02-20T12:50:11.207-05:00")
 
 @RestController
-@ComponentScan(basePackages = {"org.onap.ccsdk.apps.ms.sliboot.*", "org.onap.ccsdk.apps.services"})
+@ComponentScan(basePackages = {"org.onap.ccsdk.apps.ms.sliboot.*", "org.onap.ccsdk.apps.services", "org.onap.ccsdk.apps.filters"})
 @EntityScan("org.onap.ccsdk.apps.ms.sliboot.*")
 public class RestconfApiController implements ConfigApi, OperationalApi, OperationsApi {
 
diff --git a/services/src/main/java/org/onap/ccsdk/apps/filters/ContentTypeFilter.java b/services/src/main/java/org/onap/ccsdk/apps/filters/ContentTypeFilter.java
new file mode 100644 (file)
index 0000000..41c71a4
--- /dev/null
@@ -0,0 +1,89 @@
+package org.onap.ccsdk.apps.filters;
+
+import java.io.IOException;
+import java.util.Collections;
+import java.util.Enumeration;
+import java.util.LinkedList;
+import java.util.List;
+
+import javax.servlet.Filter;
+import javax.servlet.FilterChain;
+import javax.servlet.ServletException;
+import javax.servlet.ServletRequest;
+import javax.servlet.ServletResponse;
+import javax.servlet.http.HttpServletRequest;
+import javax.servlet.http.HttpServletRequestWrapper;
+
+import org.springframework.core.Ordered;
+import org.springframework.core.annotation.Order;
+import org.springframework.stereotype.Component;
+
+@Component
+@Order(Ordered.HIGHEST_PRECEDENCE)
+public class ContentTypeFilter implements Filter {
+
+    String DEFAULT_CONTENT_TYPE = "application/json";
+
+    @Override
+    public void doFilter(ServletRequest httpReq, ServletResponse httpResp, FilterChain chain)
+            throws IOException, ServletException {
+                String defaultContentType = System.getProperty("ccsdk.defaults.content-type", DEFAULT_CONTENT_TYPE);
+
+                chain.doFilter(new DefaultContentTypeHttpRequest((HttpServletRequest) httpReq, defaultContentType), httpResp);
+
+    }
+
+    private class DefaultContentTypeHttpRequest extends HttpServletRequestWrapper {
+        HttpServletRequest httpRequest;
+        String defaultContentType;
+        boolean hasContentType;
+
+        List<String> headerNames; 
+
+        public DefaultContentTypeHttpRequest(HttpServletRequest httpRequest, String defaultContentType) {
+            super(httpRequest);
+            this.httpRequest = httpRequest;
+            this.defaultContentType = defaultContentType;
+            headerNames = new LinkedList<String>();
+            Enumeration<String> headerNameEnum = httpRequest.getHeaderNames();
+            hasContentType = false;
+            while (headerNameEnum.hasMoreElements()) {
+                String curHeaderName = headerNameEnum.nextElement();
+                if ("Content-Type".equalsIgnoreCase(curHeaderName)) {
+                    hasContentType = true;
+                }
+                headerNames.add(curHeaderName);
+            }
+            if (!hasContentType) {
+                headerNames.add("Content-Type");
+            }
+
+        }
+
+        @Override
+        public String getHeader(String name) {
+            if (name.equalsIgnoreCase("Content-Type")) {
+                return getContentType();
+            } else {
+                return super.getHeader(name);
+            }
+        }
+
+        @Override
+        public Enumeration<String> getHeaderNames() {
+            return(Collections.enumeration(headerNames));
+        }
+
+        @Override
+        public String getContentType() {
+            if (hasContentType) {
+                return super.getContentType();
+            } else {
+                return defaultContentType;
+            }
+        }
+        
+    }
+    
+    
+}