/** * Copyright (C) Zhang,Yuexiang (xfeep) * */ package nginx.clojure.clj; import java.io.IOException; import java.io.InputStream; import java.nio.ByteBuffer; import java.util.Map; import clojure.lang.IFn; import nginx.clojure.java.StringFacedJavaBodyFilter; /** * @author who * */ public class StringFacedClojureBodyFilter { public static final String CHAR_DECODER_BUF_REM_IN_REQUEST = "$char-decoder-buf-rem-in-request!"; protected IFn bodyFilter; public StringFacedClojureBodyFilter() { } public StringFacedClojureBodyFilter(IFn bodyFilter) { this.bodyFilter = bodyFilter; } public Map invoke(LazyFilterRequestMap request, InputStream bodyChunk, boolean isLast) throws IOException { ByteBuffer rem = (ByteBuffer) request.valAt(CHAR_DECODER_BUF_REM_IN_REQUEST); if (rem == null) { request.assoc(CHAR_DECODER_BUF_REM_IN_REQUEST, rem = ByteBuffer.allocate(3)); rem.flip(); } StringBuilder sb = StringFacedJavaBodyFilter.decodeToString(rem, bodyChunk); return (Map) bodyFilter.invoke(request, sb.toString(), isLast); } }