1313package org .asynchttpclient .proxy ;
1414
1515import io .github .artsok .RepeatedIfExceptionsTest ;
16+ import jakarta .servlet .ServletException ;
17+ import jakarta .servlet .http .HttpServletRequest ;
18+ import jakarta .servlet .http .HttpServletResponse ;
19+
1620import org .asynchttpclient .AbstractBasicTest ;
1721import org .asynchttpclient .AsyncHttpClient ;
1822import org .asynchttpclient .AsyncHttpClientConfig ;
1923import org .asynchttpclient .RequestBuilder ;
2024import org .asynchttpclient .Response ;
25+ import org .asynchttpclient .proxy .ProxyServer .Builder ;
2126import org .asynchttpclient .request .body .generator .ByteArrayBodyGenerator ;
2227import org .asynchttpclient .test .EchoHandler ;
28+ import org .asynchttpclient .util .HttpConstants ;
2329import org .eclipse .jetty .proxy .ConnectHandler ;
30+ import org .eclipse .jetty .server .Request ;
2431import org .eclipse .jetty .server .Server ;
2532import org .eclipse .jetty .server .ServerConnector ;
2633import org .eclipse .jetty .server .handler .AbstractHandler ;
3744import static org .asynchttpclient .test .TestUtils .addHttpsConnector ;
3845import static org .junit .jupiter .api .Assertions .assertEquals ;
3946
47+ import java .io .IOException ;
48+
4049/**
4150 * Proxy usage tests.
4251 */
@@ -46,7 +55,7 @@ public class HttpsProxyTest extends AbstractBasicTest {
4655
4756 @ Override
4857 public AbstractHandler configureHandler () throws Exception {
49- return new ConnectHandler ();
58+ return new ProxyHandler ();
5059 }
5160
5261 @ Override
@@ -142,4 +151,38 @@ public void testPooledConnectionsWithProxy() throws Exception {
142151 assertEquals (200 , response2 .getStatusCode ());
143152 }
144153 }
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+ }
145188}
0 commit comments