-
Notifications
You must be signed in to change notification settings - Fork 7
/
CountingOutputStream.java
62 lines (53 loc) · 1.54 KB
/
CountingOutputStream.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package io.embrace.android.embracesdk.internal.network.http;
import java.io.ByteArrayOutputStream;
import java.io.FilterOutputStream;
import java.io.IOException;
import java.io.OutputStream;
/**
* Counts the number of bytes written to the output stream, also captures the request body.
*/
class CountingOutputStream extends FilterOutputStream {
private long count;
ByteArrayOutputStream os = new ByteArrayOutputStream();
/**
* Wraps another output stream, counting the number of bytes written.
*
* @param out the output stream to be wrapped
*/
public CountingOutputStream(OutputStream out) {
super(out);
}
/**
* Returns the number of bytes written.
*/
public long getCount() {
return count;
}
/**
* Returns the request body written.
*/
byte[] getRequestBody() {
return os.toByteArray();
}
@Override
public void write(byte[] b, int off, int len) throws IOException {
out.write(b, off, len);
count += len;
if (b != null) {
os.write(b, off, len);
}
}
@Override
public void write(int b) throws IOException {
out.write(b);
count++;
os.write(b);
}
// Overriding close() because FilterOutputStream's close() method pre-JDK8 has bad behavior:
// it silently ignores any exception thrown by flush(). Instead, just close the delegate stream.
// It should flush itself if necessary.
@Override
public void close() throws IOException {
out.close();
}
}