diff --git a/src/main/java/org/redkale/net/http/HttpResponse.java b/src/main/java/org/redkale/net/http/HttpResponse.java index fc823bffe..83d2f5516 100644 --- a/src/main/java/org/redkale/net/http/HttpResponse.java +++ b/src/main/java/org/redkale/net/http/HttpResponse.java @@ -162,6 +162,8 @@ public class HttpResponse extends Response { private BiFunction retResultHandler; + private BiFunction sendHandler; + // ------------------------------------------------ private final String plainContentType; @@ -255,6 +257,7 @@ public class HttpResponse extends Response { this.headerArray.clear(); this.cacheHandler = null; this.retResultHandler = null; + this.sendHandler = null; this.respHeadContainsConnection = false; this.jsonWriter.recycle(); return super.recycle(); @@ -988,7 +991,7 @@ public class HttpResponse extends Response { protected void finish( boolean kill, final String contentType, - @Nonnull final byte[] bodyContent, + @Nonnull byte[] bodyContent, int bodyOffset, int bodyLength, Consumer callback, @@ -996,6 +999,14 @@ public class HttpResponse extends Response { if (isClosed()) { return; // 避免重复关闭 } + if (sendHandler != null) { + ByteArray bodyArray = new ByteArray(bodyContent, bodyOffset, bodyLength); + bodyArray = sendHandler.apply(this, bodyArray); + bodyContent = bodyArray.content(); + bodyOffset = bodyArray.offset(); + bodyLength = bodyArray.length(); + } + if (this.headWritedSize < 0) { if (contentType != null) { this.contentType = contentType; @@ -1592,6 +1603,24 @@ public class HttpResponse extends Response { this.retResultHandler = retResultHandler; } + /** + * 获取输出RetResult时的拦截器 + * + * @return 拦截器 + */ + protected BiFunction getSendHandler() { + return sendHandler; + } + + /** + * 设置输出结果时的拦截器 + * + * @param sendHandler 拦截器 + */ + public void sendHandler(BiFunction sendHandler) { + this.sendHandler = sendHandler; + } + // protected final class TransferFileHandler implements CompletionHandler { // // private final File file; diff --git a/src/main/java/org/redkale/util/ByteArray.java b/src/main/java/org/redkale/util/ByteArray.java index 43cdd0773..7ba9b9422 100644 --- a/src/main/java/org/redkale/util/ByteArray.java +++ b/src/main/java/org/redkale/util/ByteArray.java @@ -46,6 +46,16 @@ public final class ByteArray implements ByteTuple { this.count = bs.length; } + public ByteArray(byte[] bs, int offset, int length) { + if (offset == 0) { + this.content = bs; + this.count = bs.length >= length ? length : bs.length; + } else { + this.content = Arrays.copyOfRange(bs, offset, length); + this.count = bs.length; + } + } + /** * 清空数据,将count置为0,并不清掉byte[]的内容 *