33import fi .iki .elonen .NanoHTTPD ;
44import me .clip .placeholderapi .PlaceholderAPI ;
55import org .bukkit .Bukkit ;
6+ import org .bukkit .entity .Player ;
67
78import java .io .*;
89import java .nio .file .NoSuchFileException ;
910import java .sql .Time ;
1011import java .text .SimpleDateFormat ;
1112import java .util .Date ;
13+ import java .util .List ;
1214import java .util .Map ;
15+ import java .util .concurrent .ExecutorService ;
16+ import java .util .concurrent .Executors ;
17+ import java .util .function .Supplier ;
1318import java .util .regex .Matcher ;
1419import java .util .regex .Pattern ;
1520
@@ -87,25 +92,38 @@ private String getMimeType(String uri) {
8792
8893
8994 public void start () {
95+ int maxThreads = new FileManager ().getIntegerFromConfig ("WebServer.threads" ); // maximum number of threads
96+ if (maxThreads == 0 ) {
9097 try {
9198 super .start (NanoHTTPD .SOCKET_READ_TIMEOUT , false );
92- FileManager .setStringInConfig ("WebServer.isRunning" , String .valueOf (true ));
93- if (new FileManager ().getBooleanFromConfig ("WebServer.ssl" )) {
94- Main .getInstance ().getLogger ().warning ("Running! https://" + new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer .valueOf (new FileManager ().getStringFromConfig ("WebServer.port" )) + "/" );
95- } else {
96- Main .getInstance ().getLogger ().warning ("Running! http://" + new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer .valueOf (new FileManager ().getStringFromConfig ("WebServer.port" )) + "/" );
97- }
98- Main .tc .reset ();
99- Main .tc .start ();
10099 } catch (IOException e ) {
101100 Main .getInstance ().getLogger ().warning ("Couldn't start server: " + e .getMessage ());
102- FileManager .setStringInConfig ("WebServer.isRunning" , String . valueOf ( false ) );
101+ FileManager .setBooleanInConfig ("WebServer.isRunning" , false );
103102 }
103+ } else {
104+ ExecutorService executorService = Executors .newFixedThreadPool (maxThreads );
105+ executorService .submit (() -> {
106+ try {
107+ super .start (NanoHTTPD .SOCKET_READ_TIMEOUT , false );
108+ } catch (IOException e ) {
109+ Main .getInstance ().getLogger ().warning ("Couldn't start server: " + e .getMessage ());
110+ FileManager .setBooleanInConfig ("WebServer.isRunning" , false );
111+ }
112+ });
113+ }
114+ FileManager .setBooleanInConfig ("WebServer.isRunning" , true );
115+ if (new FileManager ().getBooleanFromConfig ("WebServer.ssl" )) {
116+ Main .getInstance ().getLogger ().warning ("Running! https://" + new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer .valueOf (new FileManager ().getStringFromConfig ("WebServer.port" )) + "/" );
117+ } else {
118+ Main .getInstance ().getLogger ().warning ("Running! http://" + new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer .valueOf (new FileManager ().getStringFromConfig ("WebServer.port" )) + "/" );
119+ }
120+ Main .tc .reset ();
121+ Main .tc .start ();
104122 }
105123 public void stop () {
106124 super .stop ();
107125 Main .tc .stop ();
108- FileManager .setStringInConfig ("WebServer.isRunning" , String . valueOf ( false ) );
126+ FileManager .setBooleanInConfig ("WebServer.isRunning" , false );
109127 if (!(super .isAlive ())) {
110128 Main .getInstance ().getLogger ().warning ("Webserver has been Stopped!" );
111129 } else {
@@ -116,7 +134,7 @@ public void stop() {
116134 public Response serve (IHTTPSession session ) {
117135 String uri = session .getUri ().toLowerCase ();
118136 String hostHeader = session .getHeaders ().get ("host" );
119- if (hostHeader == null || !hostHeader .contains (new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer . valueOf ( new FileManager (). getStringFromConfig ( "WebServer.port" )) )) {
137+ if (hostHeader == null || !hostHeader .contains (new FileManager ().getStringFromConfig ("WebServer.domain" ))) {
120138 return newFixedLengthResponse (Response .Status .BAD_REQUEST , "text/plain" , "Permanent Redirect to " + new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer .valueOf (new FileManager ().getStringFromConfig ("WebServer.port" )));
121139 }
122140
@@ -126,21 +144,24 @@ public Response serve(IHTTPSession session) {
126144 String mimeType = getMimeType (uri );
127145 File file = new File (Main .instance .getDataFolder () + "/web/" + uri );
128146 try {
129- try (FileWriter writer = new FileWriter (logFile , true )) {
130- Map <String , String > headers = session .getHeaders ();
131- String referer = headers .get ("referer" );
132- String agent = headers .get ("user-agent" );
133- String ip = headers .get ("remote-addr" );
134- String timeStamp = new SimpleDateFormat ("dd-MM-yyyy ss:mm:HH" ).format (new Date ());
135- writer .append (timeStamp + " " + session .getMethod () + " " + session .getUri () + " " + ip + " " + agent + " " + referer + "\n " );
136- } catch (NoSuchFileException e ) {
137- if (!logsFolder .exists ()) logsFolder .mkdir ();
138- } catch (IOException e ) {
139- throw new RuntimeException (e );
147+ if (new FileManager ().getBooleanFromConfig ("WebServer.accessLog" )) {
148+ try (FileWriter writer = new FileWriter (logFile , true )) {
149+ Map <String , String > headers = session .getHeaders ();
150+ String referer = headers .get ("referer" );
151+ String agent = headers .get ("user-agent" );
152+ String ip = headers .get ("remote-addr" );
153+ String timeStamp = new SimpleDateFormat ("dd-MM-yyyy ss:mm:HH" ).format (new Date ());
154+ writer .append (timeStamp + " " + session .getMethod () + " " + session .getUri () + " " + ip + " " + agent + " " + referer + "\n " );
155+ } catch (NoSuchFileException e ) {
156+ if (!logsFolder .exists ()) logsFolder .mkdir ();
157+ } catch (IOException e ) {
158+ throw new RuntimeException (e );
159+ }
140160 }
141161 if (Method .GET .equals (method ) && "/" .equals (uri )) file = new File (Main .instance .getDataFolder () + "/web/" + "index.html" .toLowerCase ());
142162
143163 if (Bukkit .getPluginManager ().getPlugin ("PlaceholderAPI" ) != null ) {
164+
144165 StringBuilder fileContent = new StringBuilder ();
145166 try (BufferedReader reader = new BufferedReader (new FileReader (Main .instance .getDataFolder () + "/web/" + uri .toLowerCase ()))) {
146167 String line ;
@@ -156,6 +177,7 @@ public Response serve(IHTTPSession session) {
156177 Pattern pattern = Pattern .compile (placeholderRegex );
157178 Matcher matcher = pattern .matcher (fileContent );
158179 StringBuffer modifiedContentBuffer = new StringBuffer ();
180+
159181 while (matcher .find ()) {
160182 String placeholder = matcher .group (1 );
161183 String resolvedValue = PlaceholderAPI .setPlaceholders (null , "%" + placeholder + "%" );
@@ -178,4 +200,14 @@ public Response serve(IHTTPSession session) {
178200 throw new RuntimeException (e );
179201 }
180202 }
203+ private String getQueryValue (String query , String paramName ) {
204+ String [] params = query .split ("&" );
205+ for (String param : params ) {
206+ String [] parts = param .split ("=" );
207+ if (parts .length == 2 && parts [0 ].equals (paramName )) {
208+ return parts [1 ];
209+ }
210+ }
211+ return null ;
212+ }
181213}
0 commit comments