package slacknotifications; import org.mortbay.jetty.Request; import org.mortbay.jetty.Server; import org.mortbay.jetty.security.B64Code; import org.mortbay.jetty.servlet.Context; import org.mortbay.jetty.servlet.ServletHolder; import org.mortbay.proxy.AsyncProxyServlet; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class SlackNotificationTestProxyServer { Server server; public SlackNotificationTestProxyServer(String host, Integer port) { server = new Server(port); Context root = new Context(server,"/",Context.SESSIONS); root.addServlet(new ServletHolder(new ProxyServerServlet()), "/*"); } public SlackNotificationTestProxyServer(String host, Integer port, String proxyUsername, String proxyPassword) { server = new Server(port); Context root = new Context(server,"/",Context.SESSIONS); root.addServlet(new ServletHolder(new ProxyServerServlet(proxyUsername, proxyPassword)), "/*"); } public class ProxyServerServlet extends AsyncProxyServlet{ private boolean authRequired; private String proxyUsername, proxyPassword; public ProxyServerServlet(){ super(); } public ProxyServerServlet(String proxyUsername, String proxyPassword){ this(); this.authRequired = true; this.proxyUsername = proxyUsername; this.proxyPassword = proxyPassword; } @Override public void service(ServletRequest req, ServletResponse res) throws ServletException, IOException { System.out.println("Handling Proxy request for " + ((Request) req).getUri().toString()); if ( authRequired ) { final HttpServletRequest request = (HttpServletRequest) req; final HttpServletResponse response = (HttpServletResponse) res; String proxyAuthorization = request.getHeader( "Proxy-Authorization" ); if ( proxyAuthorization != null && proxyAuthorization.startsWith( "Basic " ) ) { String proxyAuth = proxyAuthorization.substring( 6 ); String authorization = B64Code.decode( proxyAuth ); String[] authTokens = authorization.split( ":" ); String user = authTokens[0]; String password = authTokens[1]; if ( user.equals(this.proxyUsername) && password.equals( this.proxyPassword ) ) { super.service(req, res); return; } } // Proxy-Authenticate Basic realm="CCProxy Authorization" response.addHeader( "Proxy-Authenticate", "Basic realm=\"Jetty Proxy Authorization\"" ); response.setStatus( HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED ); System.out.println("Proxy Auth Creds not supplied"); } else { super.service(req, res); } } } }