FELIX-4657 : HTTP SSLFilter wrong port. Apply patch from Antonio Sanso

git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1628674 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterRequest.java b/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterRequest.java
index d0c2289..75d8ac5 100644
--- a/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterRequest.java
+++ b/http/sslfilter/src/main/java/org/apache/felix/http/sslfilter/internal/SslFilterRequest.java
@@ -19,6 +19,7 @@
 package org.apache.felix.http.sslfilter.internal;
 
 import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.ATTR_SSL_CERTIFICATE;
+import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_X_FORWARDED_PORT;
 import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HTTPS;
 import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.UTF_8;
 import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.X_509;
@@ -100,4 +101,21 @@
         }
         return tmp;
     }
+    
+    public int getServerPort() 
+    {
+        int port;
+        
+        try
+        {            
+            String fwdPort = getHeader(HDR_X_FORWARDED_PORT);
+            port = Integer.valueOf(fwdPort);
+        }
+        catch (Exception e)
+        {
+            // Use default port for the used protocol...
+            port = -1;
+        }
+        return port;
+    }    
 }
diff --git a/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterRequestTest.java b/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterRequestTest.java
index c079a84..325b109 100644
--- a/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterRequestTest.java
+++ b/http/sslfilter/src/test/java/org/apache/felix/http/sslfilter/internal/SslFilterRequestTest.java
@@ -21,6 +21,7 @@
 import static junit.framework.Assert.assertEquals;
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertTrue;
+import static org.apache.felix.http.sslfilter.internal.SslFilterConstants.HDR_X_FORWARDED_PORT;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
@@ -81,4 +82,33 @@
         assertEquals("https://some/page", sreq.getRequestURL().toString());
         assertEquals("https://some/page", req.getRequestURL().toString());
     }
+    
+    @Test
+    public void test_getServerPort() throws Exception
+    {
+        HttpServletRequest req = Mockito.mock(HttpServletRequest.class);
+        SslFilterRequest sreq = new SslFilterRequest(req, null);
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn(null);        
+        assertEquals(-1, sreq.getServerPort());
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn("");        
+        assertEquals(-1, sreq.getServerPort());
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn("WRONG");        
+        assertEquals(-1, sreq.getServerPort());
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn("W1");        
+        assertEquals(-1, sreq.getServerPort());
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn("443");        
+        assertEquals(443, sreq.getServerPort());
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn("80");        
+        assertEquals(80, sreq.getServerPort());
+        
+        when(req.getHeader(HDR_X_FORWARDED_PORT)).thenReturn("4502");        
+        assertEquals(4502, sreq.getServerPort());
+        
+    }
 }