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.execchain;
28
29 import java.lang.reflect.InvocationHandler;
30 import java.lang.reflect.Proxy;
31
32 import org.apache.http.HttpEntity;
33 import org.apache.http.HttpEntityEnclosingRequest;
34 import org.apache.http.HttpRequest;
35 import org.apache.http.HttpResponse;
36 import org.apache.http.annotation.NotThreadSafe;
37 import org.apache.http.client.methods.CloseableHttpResponse;
38
39
40
41
42
43
44 @NotThreadSafe
45 class Proxies {
46
47 static void enhanceEntity(final HttpEntityEnclosingRequest request) {
48 final HttpEntity entity = request.getEntity();
49 if (entity != null && !entity.isRepeatable() && !isEnhanced(entity)) {
50 final HttpEntity proxy = (HttpEntity) Proxy.newProxyInstance(
51 HttpEntity.class.getClassLoader(),
52 new Class<?>[] { HttpEntity.class },
53 new RequestEntityExecHandler(entity));
54 request.setEntity(proxy);
55 }
56 }
57
58 static boolean isEnhanced(final HttpEntity entity) {
59 if (entity != null && Proxy.isProxyClass(entity.getClass())) {
60 final InvocationHandler handler = Proxy.getInvocationHandler(entity);
61 return handler instanceof RequestEntityExecHandler;
62 } else {
63 return false;
64 }
65 }
66
67 static boolean isRepeatable(final HttpRequest request) {
68 if (request instanceof HttpEntityEnclosingRequest) {
69 final HttpEntity entity = ((HttpEntityEnclosingRequest) request).getEntity();
70 if (entity != null) {
71 if (isEnhanced(entity)) {
72 final RequestEntityExecHandler handler = (RequestEntityExecHandler)
73 Proxy.getInvocationHandler(entity);
74 if (!handler.isConsumed()) {
75 return true;
76 }
77 }
78 return entity.isRepeatable();
79 }
80 }
81 return true;
82 }
83
84 public static CloseableHttpResponse enhanceResponse(
85 final HttpResponse original,
86 final ConnectionHolder connHolder) {
87 return (CloseableHttpResponse) Proxy.newProxyInstance(
88 ResponseProxyHandler.class.getClassLoader(),
89 new Class<?>[] { CloseableHttpResponse.class },
90 new ResponseProxyHandler(original, connHolder));
91 }
92
93 }