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 ;
2734import org .junit .jupiter .api .AfterEach ;
2835import org .junit .jupiter .api .BeforeEach ;
36+ import org .junit .jupiter .api .Test ;
2937
3038import static org .asynchttpclient .Dsl .asyncHttpClient ;
3139import static org .asynchttpclient .Dsl .config ;
3745import static org .asynchttpclient .test .TestUtils .addHttpsConnector ;
3846import static org .junit .jupiter .api .Assertions .assertEquals ;
3947
48+ import java .io .IOException ;
49+
4050/**
4151 * Proxy usage tests.
4252 */
@@ -46,7 +56,7 @@ public class HttpsProxyTest extends AbstractBasicTest {
4656
4757 @ Override
4858 public AbstractHandler configureHandler () throws Exception {
49- return new ConnectHandler ();
59+ return new ProxyHandler ();
5060 }
5161
5262 @ Override
@@ -142,4 +152,38 @@ public void testPooledConnectionsWithProxy() throws Exception {
142152 assertEquals (200 , response2 .getStatusCode ());
143153 }
144154 }
155+
156+ @ RepeatedIfExceptionsTest (repeats = 5 )
157+ public void testFailedConnectWithProxy () throws Exception {
158+ try (AsyncHttpClient asyncHttpClient = asyncHttpClient (config ().setFollowRedirect (true ).setUseInsecureTrustManager (true ).setKeepAlive (true ))) {
159+ Builder proxyServer = proxyServer ("localhost" , port1 );
160+ proxyServer .setCustomHeaders (r -> r .getHeaders ().add (ProxyHandler .HEADER_FORBIDDEN , "1" ));
161+ RequestBuilder rb = get (getTargetUrl2 ()).setProxyServer (proxyServer );
162+
163+ Response response1 = asyncHttpClient .executeRequest (rb .build ()).get ();
164+ assertEquals (403 , response1 .getStatusCode ());
165+
166+ Response response2 = asyncHttpClient .executeRequest (rb .build ()).get ();
167+ assertEquals (403 , response2 .getStatusCode ());
168+
169+ Response response3 = asyncHttpClient .executeRequest (rb .build ()).get ();
170+ assertEquals (403 , response3 .getStatusCode ());
171+ }
172+ }
173+
174+ public static class ProxyHandler extends ConnectHandler {
175+ final static String HEADER_FORBIDDEN = "X-REJECT-REQUEST" ;
176+
177+ @ Override
178+ public void handle (String s , Request r , HttpServletRequest request , HttpServletResponse response ) throws IOException , ServletException {
179+ if (HttpConstants .Methods .CONNECT .equalsIgnoreCase (request .getMethod ())) {
180+ if (request .getHeader (HEADER_FORBIDDEN ) != null ) {
181+ response .setStatus (HttpServletResponse .SC_FORBIDDEN );
182+ r .setHandled (true );
183+ return ;
184+ }
185+ }
186+ super .handle (s , r , request , response );
187+ }
188+ }
145189}
0 commit comments