protected long buildResponseStringBuf(String s, long r, final long preChain) { if (s == null) { return 0; } if (s.length() == 0) { return -NGX_HTTP_NO_CONTENT; } CharsetEncoder charsetEncoder = ThreadLocalCoders.encoderFor(DEFAULT_ENCODING) .onMalformedInput(CodingErrorAction.REPLACE) .onUnmappableCharacter(CodingErrorAction.REPLACE); ByteBuffer bb = pickByteBuffer(); CharBuffer cb = CharBuffer.wrap((char[]) UNSAFE.getObject(s, STRING_CHAR_ARRAY_OFFSET)); charsetEncoder.reset(); CoderResult result = CoderResult.UNDERFLOW; long first = 0; long chain = preChain; do { result = charsetEncoder.encode(cb, bb, true); if (result == CoderResult.OVERFLOW) { bb.flip(); chain = ngx_http_clojure_mem_build_temp_chain( r, chain, bb.array(), BYTE_ARRAY_OFFSET, bb.remaining()); if (chain <= 0) { return chain; } bb.clear(); if (first == 0) { first = chain; } } else if (result == CoderResult.UNDERFLOW) { break; } else { log.error("%s can not decode string : %s", result.toString(), s); return -NGX_HTTP_INTERNAL_SERVER_ERROR; } } while (true); while (charsetEncoder.flush(bb) == CoderResult.OVERFLOW) { bb.flip(); chain = ngx_http_clojure_mem_build_temp_chain( r, chain, bb.array(), BYTE_ARRAY_OFFSET, bb.remaining()); if (chain <= 0) { return chain; } if (first == 0) { first = chain; } bb.clear(); } if (bb.hasRemaining()) { bb.flip(); chain = ngx_http_clojure_mem_build_temp_chain( r, chain, bb.array(), BYTE_ARRAY_OFFSET, bb.remaining()); if (chain <= 0) { return chain; } if (first == 0) { first = chain; } bb.clear(); } return preChain == 0 ? first : chain; }
@SuppressWarnings({"unchecked"}) public <T> T getFieldFast(int pos) { return (T) UNSAFE.getObject(this, offsets[pos]); }