package core.framework.impl.web.response;
import core.framework.api.web.ResponseImpl;
import core.framework.impl.web.request.RequestImpl;
import io.undertow.io.IoCallback;
import io.undertow.io.Sender;
import io.undertow.server.HttpServerExchange;
import org.xnio.IoUtils;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.nio.channels.FileChannel;
/**
* @author neo
*/
class FileBodyResponseHandler implements BodyHandler {
@Override
public void handle(ResponseImpl response, Sender sender, RequestImpl request) {
File file = ((FileBody) response.body).file;
try {
final FileChannel channel = new FileInputStream(file).getChannel();
sender.transferFrom(channel, new FileBodyCallback(channel));
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
private static class FileBodyCallback implements IoCallback {
private final FileChannel channel;
FileBodyCallback(FileChannel channel) {
this.channel = channel;
}
@Override
public void onComplete(HttpServerExchange exchange, Sender sender) {
IoUtils.safeClose(channel);
END_EXCHANGE.onComplete(exchange, sender);
}
@Override
public void onException(HttpServerExchange exchange, Sender sender, IOException exception) {
IoUtils.safeClose(channel);
END_EXCHANGE.onException(exchange, sender, exception);
throw new UncheckedIOException(exception);
}
}
}