package org.apache.maven.index.updater.fixtures; /* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ import org.mortbay.jetty.Connector; import org.mortbay.jetty.Handler; import org.mortbay.jetty.Server; import org.mortbay.jetty.handler.DefaultHandler; import org.mortbay.jetty.handler.HandlerCollection; import org.mortbay.jetty.nio.SelectChannelConnector; import org.mortbay.jetty.security.Constraint; import org.mortbay.jetty.security.ConstraintMapping; import org.mortbay.jetty.security.HashUserRealm; import org.mortbay.jetty.security.SecurityHandler; import org.mortbay.jetty.servlet.AbstractSessionManager; import org.mortbay.jetty.servlet.SessionHandler; import org.mortbay.jetty.webapp.WebAppContext; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.net.URISyntaxException; import java.net.URL; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class ServerTestFixture { private static final String SERVER_ROOT_RESOURCE_PATH = "index-updater/server-root"; private static final String SIXTY_TWO_CHARS = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789"; public static final String LONG_PASSWORD = SIXTY_TWO_CHARS + SIXTY_TWO_CHARS; private final Server server; public ServerTestFixture( final int port ) throws Exception { server = new Server(); Connector connector = new SelectChannelConnector(); connector.setPort( port ); server.setConnectors( new Connector[]{ connector } ); Constraint constraint = new Constraint(); constraint.setName( Constraint.__BASIC_AUTH ); constraint.setRoles( new String[]{ "allowed" } ); constraint.setAuthenticate( true ); ConstraintMapping cm = new ConstraintMapping(); cm.setConstraint( constraint ); cm.setPathSpec( "/protected/*" ); SecurityHandler sh = new SecurityHandler(); HashUserRealm realm = new HashUserRealm( "POC Server" ); realm.put( "user", "password" ); realm.put( "longuser", LONG_PASSWORD ); realm.addUserToRole( "user", "allowed" ); realm.addUserToRole( "longuser", "allowed" ); sh.setUserRealm( realm ); sh.setConstraintMappings( new ConstraintMapping[]{ cm } ); WebAppContext ctx = new WebAppContext(); ctx.setContextPath( "/" ); File base = getBase(); ctx.setWar( base.getAbsolutePath() ); ctx.addHandler( sh ); ctx.getServletHandler().addServletWithMapping( TimingServlet.class, "/slow/*" ); ctx.getServletHandler().addServletWithMapping( InfiniteRedirectionServlet.class, "/redirect-trap/*" ); SessionHandler sessionHandler = ctx.getSessionHandler(); ( (AbstractSessionManager) sessionHandler.getSessionManager() ).setUsingCookies( false ); HandlerCollection handlers = new HandlerCollection(); handlers.setHandlers( new Handler[]{ ctx, new DefaultHandler() } ); server.setHandler( handlers ); server.start(); } private static File getBase() throws URISyntaxException { URL resource = Thread.currentThread().getContextClassLoader().getResource( SERVER_ROOT_RESOURCE_PATH ); if ( resource == null ) { throw new IllegalStateException( "Cannot find classpath resource: " + SERVER_ROOT_RESOURCE_PATH ); } return new File( resource.toURI().normalize() ); } public void stop() throws Exception { server.stop(); server.join(); } public static final class TimingServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet( final HttpServletRequest req, final HttpServletResponse resp ) throws ServletException, IOException { String basePath = req.getServletPath(); String subPath = req.getRequestURI().substring( basePath.length() ); File base; try { base = getBase(); } catch ( URISyntaxException e ) { resp.sendError( HttpServletResponse.SC_INTERNAL_SERVER_ERROR, "Cannot find server document root in classpath: " + SERVER_ROOT_RESOURCE_PATH ); return; } File f = new File( base, "slow" + subPath ); InputStream in = null; try { in = new FileInputStream( f ); OutputStream out = resp.getOutputStream(); int read = -1; byte[] buf = new byte[64]; while ( ( read = in.read( buf ) ) > -1 ) { System.out.println( "Sending " + read + " bytes (after pausing 1 seconds)..." ); try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { } out.write( buf, 0, read ); } out.flush(); } finally { if ( in != null ) { try { in.close(); } catch ( IOException e ) { } } } } } public int getPort() { return server.getConnectors()[0].getLocalPort(); } public static final class InfiniteRedirectionServlet extends HttpServlet { private static final long serialVersionUID = 1L; static int redirCount = 0; @Override protected void doGet( final HttpServletRequest req, final HttpServletResponse resp ) throws ServletException, IOException { String path = req.getServletPath(); String subPath = req.getRequestURI().substring( path.length() ); path += subPath + "-" + ( ++redirCount ); resp.sendRedirect( path ); } } }