package net.sf.openrocket.util; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; /** * A filtering InputStream that limits the number of bytes that can be * read from a stream. This can be used to enforce security, so that overlong * input is ignored. * * @author Sampo Niskanen <sampo.niskanen@iki.fi> */ public class LimitedInputStream extends FilterInputStream { private int remaining; public LimitedInputStream(InputStream is, int limit) { super(is); this.remaining = limit; } @Override public int available() throws IOException { int available = super.available(); return Math.min(available, remaining); } @Override public int read(byte[] b, int off, int len) throws IOException { if (remaining <= 0) return -1; int result = super.read(b, off, Math.min(len, remaining)); if (result >= 0) remaining -= result; return result; } @Override public long skip(long n) throws IOException { if (n > remaining) n = remaining; long result = super.skip(n); remaining -= result; return result; } @Override public int read() throws IOException { if (remaining <= 0) return -1; int result = super.read(); if (result >= 0) remaining--; return result; } // Disable mark support @Override public void mark(int readlimit) { } @Override public boolean markSupported() { return false; } @Override public synchronized void reset() throws IOException { throw new IOException("mark/reset not supported"); } }