/**
* Copyright (C) Zhang,Yuexiang (xfeep)
*
*/
package nginx.clojure;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.io.SequenceInputStream;
import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.charset.Charset;
import static nginx.clojure.NginxClojureRT.*;
import static nginx.clojure.HackUtils.*;
public class RequestBodyFetcher implements RequestVarFetcher {
public final static RequestKnownNameVarFetcher BODY_VAR_FETCHER = new RequestKnownNameVarFetcher("request_body");
public final static RequestKnownNameVarFetcher BODY_FILE_FETCHER = new RequestKnownNameVarFetcher("request_body_file");
public RequestBodyFetcher() {
}
@Override
public Object fetch(long r, Charset encoding) {
ByteBuffer bb = pickByteBuffer();
long len = ngx_http_clojure_mem_get_request_body(r, bb.array(), BYTE_ARRAY_OFFSET, bb.capacity());
if (len == 0) {
return null;
} else if (len < 0) {
len = -len;
bb.limit((int) len);
String tmpfile = decode(bb, DEFAULT_ENCODING, pickCharBuffer());
try {
if (log.isDebugEnabled()) {
log.debug("#%d:get tmp file :%s", r, tmpfile);
}
return new FileInputStream(tmpfile);
} catch (FileNotFoundException e) {
throw new RuntimeException("can not find tmp file", e);
}
}else {
long li = bb.order(ByteOrder.nativeOrder()).getLong();
if (li == len) {
return new NativeInputStream(bb.getLong(), len);
}else {
InputStream rt = new NativeInputStream(bb.getLong(), li);
li = bb.getLong();
while (li > 0) {
rt = new SequenceInputStream(rt, new NativeInputStream(bb.getLong(), li));
li = bb.getLong();
}
return rt;
}
}
}
}