mirror of
https://git.huckle.dev/Huckles-Minecraft-Archive/jpexs-decompiler.git
synced 2026-05-22 15:45:30 +00:00
140 lines
4.0 KiB
Java
140 lines
4.0 KiB
Java
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();
|
|
}
|
|
}
|
|
}
|