package com.jpexs.proxy; import java.net.InetAddress; import java.net.Socket; import java.net.ServerSocket; import java.io.IOException; import java.io.DataOutputStream; import java.util.List; public class Server implements Runnable { ServerSocket server = null; boolean running = false; private List<String> catchedContentTypes; private CatchedListener catchedListener; private ReplacedListener replacedListener; private List<Replacement> replacements; static ThreadPool pool; static Server myServer; static boolean serverRunning = false; static boolean stopping = false; public static ReusableThread getThread() { return pool.get(); } /** * Starts proxy server * * @param port Listening port * @param replacements List of replacements * @param catchedContentTypes Content types to sniff * @param catchedListener Catched listener */ public static boolean startServer(int port, List<Replacement> replacements, List<String> catchedContentTypes, CatchedListener catchedListener, ReplacedListener replacedListener) { stopServer(); stopping = false; try { myServer = new Server(port, replacements, catchedContentTypes, catchedListener, replacedListener); } catch (IOException ex) { return false; } pool = new ThreadPool(ProxyConfig.appName + " Threads"); /* Startup the Janitor */ Janitor j = new Janitor(); j.add(pool); getThread().setRunnable(j); serverRunning = true; getThread().setRunnable(myServer); return true; } public static void stopServer() { if (serverRunning) { stopping = true; serverRunning = false; try { myServer.server.close(); } catch (IOException ex) { } pool.clean(); } } Server(int port, List<Replacement> replacements, List<String> catchedContentTypes, CatchedListener catchedListener, ReplacedListener replacedListener) throws IOException { this.replacements = replacements; this.catchedContentTypes = catchedContentTypes; this.catchedListener = catchedListener; this.replacedListener = replacedListener; try { String bindaddr = ProxyConfig.bindAddress; if (bindaddr != null && bindaddr.length() > 0) { server = new ServerSocket(port, 512, InetAddress.getByName(bindaddr)); } else { server = new ServerSocket(port, 512); } } catch (IOException e) { throw e; } /* Initialize internal Httpd */ } synchronized void suspend() { running = false; } synchronized void resume() { running = true; } public void run() { Thread.currentThread().setName(ProxyConfig.appName + " Server"); running = true; for (;;) { Socket socket; try { socket = server.accept(); } catch (IOException e) { if (stopping) { break; } continue; } if (stopping) { break; } if (running) { Handler h = new Handler(socket, replacements, catchedContentTypes, catchedListener, replacedListener); ReusableThread rt = getThread(); rt.setRunnable(h); } else { error(socket, 503, ProxyConfig.appName + " proxy service is suspended."); } } } void error(Socket socket, int code, String message) { try { DataOutputStream out = new DataOutputStream(socket.getOutputStream()); out.writeBytes((new HttpError(code, message)).toString()); out.close(); socket.close(); } catch (IOException e) { e.printStackTrace(); } } }