@SuppressWarnings("unchecked") @Test public void asElevatedRequestShouldPropagateSubjectAndLoginContext() throws Exception { final DefaultHttpSession session = context.mock(DefaultHttpSession.class, "session"); Subject subject = new Subject(); final ResultAwareLoginContext loginContext = context.mock(ResultAwareLoginContext.class, "loginContext"); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); final URI requestURI = URI.create("/path/;e/cte"); expectedRequest.setRequestURI(requestURI); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOf(session).getVersion(); will(returnValue(HTTP_1_1)); oneOf(session).getMethod(); will(returnValue(POST)); oneOf(session).getParameters(); oneOf(session).getRequestURI(); will(returnValue(requestURI)); oneOf(session).isSecure(); oneOf(session).getReadCookies(); oneOf(session).getReadHeader("Content-Length"); will(returnValue(null)); allowing(session).getReadHeaders(); will(returnValue(new HashMap<String, List<String>>())); oneOf(session).getSubject(); will(returnValue(subject)); oneOf(session).getLoginContext(); will(returnValue(loginContext)); oneOf(session).setReadHeaders(with(any(HashMap.class))); } }); HttpRequestMessage request = HttpElevateEmulatedRequestFilter.asElevatedRequest(session); assertSame(subject, request.getSubject()); assertSame(loginContext, request.getLoginContext()); context.assertIsSatisfied(); }
public class HttpProtocolCompatibilityFilterTest { private Mockery context = new Mockery() { { setImposteriser(ClassImposteriser.INSTANCE); } }; private HttpAcceptSession serverSession = context.mock(HttpAcceptSession.class); private DefaultIoFilterChain filterChain = context.mock(DefaultIoFilterChain.class); private NextFilter nextFilter = context.mock(NextFilter.class); private ResourceAddress localAddress = context.mock(ResourceAddress.class); @Test public void shouldRemoveRandomNumberQueryParam() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(GET); expectedRequest.setRequestURI(URI.create("/path?param=value")); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(GET); httpRequest.setRequestURI(URI.create("/path?param=value&.krn=12345")); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldRemoveValidHttpVersionHeader() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); expectedRequest.setRequestURI(URI.create("/path")); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(URI.create("/path")); httpRequest.setHeader("X-Http-Version", "httpe-1.0"); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldRejectInvalidHttpVersionHeader() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpResponseMessage expectedResponse = new HttpResponseMessage(); expectedResponse.setVersion(HTTP_1_1); expectedResponse.setStatus(SERVER_NOT_IMPLEMENTED); expectedResponse.setReason("Http-Version not supported"); final HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(URI.create("/path")); httpRequest.setHeader("X-Http-Version", "unrecognized"); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, httpRequest); oneOf(nextFilter).filterWrite(with(serverSession), with(hasMessage(expectedResponse))); oneOf(nextFilter).filterClose(with(serverSession)); } }); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldNotRejectMissingHttpVersionHeader() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); expectedRequest.setRequestURI(URI.create("/path")); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(URI.create("/path")); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldNotRejectRedundantHttpVersionHeader() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); expectedRequest.setRequestURI(URI.create("/path")); expectedRequest.setHeader("X-Http-Version", "unrecognized"); expectedRequest.setHeader("X-Next-Protocol", "explicit"); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(URI.create("/path")); httpRequest.setHeader("X-Http-Version", "unrecognized"); httpRequest.setHeader("X-Next-Protocol", "explicit"); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldNotOverrideNextProtocolBasedOnXOriginHeader() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); expectedRequest.setRequestURI(URI.create("/path")); expectedRequest.setHeader("X-Next-Protocol", "other"); expectedRequest.setHeader("X-Origin", "http://localhost:8000"); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(URI.create("/path")); httpRequest.setHeader("X-Next-Protocol", "other"); httpRequest.setHeader("X-Origin", "http://localhost:8000"); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldNotOverrideNextProtocolBasedOnOriginQueryParam() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); expectedRequest.setRequestURI(URI.create("/path?.ko=http://localhost:8000")); expectedRequest.setHeader("X-Next-Protocol", "other"); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(URI.create("/path?.ko=http://localhost:8000")); httpRequest.setHeader("X-Next-Protocol", "other"); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldDeriveCreateEncodingFromCreateBinaryPathExtension() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); final URI requestURI = URI.create("/path/;e/cb"); expectedRequest.setRequestURI(requestURI); expectedRequest.setHeader("X-Create-Encoding", "binary"); expectedRequest.setHeader("X-Next-Protocol", "wse/1.0"); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); allowing(localAddress).getResource(); will(returnValue(requestURI)); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(requestURI); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldDeriveCreateEncodingFromCreateTextPathExtension() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); final URI requestURI = URI.create("/path/;e/ct"); expectedRequest.setRequestURI(requestURI); expectedRequest.setHeader("X-Create-Encoding", "text"); expectedRequest.setHeader("X-Next-Protocol", "wse/1.0"); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); allowing(localAddress).getResource(); will(returnValue(requestURI)); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(requestURI); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @Test public void shouldDeriveCreateEncodingFromCreateTextEscapedPathExtension() throws Exception { context.setThreadingPolicy(new Synchroniser()); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); final URI requestURI = URI.create("/path/;e/cte"); expectedRequest.setRequestURI(requestURI); expectedRequest.setHeader("X-Create-Encoding", "text-escaped"); expectedRequest.setHeader("X-Next-Protocol", "wse/1.0"); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOfUnconditionalWrappedResponseRequiredCheck(this); oneOfIsEmulatedWebSocketRequest(this, expectedRequest); allowing(localAddress).getResource(); will(returnValue(requestURI)); oneOf(nextFilter).messageReceived(with(serverSession), with(equal(expectedRequest))); } }); HttpRequestMessage httpRequest = new HttpRequestMessage(); httpRequest.setVersion(HTTP_1_1); httpRequest.setMethod(POST); httpRequest.setRequestURI(requestURI); httpRequest.setContent(EMPTY); HttpProtocolCompatibilityFilter filter = new HttpProtocolCompatibilityFilter(); filter.messageReceived(nextFilter, serverSession, httpRequest); context.assertIsSatisfied(); } @SuppressWarnings("unchecked") @Test public void asElevatedRequestShouldPropagateSubjectAndLoginContext() throws Exception { final DefaultHttpSession session = context.mock(DefaultHttpSession.class, "session"); Subject subject = new Subject(); final ResultAwareLoginContext loginContext = context.mock(ResultAwareLoginContext.class, "loginContext"); final HttpRequestMessage expectedRequest = new HttpRequestMessage(); expectedRequest.setVersion(HTTP_1_1); expectedRequest.setMethod(POST); final URI requestURI = URI.create("/path/;e/cte"); expectedRequest.setRequestURI(requestURI); expectedRequest.setContent(EMPTY); context.checking( new Expectations() { { oneOf(session).getVersion(); will(returnValue(HTTP_1_1)); oneOf(session).getMethod(); will(returnValue(POST)); oneOf(session).getParameters(); oneOf(session).getRequestURI(); will(returnValue(requestURI)); oneOf(session).isSecure(); oneOf(session).getReadCookies(); oneOf(session).getReadHeader("Content-Length"); will(returnValue(null)); allowing(session).getReadHeaders(); will(returnValue(new HashMap<String, List<String>>())); oneOf(session).getSubject(); will(returnValue(subject)); oneOf(session).getLoginContext(); will(returnValue(loginContext)); oneOf(session).setReadHeaders(with(any(HashMap.class))); } }); HttpRequestMessage request = HttpElevateEmulatedRequestFilter.asElevatedRequest(session); assertSame(subject, request.getSubject()); assertSame(loginContext, request.getLoginContext()); context.assertIsSatisfied(); } private void oneOfIsEmulatedWebSocketRequest( Expectations exp, HttpRequestMessage expectedRequest) { exp.allowing(serverSession).getRequestURI(); exp.will(returnValue(expectedRequest.getRequestURI())); } private void oneOfUnconditionalWrappedResponseRequiredCheck(Expectations exp) { exp.allowing(serverSession).getAttribute(BridgeSession.LOCAL_ADDRESS); exp.will(returnValue(localAddress)); exp.allowing(serverSession).getReadHeader("X-Origin"); exp.will(returnValue(null)); exp.allowing(serverSession).getReadHeader("X-Next-Protocol"); exp.will(returnValue(null)); exp.allowing(serverSession).getParameter(".knp"); exp.will(returnValue(null)); exp.allowing(serverSession).getParameter(".kv"); exp.will(returnValue("10.05")); exp.allowing(serverSession).getParameter(".kl"); exp.will(returnValue("Y")); exp.allowing(serverSession).getParameter(".kac"); exp.will(returnValue(null)); ((IoSession) exp.allowing(serverSession)).getLocalAddress(); exp.will(returnValue(localAddress)); exp.allowing(serverSession).getLocalAddress(); exp.will(returnValue(localAddress)); exp.allowing(localAddress).getOption(ResourceAddress.NEXT_PROTOCOL); exp.will(returnValue("httpxe/1.1")); exp.allowing(serverSession).getMethod(); exp.will(returnValue(HttpMethod.POST)); exp.allowing(serverSession).setMethod(HttpMethod.POST); exp.allowing(serverSession).getFilterChain(); exp.will(returnValue(filterChain)); exp.allowing(filterChain) .addBefore( exp.with(Expectations.any(String.class)), exp.with(Expectations.any(String.class)), exp.with(Expectations.any(org.apache.mina.core.filterchain.IoFilter.class))); } }