package org.webpieces.webserver.impl;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import org.webpieces.data.api.DataWrapper;
import org.webpieces.data.api.DataWrapperGenerator;
import org.webpieces.data.api.DataWrapperGeneratorFactory;
import org.webpieces.httpcommon.api.ResponseId;
import org.webpieces.util.logging.Logger;
import org.webpieces.util.logging.LoggerFactory;
public class ChunkedStream extends OutputStream {
private static final Logger log = LoggerFactory.getLogger(ChunkedStream.class);
private static final DataWrapperGenerator wrapperFactory = DataWrapperGeneratorFactory.createDataWrapperGenerator();
private ByteArrayOutputStream str = new ByteArrayOutputStream();
private ResponseOverrideSender responseSender;
private int size;
private String type;
private ResponseId responseId;
public ChunkedStream(ResponseOverrideSender responseSender, int size, boolean compressed, ResponseId responseId) {
this.responseSender = responseSender;
this.size = size;
this.str = new ByteArrayOutputStream(size);
this.responseId = responseId;
if(compressed)
this.type = "compressed";
else
this.type = "not compressed";
}
@Override
public void write(int b) throws IOException {
str.write(b);
if(str.size() >= size) {
writeDataOut();
}
}
@Override
public void flush() {
if(str.size() > 0) {
writeDataOut();
}
}
@Override
public void close() {
if(str.size() > 0) {
writeDataOut();
}
responseSender.sendData(wrapperFactory.emptyWrapper(), responseId, true);
}
private void writeDataOut() {
byte[] data = str.toByteArray();
str = new ByteArrayOutputStream();
DataWrapper body = wrapperFactory.wrapByteArray(data);
log.info("writing "+type+" data="+body.getReadableSize()+" to socket="+responseSender);
responseSender.sendData(body, responseId, false);
}
}