1package com.xtremelabs.robolectric.shadows;
2
3import com.xtremelabs.robolectric.Robolectric;
4import com.xtremelabs.robolectric.internal.Implementation;
5import com.xtremelabs.robolectric.internal.Implements;
6import com.xtremelabs.robolectric.internal.RealObject;
7import com.xtremelabs.robolectric.tester.org.apache.http.HttpRequestInfo;
8import org.apache.commons.logging.Log;
9import org.apache.commons.logging.LogFactory;
10import org.apache.http.ConnectionReuseStrategy;
11import org.apache.http.HttpException;
12import org.apache.http.HttpHost;
13import org.apache.http.HttpRequest;
14import org.apache.http.HttpResponse;
15import org.apache.http.client.AuthenticationHandler;
16import org.apache.http.client.HttpRequestRetryHandler;
17import org.apache.http.client.RedirectHandler;
18import org.apache.http.client.UserTokenHandler;
19import org.apache.http.conn.ClientConnectionManager;
20import org.apache.http.conn.ConnectionKeepAliveStrategy;
21import org.apache.http.conn.routing.HttpRoutePlanner;
22import org.apache.http.impl.client.DefaultRequestDirector;
23import org.apache.http.params.HttpParams;
24import org.apache.http.protocol.HttpContext;
25import org.apache.http.protocol.HttpProcessor;
26import org.apache.http.protocol.HttpRequestExecutor;
27
28import java.io.IOException;
29
30@SuppressWarnings({"UnusedDeclaration"})
31@Implements(DefaultRequestDirector.class)
32public class ShadowDefaultRequestDirector {
33    @RealObject DefaultRequestDirector realObject;
34
35    protected Log log;
36    protected ClientConnectionManager connectionManager;
37    protected HttpRoutePlanner httpRoutePlanner;
38    protected ConnectionReuseStrategy connectionReuseStrategy;
39    protected ConnectionKeepAliveStrategy connectionKeepAliveStrategy;
40    protected HttpRequestExecutor httpRequestExecutor;
41    protected HttpProcessor httpProcessor;
42    protected HttpRequestRetryHandler httpRequestRetryHandler;
43    protected RedirectHandler redirectHandler;
44    protected AuthenticationHandler targetAuthenticationHandler;
45    protected AuthenticationHandler proxyAuthenticationHandler;
46    protected UserTokenHandler userTokenHandler;
47    protected HttpParams httpParams;
48
49    com.xtremelabs.robolectric.tester.org.apache.http.impl.client.DefaultRequestDirector redirector;
50
51    public void __constructor__(
52            Log log,
53            HttpRequestExecutor requestExec,
54            ClientConnectionManager conman,
55            ConnectionReuseStrategy reustrat,
56            ConnectionKeepAliveStrategy kastrat,
57            HttpRoutePlanner rouplan,
58            HttpProcessor httpProcessor,
59            HttpRequestRetryHandler retryHandler,
60            RedirectHandler redirectHandler,
61            AuthenticationHandler targetAuthHandler,
62            AuthenticationHandler proxyAuthHandler,
63            UserTokenHandler userTokenHandler,
64            HttpParams params) {
65        this.log = log;
66        this.httpRequestExecutor = requestExec;
67        this.connectionManager = conman;
68        this.connectionReuseStrategy = reustrat;
69        this.connectionKeepAliveStrategy = kastrat;
70        this.httpRoutePlanner = rouplan;
71        this.httpProcessor = httpProcessor;
72        this.httpRequestRetryHandler = retryHandler;
73        this.redirectHandler = redirectHandler;
74        this.targetAuthenticationHandler = targetAuthHandler;
75        this.proxyAuthenticationHandler = proxyAuthHandler;
76        this.userTokenHandler = userTokenHandler;
77        this.httpParams = params;
78
79        try {
80            redirector = new com.xtremelabs.robolectric.tester.org.apache.http.impl.client.DefaultRequestDirector(
81                  log,
82                  requestExec,
83                  conman,
84                  reustrat,
85                  kastrat,
86                  rouplan,
87                  httpProcessor,
88                  retryHandler,
89                  redirectHandler,
90                  targetAuthHandler,
91                  proxyAuthHandler,
92                  userTokenHandler,
93                  params
94            );
95        } catch (IllegalArgumentException ignored) {
96            Robolectric.getFakeHttpLayer().interceptHttpRequests(true);
97        }
98    }
99
100    public void __constructor__(
101            HttpRequestExecutor requestExec,
102            ClientConnectionManager conman,
103            ConnectionReuseStrategy reustrat,
104            ConnectionKeepAliveStrategy kastrat,
105            HttpRoutePlanner rouplan,
106            HttpProcessor httpProcessor,
107            HttpRequestRetryHandler retryHandler,
108            RedirectHandler redirectHandler,
109            AuthenticationHandler targetAuthHandler,
110            AuthenticationHandler proxyAuthHandler,
111            UserTokenHandler userTokenHandler,
112            HttpParams params) {
113        __constructor__(
114                LogFactory.getLog(DefaultRequestDirector.class),
115                requestExec,
116                conman,
117                reustrat,
118                kastrat,
119                rouplan,
120                httpProcessor,
121                retryHandler,
122                redirectHandler,
123                targetAuthHandler,
124                proxyAuthHandler,
125                userTokenHandler,
126                params);
127    }
128
129    public static HttpRequest getSentHttpRequest(int index) {
130        return getSentHttpRequestInfo(index).getHttpRequest();
131    }
132
133    public static HttpRequest getLatestSentHttpRequest() {
134        return getLatestSentHttpRequestInfo().getHttpRequest();
135    }
136
137    public static HttpRequestInfo getLatestSentHttpRequestInfo() {
138        int requestCount = Robolectric.getFakeHttpLayer().getSentHttpRequestInfos().size();
139        return Robolectric.getFakeHttpLayer().getSentHttpRequestInfo(requestCount - 1);
140    }
141
142    public static HttpRequestInfo getSentHttpRequestInfo(int index) {
143        return Robolectric.getFakeHttpLayer().getSentHttpRequestInfo(index);
144    }
145
146    @Implementation
147    public HttpResponse execute(HttpHost httpHost, HttpRequest httpRequest, HttpContext httpContext) throws HttpException, IOException {
148        if (Robolectric.getFakeHttpLayer().isInterceptingHttpRequests()) {
149            return Robolectric.getFakeHttpLayer().emulateRequest(httpHost, httpRequest, httpContext, realObject);
150        } else {
151            return redirector.execute(httpHost, httpRequest, httpContext);
152        }
153    }
154
155    public Log getLog() {
156        return log;
157    }
158
159    public ClientConnectionManager getConnectionManager() {
160        return connectionManager;
161    }
162
163    public HttpRoutePlanner getHttpRoutePlanner() {
164        return httpRoutePlanner;
165    }
166
167    public ConnectionReuseStrategy getConnectionReuseStrategy() {
168        return connectionReuseStrategy;
169    }
170
171    public ConnectionKeepAliveStrategy getConnectionKeepAliveStrategy() {
172        return connectionKeepAliveStrategy;
173    }
174
175    public HttpRequestExecutor getHttpRequestExecutor() {
176        return httpRequestExecutor;
177    }
178
179    public HttpProcessor getHttpProcessor() {
180        return httpProcessor;
181    }
182
183    public HttpRequestRetryHandler getHttpRequestRetryHandler() {
184        return httpRequestRetryHandler;
185    }
186
187    public RedirectHandler getRedirectHandler() {
188        return redirectHandler;
189    }
190
191    public AuthenticationHandler getTargetAuthenticationHandler() {
192        return targetAuthenticationHandler;
193    }
194
195    public AuthenticationHandler getProxyAuthenticationHandler() {
196        return proxyAuthenticationHandler;
197    }
198
199    public UserTokenHandler getUserTokenHandler() {
200        return userTokenHandler;
201    }
202
203    public HttpParams getHttpParams() {
204        return httpParams;
205    }
206}