This is an automated email from the ASF dual-hosted git repository.

zregvart pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/camel.git


The following commit(s) were added to refs/heads/master by this push:
     new 081474d  CAMEL-12855 - camel-swagger-java not honoring the 
x-forwarded-[host,proto,prefix] headers.
081474d is described below

commit 081474d7256cbbd9f041867e38115a85ab8daf0f
Author: Thiago Locatelli <thiago.locatellidasi...@transamerica.com>
AuthorDate: Fri Oct 5 08:56:09 2018 -0400

    CAMEL-12855 - camel-swagger-java not honoring the 
x-forwarded-[host,proto,prefix] headers.
---
 .../apache/camel/swagger/RestSwaggerProcessor.java |  2 +-
 .../apache/camel/swagger/RestSwaggerSupport.java   | 46 +++++++++++++++++++++-
 .../camel/swagger/servlet/RestSwaggerServlet.java  | 14 ++++++-
 3 files changed, 59 insertions(+), 3 deletions(-)

diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
index 5c284d6..91b4146 100644
--- 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerProcessor.java
@@ -116,7 +116,7 @@ public class RestSwaggerProcessor implements Processor {
                 if (!match) {
                     adapter.noContent();
                 } else {
-                    support.renderResourceListing(adapter, swaggerConfig, 
name, route, json, yaml, exchange.getContext().getClassResolver(), 
configuration);
+                    support.renderResourceListing(adapter, swaggerConfig, 
name, route, json, yaml, exchange.getIn().getHeaders(), 
exchange.getContext().getClassResolver(), configuration);
                 }
             }
         } catch (Exception e) {
diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
index c2e7890..7a90ab3 100644
--- 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/RestSwaggerSupport.java
@@ -35,6 +35,7 @@ import io.swagger.jaxrs.config.BeanConfig;
 import io.swagger.models.Contact;
 import io.swagger.models.Info;
 import io.swagger.models.License;
+import io.swagger.models.Scheme;
 import io.swagger.models.Swagger;
 import io.swagger.util.Yaml;
 import org.apache.camel.Exchange;
@@ -45,6 +46,8 @@ import org.apache.camel.spi.ClassResolver;
 import org.apache.camel.spi.RestConfiguration;
 import org.apache.camel.util.CamelVersionHelper;
 import org.apache.camel.util.EndpointHelper;
+import org.apache.camel.util.ObjectHelper;
+import org.apache.camel.util.URISupport;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
@@ -56,6 +59,11 @@ import static 
org.apache.camel.swagger.SwaggerHelper.clearVendorExtensions;
  * such as servlet/jetty/netty4-http to offer Swagger API listings with 
minimal effort.
  */
 public class RestSwaggerSupport {
+       
+    private static final String HEADER_X_FORWARDED_PREFIX = 
"X-Forwarded-Prefix";
+    private static final String HEADER_X_FORWARDED_HOST = "X-Forwarded-Host";
+    private static final String HEADER_X_FORWARDED_PROTO = "X-Forwarded-Proto";
+    private static final String HEADER_HOST = "Host";
 
     private static final Logger LOG = 
LoggerFactory.getLogger(RestSwaggerSupport.class);
     private RestSwaggerReader reader = new RestSwaggerReader();
@@ -194,7 +202,7 @@ public class RestSwaggerSupport {
     }
 
     public void renderResourceListing(RestApiResponseAdapter response, 
BeanConfig swaggerConfig, String contextId, String route, boolean json, boolean 
yaml,
-                                      ClassResolver classResolver, 
RestConfiguration configuration) throws Exception {
+            Map<String, Object> headers, ClassResolver classResolver, 
RestConfiguration configuration) throws Exception {
         LOG.trace("renderResourceListing");
 
         if (cors) {
@@ -209,6 +217,7 @@ public class RestSwaggerSupport {
 
                 // read the rest-dsl into swagger model
                 Swagger swagger = reader.read(rests, route, swaggerConfig, 
contextId, classResolver);
+                setupXForwardedHeaders(swagger, headers);
 
                 if (!configuration.isApiVendorExtension()) {
                     clearVendorExtensions(swagger);
@@ -228,6 +237,7 @@ public class RestSwaggerSupport {
 
                 // read the rest-dsl into swagger model
                 Swagger swagger = reader.read(rests, route, swaggerConfig, 
contextId, classResolver);
+                setupXForwardedHeaders(swagger, headers);
 
                 if (!configuration.isApiVendorExtension()) {
                     clearVendorExtensions(swagger);
@@ -345,4 +355,38 @@ public class RestSwaggerSupport {
         response.setHeader("Access-Control-Max-Age", maxAge);
     }
 
+    private void setupXForwardedHeaders(Swagger swagger, Map<String, Object> 
headers) {
+
+        String host = (String) headers.get(HEADER_HOST);
+        if(ObjectHelper.isNotEmpty(host)) {
+            swagger.setHost(host);
+        }
+
+        String forwardedPrefix = (String) 
headers.get(HEADER_X_FORWARDED_PREFIX);
+        if (ObjectHelper.isNotEmpty(forwardedPrefix)) {
+            String prefixedBasePath = "/" + 
URISupport.stripPrefix(forwardedPrefix, "/") +
+                    (!forwardedPrefix.endsWith("/") ? "/" : "") + 
URISupport.stripPrefix(swagger.getBasePath(), "/");
+            swagger.setBasePath(prefixedBasePath);
+        }
+
+        String forwardedHost = (String) headers.get(HEADER_X_FORWARDED_HOST);
+        if(ObjectHelper.isNotEmpty(forwardedHost)) {
+            swagger.setHost(forwardedHost);
+        }
+
+        String proto = (String) headers.get(HEADER_X_FORWARDED_PROTO);
+        if(ObjectHelper.isNotEmpty(proto)) {
+            String[] schemes = proto.split(",");
+            List<Scheme> schs = new ArrayList<>();
+            for(String scheme : schemes) {
+                String trimmedScheme = scheme.trim();
+                schs.add(Scheme.forValue(trimmedScheme));
+            }
+            swagger.setSchemes(schs);
+        }
+        else {
+            swagger.setSchemes(null);
+        }
+    }
+
 }
diff --git 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
index c784a8e..cf56047 100644
--- 
a/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
+++ 
b/components/camel-swagger-java/src/main/java/org/apache/camel/swagger/servlet/RestSwaggerServlet.java
@@ -209,7 +209,7 @@ public class RestSwaggerServlet extends HttpServlet {
                 if (!match) {
                     adapter.noContent();
                 } else {
-                    support.renderResourceListing(adapter, swaggerConfig, 
name, route, json, yaml, classResolver, new RestConfiguration());
+                    support.renderResourceListing(adapter, swaggerConfig, 
name, route, json, yaml, getHeaders(request), classResolver, new 
RestConfiguration());
                 }
             }
         } catch (Exception e) {
@@ -260,4 +260,16 @@ public class RestSwaggerServlet extends HttpServlet {
         return path;
     }
 
+    private Map<String, Object> getHeaders(HttpServletRequest request) {
+        Map<String, Object> headers = new HashMap<>();
+        @SuppressWarnings("unchecked")
+        Enumeration<String> headerNames = request.getHeaderNames();
+        if (headerNames != null) {
+            while (headerNames.hasMoreElements()) {
+                headers.put(headerNames.nextElement(), 
request.getHeader(headerNames.nextElement()));
+            }
+        }
+        return headers;
+    }
+
 }
\ No newline at end of file

Reply via email to