13
13
package org .asynchttpclient .proxy ;
14
14
15
15
import io .github .artsok .RepeatedIfExceptionsTest ;
16
+ import jakarta .servlet .ServletException ;
17
+ import jakarta .servlet .http .HttpServletRequest ;
18
+ import jakarta .servlet .http .HttpServletResponse ;
19
+
16
20
import org .asynchttpclient .AbstractBasicTest ;
17
21
import org .asynchttpclient .AsyncHttpClient ;
18
22
import org .asynchttpclient .AsyncHttpClientConfig ;
19
23
import org .asynchttpclient .RequestBuilder ;
20
24
import org .asynchttpclient .Response ;
25
+ import org .asynchttpclient .proxy .ProxyServer .Builder ;
21
26
import org .asynchttpclient .request .body .generator .ByteArrayBodyGenerator ;
22
27
import org .asynchttpclient .test .EchoHandler ;
28
+ import org .asynchttpclient .util .HttpConstants ;
23
29
import org .eclipse .jetty .proxy .ConnectHandler ;
30
+ import org .eclipse .jetty .server .Request ;
24
31
import org .eclipse .jetty .server .Server ;
25
32
import org .eclipse .jetty .server .ServerConnector ;
26
33
import org .eclipse .jetty .server .handler .AbstractHandler ;
37
44
import static org .asynchttpclient .test .TestUtils .addHttpsConnector ;
38
45
import static org .junit .jupiter .api .Assertions .assertEquals ;
39
46
47
+ import java .io .IOException ;
48
+
40
49
/**
41
50
* Proxy usage tests.
42
51
*/
@@ -46,7 +55,7 @@ public class HttpsProxyTest extends AbstractBasicTest {
46
55
47
56
@ Override
48
57
public AbstractHandler configureHandler () throws Exception {
49
- return new ConnectHandler ();
58
+ return new ProxyHandler ();
50
59
}
51
60
52
61
@ Override
@@ -142,4 +151,38 @@ public void testPooledConnectionsWithProxy() throws Exception {
142
151
assertEquals (200 , response2 .getStatusCode ());
143
152
}
144
153
}
154
+
155
+ @ RepeatedIfExceptionsTest (repeats = 5 )
156
+ public void testFailedConnectWithProxy () throws Exception {
157
+ try (AsyncHttpClient asyncHttpClient = asyncHttpClient (config ().setFollowRedirect (true ).setUseInsecureTrustManager (true ).setKeepAlive (true ))) {
158
+ Builder proxyServer = proxyServer ("localhost" , port1 );
159
+ proxyServer .setCustomHeaders (r -> r .getHeaders ().add (ProxyHandler .HEADER_FORBIDDEN , "1" ));
160
+ RequestBuilder rb = get (getTargetUrl2 ()).setProxyServer (proxyServer );
161
+
162
+ Response response1 = asyncHttpClient .executeRequest (rb .build ()).get ();
163
+ assertEquals (403 , response1 .getStatusCode ());
164
+
165
+ Response response2 = asyncHttpClient .executeRequest (rb .build ()).get ();
166
+ assertEquals (403 , response2 .getStatusCode ());
167
+
168
+ Response response3 = asyncHttpClient .executeRequest (rb .build ()).get ();
169
+ assertEquals (403 , response3 .getStatusCode ());
170
+ }
171
+ }
172
+
173
+ public static class ProxyHandler extends ConnectHandler {
174
+ final static String HEADER_FORBIDDEN = "X-REJECT-REQUEST" ;
175
+
176
+ @ Override
177
+ public void handle (String s , Request r , HttpServletRequest request , HttpServletResponse response ) throws IOException , ServletException {
178
+ if (HttpConstants .Methods .CONNECT .equalsIgnoreCase (request .getMethod ())) {
179
+ if (request .getHeader (HEADER_FORBIDDEN ) != null ) {
180
+ response .setStatus (HttpServletResponse .SC_FORBIDDEN );
181
+ r .setHandled (true );
182
+ return ;
183
+ }
184
+ }
185
+ super .handle (s , r , request , response );
186
+ }
187
+ }
145
188
}
0 commit comments