package com.koushikdutta.async.http.filter; import com.koushikdutta.async.ByteBufferList; import com.koushikdutta.async.DataEmitter; import com.koushikdutta.async.FilteredDataEmitter; public class ContentLengthFilter extends FilteredDataEmitter { public ContentLengthFilter(int contentLength) { this.contentLength = contentLength; } @Override protected void report(Exception e) { if (e == null && totalRead != contentLength) e = new Exception("End of data reached before content length was read"); super.report(e); } int contentLength; int totalRead; ByteBufferList transformed = new ByteBufferList(); @Override public void onDataAvailable(DataEmitter emitter, ByteBufferList bb) { assert totalRead < contentLength; int remaining = bb.remaining(); int toRead = Math.min(contentLength - totalRead, remaining); bb.get(transformed, toRead); totalRead += transformed.remaining(); super.onDataAvailable(emitter, transformed); if (totalRead == contentLength) report(null); } }