io.bitsensor.plugins.java.http.filter.BitSensorRequestWrapper Maven / Gradle / Ivy
The newest version!
package io.bitsensor.plugins.java.http.filter;
import io.bitsensor.proto.shaded.io.bitsensor.proto.shaded.com.google.common.primitives.Bytes;
import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.util.Arrays;
public class BitSensorRequestWrapper extends HttpServletRequestWrapper {
private byte[] requestBody = new byte[0];
private boolean bufferFilled = false;
public BitSensorRequestWrapper(HttpServletRequest request) {
super(request);
}
public byte[] getRequestBody() throws IOException {
if (bufferFilled) {
return Arrays.copyOf(requestBody, requestBody.length);
}
InputStream inputStream = super.getInputStream();
byte[] buffer = new byte[102400]; // 100kb buffer
int bytesRead;
while ((bytesRead = inputStream.read(buffer)) != -1) {
requestBody = Bytes.concat(this.requestBody, Arrays.copyOfRange(buffer, 0, bytesRead));
}
bufferFilled = true;
return requestBody;
}
@Override
public ServletInputStream getInputStream() throws IOException {
return new BitSensorServletInputStream(getRequestBody());
}
@Override
public BufferedReader getReader() throws IOException {
return new BufferedReader(new InputStreamReader(getInputStream()));
}
private static class BitSensorServletInputStream extends ServletInputStream {
private ByteArrayInputStream buffer;
public BitSensorServletInputStream(byte[] contents) {
this.buffer = new ByteArrayInputStream(contents);
}
@Override
public int read() throws IOException {
return buffer.read();
}
@Override
public boolean isFinished() {
return buffer.available() == 0;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener listener) {
throw new UnsupportedOperationException("Method not implemented.");
}
}
}