28
28
import org.apache.maven.wagon.authentication.AuthenticationInfo;
29
29
import org.apache.maven.wagon.authorization.AuthorizationException;
30
30
import org.apache.maven.wagon.proxy.ProxyInfo;
31
import org.apache.maven.wagon.proxy.ProxyInfoProvider;
31
32
import org.apache.maven.wagon.repository.Repository;
32
33
import org.apache.maven.wagon.resource.Resource;
33
34
import org.codehaus.plexus.util.FileUtils;
204
207
assertEquals( "Maven-Wagon/1.0", handler.headers.get( "User-Agent" ) );
210
public void testUserAgentHeaderIsPresentByDefault()
213
StreamingWagon wagon = (StreamingWagon) getWagon();
214
Server server = new Server( 0 );
215
TestHeaderHandler handler = new TestHeaderHandler();
216
server.setHandler( handler );
217
addConnectors( server );
219
wagon.connect( new Repository( "id", getProtocol() + "://localhost:"
220
+ server.getConnectors()[0].getLocalPort() ) );
221
wagon.getToStream( "resource", new ByteArrayOutputStream() );
225
assertNotNull( "default User-Agent header of wagon provider should be present",
226
handler.headers.get( "User-Agent" ) );
229
public void testUserAgentHeaderIsPresentOnlyOnceIfSetMultipleTimes()
232
StreamingWagon wagon = (StreamingWagon) getWagon();
234
// 1. set User-Agent header via HttpConfiguration
235
Properties headers1 = new Properties();
236
headers1.setProperty( "User-Agent", "test-user-agent" );
237
setHttpHeaders( wagon, headers1 );
239
// 2. redundantly set User-Agent header via setHttpHeaders()
240
Properties headers2 = new Properties();
241
headers2.setProperty( "User-Agent", "test-user-agent" );
242
Method setHttpHeaders = wagon.getClass().getMethod( "setHttpHeaders", Properties.class );
243
setHttpHeaders.invoke( wagon, headers2 );
245
Server server = new Server( 0 );
246
TestHeaderHandler handler = new TestHeaderHandler();
247
server.setHandler( handler );
248
addConnectors( server );
250
wagon.connect( new Repository( "id", getProtocol() + "://localhost:"
251
+ server.getConnectors()[0].getLocalPort() ) );
252
wagon.getToStream( "resource", new ByteArrayOutputStream() );
256
assertEquals( "test-user-agent", handler.headers.get( "User-Agent" ) );
207
260
protected abstract void setHttpHeaders( StreamingWagon wagon, Properties properties );
209
262
protected void addConnectors( Server server )
262
315
if ( called.get() )
264
response.setStatus( 200 );
317
response.setStatus( HttpServletResponse.SC_OK );
265
318
( (Request) request ).setHandled( true );
269
322
called.set( true );
270
response.setStatus( 429 );
323
response.setStatus( SC_TOO_MANY_REQUESTS );
271
324
( (Request) request ).setHandled( true );
555
608
if ( supportProxyPreemptiveAuthentication() )
557
assertEquals( 200, handler.handlerRequestResponses.get( 0 ).responseCode );
561
assertEquals( 407, handler.handlerRequestResponses.get( 0 ).responseCode );
562
assertEquals( 200, handler.handlerRequestResponses.get( 1 ).responseCode );
610
assertEquals( HttpServletResponse.SC_OK, handler.handlerRequestResponses.get( 0 ).responseCode );
614
assertEquals( HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED,
615
handler.handlerRequestResponses.get( 0 ).responseCode );
616
assertEquals( HttpServletResponse.SC_OK, handler.handlerRequestResponses.get( 1 ).responseCode );
621
public void testProxiedRequestWithAuthenticationWithProvider()
624
final ProxyInfo proxyInfo = createProxyInfo();
625
proxyInfo.setUserName( "user" );
626
proxyInfo.setPassword( "secret" );
627
AuthorizingProxyHandler handler = new AuthorizingProxyHandler();
629
ProxyInfoProvider proxyInfoProvider = new ProxyInfoProvider()
631
public ProxyInfo getProxyInfo( String protocol )
636
runTestProxiedRequestWithProvider( proxyInfoProvider, handler );
638
assertTrue( handler.headers.containsKey( "Proxy-Authorization" ) );
640
if ( supportProxyPreemptiveAuthentication() )
642
assertEquals( HttpServletResponse.SC_OK, handler.handlerRequestResponses.get( 0 ).responseCode );
646
assertEquals( HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED,
647
handler.handlerRequestResponses.get( 0 ).responseCode );
648
assertEquals( HttpServletResponse.SC_OK, handler.handlerRequestResponses.get( 1 ).responseCode );
596
682
String redirectUrl = protocol + "://localhost:" + server.getConnectors()[0].getLocalPort();
598
RedirectHandler redirectHandler = new RedirectHandler( "Found", 303, redirectUrl, null );
684
RedirectHandler redirectHandler =
685
new RedirectHandler( "Found", HttpServletResponse.SC_SEE_OTHER, redirectUrl, null );
600
687
redirectServer.setHandler( redirectHandler );
615
702
String found = FileUtils.fileRead( tmpResult );
616
703
assertEquals( "found:'" + found + "'", "Hello, World!", found );
618
assertEquals( 1, handler.handlerRequestResponses.size() );
619
assertEquals( 200, handler.handlerRequestResponses.get( 0 ).responseCode );
620
assertEquals( 1, redirectHandler.handlerRequestResponses.size() );
621
assertEquals( 302, redirectHandler.handlerRequestResponses.get( 0 ).responseCode );
705
checkHandlerResult( handler.handlerRequestResponses, HttpServletResponse.SC_OK );
706
checkHandlerResult( redirectHandler.handlerRequestResponses, HttpServletResponse.SC_FOUND );
662
747
String redirectUrl = protocol + "://localhost:" + server.getConnectors()[0].getLocalPort();
664
RedirectHandler redirectHandler = new RedirectHandler( "Found", 303, redirectUrl, null );
749
RedirectHandler redirectHandler =
750
new RedirectHandler( "Found", HttpServletResponse.SC_SEE_OTHER, redirectUrl, null );
666
752
redirectServer.setHandler( redirectHandler );
677
763
String found = FileUtils.fileRead( tmpResult );
678
764
assertEquals( "found:'" + found + "'", "Hello, World!", found );
680
assertEquals( 1, handler.handlerRequestResponses.size() );
681
assertEquals( 200, handler.handlerRequestResponses.get( 0 ).responseCode );
682
assertEquals( 1, redirectHandler.handlerRequestResponses.size() );
683
assertEquals( 302, redirectHandler.handlerRequestResponses.get( 0 ).responseCode );
766
checkHandlerResult( handler.handlerRequestResponses, HttpServletResponse.SC_OK );
767
checkHandlerResult( redirectHandler.handlerRequestResponses, HttpServletResponse.SC_FOUND );
730
814
String redirectUrl = protocol + "://localhost:" + realServer.getConnectors()[0].getLocalPort();
732
RedirectHandler redirectHandler = new RedirectHandler( "Found", 303, redirectUrl, repositoryDirectory );
816
RedirectHandler redirectHandler =
817
new RedirectHandler( "Found", HttpServletResponse.SC_SEE_OTHER, redirectUrl, repositoryDirectory );
734
819
redirectServer.setHandler( redirectHandler );
776
861
protected void checkRequestResponseForRedirectPutFromStreamWithFullUrl( PutHandler putHandler,
777
862
RedirectHandler redirectHandler )
779
assertEquals( "found:" + putHandler.handlerRequestResponses, 1, putHandler.handlerRequestResponses.size() );
780
assertEquals( "found:" + putHandler.handlerRequestResponses, 201,
781
putHandler.handlerRequestResponses.get( 0 ).responseCode );
782
assertEquals( "found:" + redirectHandler.handlerRequestResponses, 1,
783
redirectHandler.handlerRequestResponses.size() );
784
assertEquals( "found:" + redirectHandler.handlerRequestResponses, 302,
785
redirectHandler.handlerRequestResponses.get( 0 ).responseCode );
864
checkHandlerResult( putHandler.handlerRequestResponses, HttpServletResponse.SC_CREATED );
865
checkHandlerResult( redirectHandler.handlerRequestResponses, HttpServletResponse.SC_FOUND );
788
868
public void testRedirectPutFromStreamRelativeUrl()
805
885
addConnectors( redirectServer );
807
887
RedirectHandler redirectHandler =
808
new RedirectHandler( "Found", 303, "/redirectRequest/foo", repositoryDirectory );
888
new RedirectHandler( "Found", HttpServletResponse.SC_SEE_OTHER, "/redirectRequest/foo",
889
repositoryDirectory );
810
891
redirectServer.setHandler( redirectHandler );
853
934
protected void checkRequestResponseForRedirectPutFromStreamWithRelativeUrl( PutHandler putHandler,
854
935
RedirectHandler redirectHandler )
856
assertEquals( "found:" + putHandler.handlerRequestResponses, 0, putHandler.handlerRequestResponses.size() );
858
assertEquals( "found:" + redirectHandler.handlerRequestResponses, 2,
859
redirectHandler.handlerRequestResponses.size() );
860
assertEquals( "found:" + redirectHandler.handlerRequestResponses, 302,
861
redirectHandler.handlerRequestResponses.get( 0 ).responseCode );
862
assertEquals( "found:" + redirectHandler.handlerRequestResponses, 201,
863
redirectHandler.handlerRequestResponses.get( 1 ).responseCode );
937
checkHandlerResult( putHandler.handlerRequestResponses );
938
checkHandlerResult( redirectHandler.handlerRequestResponses, HttpServletResponse.SC_FOUND,
939
HttpServletResponse.SC_CREATED );
942
protected void checkHandlerResult( List<HandlerRequestResponse> handlerRequestResponses,
943
int... expectedResponseCodes )
945
boolean success = true;
946
if ( handlerRequestResponses.size() == expectedResponseCodes.length )
948
for ( int i = 0; i < expectedResponseCodes.length; i++ )
950
success &= ( expectedResponseCodes[i] == handlerRequestResponses.get( i ).responseCode );
956
fail( "expected " + expectedResponseCodes + ", got " + handlerRequestResponses );
867
960
public void testRedirectPutFileWithFullUrl()
901
994
String redirectUrl = protocol + "://localhost:" + realServer.getConnectors()[0].getLocalPort();
903
RedirectHandler redirectHandler = new RedirectHandler( "Found", 303, redirectUrl, repositoryDirectory );
996
RedirectHandler redirectHandler =
997
new RedirectHandler( "Found", HttpServletResponse.SC_SEE_OTHER, redirectUrl, repositoryDirectory );
905
999
redirectServer.setHandler( redirectHandler );
961
1055
addConnectors( redirectServer );
963
1057
RedirectHandler redirectHandler =
964
new RedirectHandler( "Found", 303, "/redirectRequest/foo", repositoryDirectory );
1058
new RedirectHandler( "Found", HttpServletResponse.SC_SEE_OTHER, "/redirectRequest/foo",
1059
repositoryDirectory );
966
1061
redirectServer.setHandler( redirectHandler );
1203
private void runTestProxiedRequestWithProvider( ProxyInfoProvider proxyInfoProvider, TestHeaderHandler handler )
1206
// what an UGLY hack!
1207
// but apparently jetty needs some time to free up resources
1208
// <5s: broken test :(
1209
// CHECKSTYLE_OFF: MagicNumber
1210
Thread.sleep( 5001L );
1211
// CHECKSTYLE_ON: MagicNumber
1213
Server proxyServer = new Server( 0 );
1215
proxyServer.setHandler( handler );
1217
proxyServer.start();
1219
proxyInfoProvider.getProxyInfo( null ).setPort( proxyServer.getConnectors()[0].getLocalPort() );
1221
System.out.println( "start proxy on host/port " + proxyInfoProvider.getProxyInfo( null ).getHost() + "/"
1222
+ proxyInfoProvider.getProxyInfo( null ).getPort() + " with non proxyHosts "
1223
+ proxyInfoProvider.getProxyInfo( null ).getNonProxyHosts() );
1225
while ( !proxyServer.isRunning() || !proxyServer.isStarted() )
1232
StreamingWagon wagon = (StreamingWagon) getWagon();
1234
Repository testRepository = new Repository( "id", "http://www.example.com/" );
1236
String localRepositoryPath = FileTestUtils.getTestOutputDir().toString();
1237
File sourceFile = new File( localRepositoryPath, "test-proxied-resource" );
1238
FileUtils.fileWrite( sourceFile.getAbsolutePath(), "content" );
1240
wagon.connect( testRepository, proxyInfoProvider );
1244
wagon.getToStream( "test-proxied-resource", new ByteArrayOutputStream() );
1246
assertTrue( handler.headers.containsKey( "Proxy-Connection" ) );
1250
System.setProperty( "http.proxyHost", "" );
1251
System.setProperty( "http.proxyPort", "" );
1102
1261
private ProxyInfo createProxyInfo()
1104
1263
ProxyInfo proxyInfo = new ProxyInfo();
1728
1887
assertEquals( "not 1 security handler use " + sh.handlerRequestResponses, 1,
1729
1888
sh.handlerRequestResponses.size() );
1730
assertEquals( 200, sh.handlerRequestResponses.get( 0 ).responseCode );
1889
assertEquals( HttpServletResponse.SC_OK, sh.handlerRequestResponses.get( 0 ).responseCode );
1734
1893
assertEquals( "not 2 security handler use " + sh.handlerRequestResponses, 2,
1735
1894
sh.handlerRequestResponses.size() );
1736
assertEquals( 401, sh.handlerRequestResponses.get( 0 ).responseCode );
1737
assertEquals( 200, sh.handlerRequestResponses.get( 1 ).responseCode );
1895
assertEquals( HttpServletResponse.SC_UNAUTHORIZED, sh.handlerRequestResponses.get( 0 ).responseCode );
1896
assertEquals( HttpServletResponse.SC_OK, sh.handlerRequestResponses.get( 1 ).responseCode );
1808
1971
public void handle( String target, HttpServletRequest request, HttpServletResponse response, int dispatch )
1809
1972
throws IOException, ServletException
1811
Request base_request =
1974
Request baseRequest =
1812
1975
request instanceof Request ? (Request) request : HttpConnection.getCurrentConnection().getRequest();
1814
if ( base_request.isHandled() || !"PUT".equals( base_request.getMethod() ) )
1977
if ( baseRequest.isHandled() || !"PUT".equals( baseRequest.getMethod() ) )
1819
base_request.setHandled( true );
1982
baseRequest.setHandled( true );
1821
1984
File file = new File( resourceBase, URLDecoder.decode( request.getPathInfo() ) );
1822
1985
file.getParentFile().mkdirs();
1861
2024
if ( request.getHeader( "Proxy-Authorization" ) == null )
1863
2026
handlerRequestResponses.add(
1864
new HandlerRequestResponse( request.getMethod(), 407, request.getRequestURI() ) );
1865
response.setStatus( 407 );
2027
new HandlerRequestResponse( request.getMethod(),
2028
HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED,
2029
request.getRequestURI() ) );
2030
response.setStatus( HttpServletResponse.SC_PROXY_AUTHENTICATION_REQUIRED );
1866
2031
response.addHeader( "Proxy-Authenticate", "Basic realm=\"Squid proxy-caching web server\"" );
1868
2033
( (Request) request ).setHandled( true );
1871
2036
handlerRequestResponses.add(
1872
new HandlerRequestResponse( request.getMethod(), 200, request.getRequestURI() ) );
2037
new HandlerRequestResponse( request.getMethod(), HttpServletResponse.SC_OK, request.getRequestURI() ) );
1873
2038
super.handle( target, request, response, dispatch );
2045
@SuppressWarnings( "checkstyle:visibilitymodifier" )
1877
2046
private static class TestHeaderHandler
1878
2047
extends AbstractHandler
1892
2061
for ( Enumeration<String> e = request.getHeaderNames(); e.hasMoreElements(); )
1894
2063
String name = e.nextElement();
1895
headers.put( name, request.getHeader( name ) );
2064
Enumeration headerValues = request.getHeaders( name );
2065
// as per HTTP spec http://www.w3.org/Protocols/rfc2616/rfc2616-sec4.html
2066
// multiple values for the same header key are concatenated separated by comma
2067
// otherwise we wouldn't notice headers with same key added multiple times
2068
StringBuffer combinedHeaderValue = new StringBuffer();
2069
for ( int i = 0; headerValues.hasMoreElements(); i++ )
2073
combinedHeaderValue.append( "," );
2075
combinedHeaderValue.append( headerValues.nextElement() );
2077
headers.put( name, combinedHeaderValue.toString() );
1898
2080
response.setContentType( "text/plain" );