Refactoring PortResolverImpl - simpler code and remove InitializingBean implementation.
This commit is contained in:
parent
5295d33000
commit
a4a7813ddb
|
@ -15,65 +15,58 @@
|
||||||
|
|
||||||
package org.springframework.security.util;
|
package org.springframework.security.util;
|
||||||
|
|
||||||
import org.springframework.beans.factory.InitializingBean;
|
|
||||||
|
|
||||||
import org.springframework.util.Assert;
|
import org.springframework.util.Assert;
|
||||||
|
|
||||||
import javax.servlet.ServletRequest;
|
import javax.servlet.ServletRequest;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Concrete implementation of {@link PortResolver} that obtains the port from
|
* Concrete implementation of {@link PortResolver} that obtains the port from <tt>ServletRequest.getServerPort()</tt>.
|
||||||
* <code>ServletRequest.getServerPort()</code>.<P>This class is capable of handling the IE bug which results in an
|
* <p>
|
||||||
|
* This class is capable of handling the IE bug which results in an
|
||||||
* incorrect URL being presented in the header subsequent to a redirect to a different scheme and port where the port
|
* incorrect URL being presented in the header subsequent to a redirect to a different scheme and port where the port
|
||||||
* is not a well-known number (ie 80 or 443). Handling involves detecting an incorrect response from
|
* is not a well-known number (ie 80 or 443). Handling involves detecting an incorrect response from
|
||||||
* <code>ServletRequest.getServerPort()</code> for the scheme (eg a HTTP request on 8443) and then determining the
|
* <code>ServletRequest.getServerPort()</code> for the scheme (eg a HTTP request on 8443) and then determining the
|
||||||
* real server port (eg HTTP request is really on 8080). The map of valid ports is obtained from the configured {@link
|
* real server port (eg HTTP request is really on 8080). The map of valid ports is obtained from the configured
|
||||||
* PortMapper}.</p>
|
* {@link PortMapper}.
|
||||||
*
|
*
|
||||||
* @author Ben Alex
|
* @author Ben Alex
|
||||||
* @version $Id$
|
* @version $Id$
|
||||||
*/
|
*/
|
||||||
public class PortResolverImpl implements InitializingBean, PortResolver {
|
public class PortResolverImpl implements PortResolver {
|
||||||
//~ Instance fields ================================================================================================
|
//~ Instance fields ================================================================================================
|
||||||
|
|
||||||
private PortMapper portMapper = new PortMapperImpl();
|
private PortMapper portMapper = new PortMapperImpl();
|
||||||
|
|
||||||
//~ Methods ========================================================================================================
|
//~ Methods ========================================================================================================
|
||||||
|
|
||||||
public void afterPropertiesSet() throws Exception {
|
|
||||||
Assert.notNull(portMapper, "portMapper required");
|
|
||||||
}
|
|
||||||
|
|
||||||
public PortMapper getPortMapper() {
|
public PortMapper getPortMapper() {
|
||||||
return portMapper;
|
return portMapper;
|
||||||
}
|
}
|
||||||
|
|
||||||
public int getServerPort(ServletRequest request) {
|
public int getServerPort(ServletRequest request) {
|
||||||
int result = request.getServerPort();
|
int serverPort = request.getServerPort();
|
||||||
|
Integer portLookup = null;
|
||||||
|
|
||||||
if ("http".equals(request.getScheme().toLowerCase())) {
|
String scheme = request.getScheme().toLowerCase();
|
||||||
Integer http = portMapper.lookupHttpPort(new Integer(result));
|
|
||||||
|
|
||||||
if (http != null) {
|
if ("http".equals(scheme)) {
|
||||||
// IE 6 bug
|
portLookup = portMapper.lookupHttpPort(Integer.valueOf(serverPort));
|
||||||
result = http.intValue();
|
|
||||||
}
|
} else if ("https".equals(scheme)) {
|
||||||
|
portLookup = portMapper.lookupHttpsPort(Integer.valueOf(serverPort));
|
||||||
}
|
}
|
||||||
|
|
||||||
if ("https".equals(request.getScheme().toLowerCase())) {
|
if (portLookup != null) {
|
||||||
Integer https = portMapper.lookupHttpsPort(new Integer(result));
|
// IE 6 bug
|
||||||
|
serverPort = portLookup.intValue();
|
||||||
if (https != null) {
|
|
||||||
// IE 6 bug
|
|
||||||
result = https.intValue();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return result;
|
return serverPort;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void setPortMapper(PortMapper portMapper) {
|
public void setPortMapper(PortMapper portMapper) {
|
||||||
|
Assert.notNull(portMapper, "portMapper cannot be null");
|
||||||
this.portMapper = portMapper;
|
this.portMapper = portMapper;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -39,17 +39,12 @@ public class PortResolverImplTests extends TestCase {
|
||||||
|
|
||||||
//~ Methods ========================================================================================================
|
//~ Methods ========================================================================================================
|
||||||
|
|
||||||
public static void main(String[] args) {
|
|
||||||
junit.textui.TestRunner.run(PortResolverImplTests.class);
|
|
||||||
}
|
|
||||||
|
|
||||||
public final void setUp() throws Exception {
|
public final void setUp() throws Exception {
|
||||||
super.setUp();
|
super.setUp();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDetectsBuggyIeHttpRequest() throws Exception {
|
public void testDetectsBuggyIeHttpRequest() throws Exception {
|
||||||
PortResolverImpl pr = new PortResolverImpl();
|
PortResolverImpl pr = new PortResolverImpl();
|
||||||
pr.afterPropertiesSet();
|
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
request.setServerPort(8443);
|
request.setServerPort(8443);
|
||||||
|
@ -59,7 +54,6 @@ public class PortResolverImplTests extends TestCase {
|
||||||
|
|
||||||
public void testDetectsBuggyIeHttpsRequest() throws Exception {
|
public void testDetectsBuggyIeHttpsRequest() throws Exception {
|
||||||
PortResolverImpl pr = new PortResolverImpl();
|
PortResolverImpl pr = new PortResolverImpl();
|
||||||
pr.afterPropertiesSet();
|
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
request.setServerPort(8080);
|
request.setServerPort(8080);
|
||||||
|
@ -69,10 +63,9 @@ public class PortResolverImplTests extends TestCase {
|
||||||
|
|
||||||
public void testDetectsEmptyPortMapper() throws Exception {
|
public void testDetectsEmptyPortMapper() throws Exception {
|
||||||
PortResolverImpl pr = new PortResolverImpl();
|
PortResolverImpl pr = new PortResolverImpl();
|
||||||
pr.setPortMapper(null);
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
pr.afterPropertiesSet();
|
pr.setPortMapper(null);
|
||||||
fail("Should have thrown IllegalArgumentException");
|
fail("Should have thrown IllegalArgumentException");
|
||||||
} catch (IllegalArgumentException expected) {
|
} catch (IllegalArgumentException expected) {
|
||||||
assertTrue(true);
|
assertTrue(true);
|
||||||
|
@ -88,7 +81,6 @@ public class PortResolverImplTests extends TestCase {
|
||||||
|
|
||||||
public void testNormalOperation() throws Exception {
|
public void testNormalOperation() throws Exception {
|
||||||
PortResolverImpl pr = new PortResolverImpl();
|
PortResolverImpl pr = new PortResolverImpl();
|
||||||
pr.afterPropertiesSet();
|
|
||||||
|
|
||||||
MockHttpServletRequest request = new MockHttpServletRequest();
|
MockHttpServletRequest request = new MockHttpServletRequest();
|
||||||
request.setScheme("http");
|
request.setScheme("http");
|
||||||
|
|
Loading…
Reference in New Issue