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 package org.apache.http.impl.client.cache;
28
29 import java.io.ByteArrayOutputStream;
30 import java.io.IOException;
31 import java.io.InputStream;
32
33 import org.apache.http.annotation.Contract;
34 import org.apache.http.annotation.ThreadingBehavior;
35 import org.apache.http.client.cache.InputLimit;
36 import org.apache.http.client.cache.Resource;
37 import org.apache.http.client.cache.ResourceFactory;
38
39
40
41
42
43
44 @Contract(threading = ThreadingBehavior.IMMUTABLE)
45 public class HeapResourceFactory implements ResourceFactory {
46
47 @Override
48 public Resource generate(
49 final String requestId,
50 final InputStream inStream,
51 final InputLimit limit) throws IOException {
52 final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
53 final byte[] buf = new byte[2048];
54 long total = 0;
55 int l;
56 while ((l = inStream.read(buf)) != -1) {
57 outStream.write(buf, 0, l);
58 total += l;
59 if (limit != null && total > limit.getValue()) {
60 limit.reached();
61 break;
62 }
63 }
64 return createResource(outStream.toByteArray());
65 }
66
67 @Override
68 public Resource copy(
69 final String requestId,
70 final Resource resource) throws IOException {
71 final byte[] body;
72 if (resource instanceof HeapResource) {
73 body = ((HeapResource) resource).getByteArray();
74 } else {
75 final ByteArrayOutputStream outStream = new ByteArrayOutputStream();
76 IOUtils.copyAndClose(resource.getInputStream(), outStream);
77 body = outStream.toByteArray();
78 }
79 return createResource(body);
80 }
81
82 Resource createResource(final byte[] buf) {
83 return new HeapResource(buf);
84 }
85
86 }