[ 
https://issues.apache.org/jira/browse/CAMEL-12855?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=16640259#comment-16640259
 ] 

ASF GitHub Bot commented on CAMEL-12855:
----------------------------------------

zregvart closed pull request #2554: CAMEL-12855 - camel-swagger-java not 
honoring the x-forwarded-[host,proto,prefix] headers.
URL: https://github.com/apache/camel/pull/2554
 
 
   

This is a PR merged from a forked repository.
As GitHub hides the original diff on merge, it is displayed below for
the sake of provenance:

As this is a foreign pull request (from a fork), the diff is supplied
below (as it won't show otherwise due to GitHub magic):

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 5c284d6e1bb..91b41469db8 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 void process(Exchange exchange) throws Exception {
                 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 c2e78909261..7a90ab3f2b6 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.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.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 @@
  * 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 void initSwagger(BeanConfig swaggerConfig, 
Map<String, Object> config) {
     }
 
     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 void renderResourceListing(RestApiResponseAdapter 
response, BeanConfig sw
 
                 // 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 void renderResourceListing(RestApiResponseAdapter 
response, BeanConfig sw
 
                 // 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 @@ private static void 
setupCorsHeaders(RestApiResponseAdapter response, Map<String
         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 c784a8e5560..cf56047e58f 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 @@ protected void doGet(HttpServletRequest request, 
HttpServletResponse response) t
                 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 @@ private String translateContextPath(HttpServletRequest 
request) {
         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


 

----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on GitHub and use the
URL above to go to the specific comment.
 
For queries about this service, please contact Infrastructure at:
[email protected]


> camel-swagger-java not honoring the x-forwarded-[host,proto,prefix] headers.
> ----------------------------------------------------------------------------
>
>                 Key: CAMEL-12855
>                 URL: https://issues.apache.org/jira/browse/CAMEL-12855
>             Project: Camel
>          Issue Type: New Feature
>          Components: camel-swagger
>    Affects Versions: 2.22.1
>            Reporter: Thiago Locatelli
>            Assignee: Zoran Regvart
>            Priority: Major
>
> We have a camel spring boot application sitting behind an api gateway with a 
> Swagger page for accessing the documentation for all of our services (created 
> with Spring Boot and Zuul Proxy, Consul as service discovery). The Swagger 
> gateway sends three headers to the camel application to retrieve the swagger 
> docs, but camel-swagger-java is not honoring those headers, thus the 
> attributes host, basePath and schemes remain the same as if the swagger 
> documentation was being acessed directly.
> Example, when trying to get the swagger docs for our customer-service camel 
> application:
> [https://api-gateway.dev-internal.io/api-gateway/customer-service/v2/api-docs]
>  
> {code:java}
> x-forwarded-prefix: /api-gateway/
> x-forwarded-host: api-gateway.dev-internal.io
> x-forwarded-proto: https,http{code}
>  
> The expected results should be
> {code:java}
> {
>     "swagger": "2.0",
>     ...
>     "host": "api-gateway.dev-internal.io",
>     "basePath": "/api-gateway/customer-service",
>     "schemes": [ "https", "http" ]
>     ...
> }{code}
> Current results:
> {code:java}
> {
>     "swagger": "2.0",
>     ...
>     "host": "",
>     "basePath": "/customer-service",
>     "schemes": [ "http" ]
>     ...
> }{code}
>  
> we had a simple solution, which might not be the correct one. We changed the 
> RestSwaggerSupport.java:
>  
> {code:java}
> public class RestSwaggerSupport {
>     private static final String X_FORWARDED_PREFIX = "X-Forwarded-Prefix";    
>  
>     private static final String X_FORWARDED_HOST = "X-Forwarded-Host";
>     public void renderResourceListing(RestApiResponseAdapter response, 
> BeanConfig swaggerConfig, String contextId, String route, boolean json, 
> boolean yaml, Exchange exchange, ClassResolver classResolver, 
> RestConfiguration configuration, String prefix) throws Exception {
>     ...
>         Swagger swagger = reader.read(rests, route, swaggerConfig, contextId, 
> exchange == null ? classResolver : exchange.getContext().getClassResolver()); 
>   
>         setupXForwardedHeaders(swagger, exchange);
>     ...
>     }
>     private void setupXForwardedHeaders(Swagger swagger, Exchange exchange) {
>         if (exchange.getIn().getHeaders().containsKey(X_FORWARDED_PREFIX)) {
>             String prefix = exchange.getIn().getHeader(X_FORWARDED_PREFIX, 
> String.class);
>             prefix = prefix.replace("/", "");
>             if (prefix != null) {
>                 String path = swagger.getBasePath();
>                 path = "/" + prefix + path;
>                 swagger.setBasePath(path);
>             }
>         }
>         if(exchange.getIn().getHeaders().containsKey(X_FORWARDED_HOST)) {
>             String host = exchange.getIn().getHeader(X_FORWARDED_HOST, 
> String.class);
>             if(host != null && host.length() > 0) {
>                 swagger.setHost(host);
>             }
>         }
>     ...
> }
> {code}
>  
> If this is a valid approach, I will submit a PR. 
>  
>  



--
This message was sent by Atlassian JIRA
(v7.6.3#76005)

Reply via email to