3
3
import fi .iki .elonen .NanoHTTPD ;
4
4
import me .clip .placeholderapi .PlaceholderAPI ;
5
5
import org .bukkit .Bukkit ;
6
+ import org .bukkit .entity .Player ;
6
7
7
8
import java .io .*;
8
9
import java .nio .file .NoSuchFileException ;
9
10
import java .sql .Time ;
10
11
import java .text .SimpleDateFormat ;
11
12
import java .util .Date ;
13
+ import java .util .List ;
12
14
import java .util .Map ;
15
+ import java .util .concurrent .ExecutorService ;
16
+ import java .util .concurrent .Executors ;
17
+ import java .util .function .Supplier ;
13
18
import java .util .regex .Matcher ;
14
19
import java .util .regex .Pattern ;
15
20
@@ -87,25 +92,38 @@ private String getMimeType(String uri) {
87
92
88
93
89
94
public void start () {
95
+ int maxThreads = new FileManager ().getIntegerFromConfig ("WebServer.threads" ); // maximum number of threads
96
+ if (maxThreads == 0 ) {
90
97
try {
91
98
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 ();
100
99
} catch (IOException e ) {
101
100
Main .getInstance ().getLogger ().warning ("Couldn't start server: " + e .getMessage ());
102
- FileManager .setStringInConfig ("WebServer.isRunning" , String . valueOf ( false ) );
101
+ FileManager .setBooleanInConfig ("WebServer.isRunning" , false );
103
102
}
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 ();
104
122
}
105
123
public void stop () {
106
124
super .stop ();
107
125
Main .tc .stop ();
108
- FileManager .setStringInConfig ("WebServer.isRunning" , String . valueOf ( false ) );
126
+ FileManager .setBooleanInConfig ("WebServer.isRunning" , false );
109
127
if (!(super .isAlive ())) {
110
128
Main .getInstance ().getLogger ().warning ("Webserver has been Stopped!" );
111
129
} else {
@@ -116,7 +134,7 @@ public void stop() {
116
134
public Response serve (IHTTPSession session ) {
117
135
String uri = session .getUri ().toLowerCase ();
118
136
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" ))) {
120
138
return newFixedLengthResponse (Response .Status .BAD_REQUEST , "text/plain" , "Permanent Redirect to " + new FileManager ().getStringFromConfig ("WebServer.domain" ) + ":" + Integer .valueOf (new FileManager ().getStringFromConfig ("WebServer.port" )));
121
139
}
122
140
@@ -126,21 +144,24 @@ public Response serve(IHTTPSession session) {
126
144
String mimeType = getMimeType (uri );
127
145
File file = new File (Main .instance .getDataFolder () + "/web/" + uri );
128
146
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
+ }
140
160
}
141
161
if (Method .GET .equals (method ) && "/" .equals (uri )) file = new File (Main .instance .getDataFolder () + "/web/" + "index.html" .toLowerCase ());
142
162
143
163
if (Bukkit .getPluginManager ().getPlugin ("PlaceholderAPI" ) != null ) {
164
+
144
165
StringBuilder fileContent = new StringBuilder ();
145
166
try (BufferedReader reader = new BufferedReader (new FileReader (Main .instance .getDataFolder () + "/web/" + uri .toLowerCase ()))) {
146
167
String line ;
@@ -156,6 +177,7 @@ public Response serve(IHTTPSession session) {
156
177
Pattern pattern = Pattern .compile (placeholderRegex );
157
178
Matcher matcher = pattern .matcher (fileContent );
158
179
StringBuffer modifiedContentBuffer = new StringBuffer ();
180
+
159
181
while (matcher .find ()) {
160
182
String placeholder = matcher .group (1 );
161
183
String resolvedValue = PlaceholderAPI .setPlaceholders (null , "%" + placeholder + "%" );
@@ -178,4 +200,14 @@ public Response serve(IHTTPSession session) {
178
200
throw new RuntimeException (e );
179
201
}
180
202
}
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
+ }
181
213
}
0 commit comments