@ -73,6 +73,7 @@ import java.util.Arrays;
import java.util.Collection ;
import java.util.Collections ;
import java.util.EnumSet ;
import java.util.HashSet ;
import java.util.LinkedHashSet ;
import java.util.Map ;
import java.util.Set ;
@ -95,6 +96,7 @@ import org.eclipse.jgit.lib.ProgressMonitor;
import org.eclipse.jgit.lib.Ref ;
import org.eclipse.jgit.lib.Repository ;
import org.eclipse.jgit.lib.SymbolicRef ;
import org.eclipse.jgit.transport.HttpAuthMethod.Type ;
import org.eclipse.jgit.transport.http.HttpConnection ;
import org.eclipse.jgit.util.HttpSupport ;
import org.eclipse.jgit.util.IO ;
@ -448,9 +450,11 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
throw new NotSupportedException ( MessageFormat . format ( JGitText . get ( ) . invalidURL , uri ) , e ) ;
}
try {
int authAttempts = 1 ;
Collection < Type > ignoreTypes = null ;
for ( ; ; ) {
try {
final HttpConnection conn = httpOpen ( u ) ;
if ( useSmartHttp ) {
String exp = "application/x-" + service + "-advertisement" ; //$NON-NLS-1$ //$NON-NLS-2$
@ -467,7 +471,7 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
// explicit authentication would be required
if ( authMethod . getType ( ) = = HttpAuthMethod . Type . NONE
& & conn . getHeaderField ( HDR_WWW_AUTHENTICATE ) ! = null )
authMethod = HttpAuthMethod . scanResponse ( conn ) ;
authMethod = HttpAuthMethod . scanResponse ( conn , ignoreTypes ) ;
return conn ;
case HttpConnection . HTTP_NOT_FOUND :
@ -475,7 +479,7 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
MessageFormat . format ( JGitText . get ( ) . uriNotFound , u ) ) ;
case HttpConnection . HTTP_UNAUTHORIZED :
authMethod = HttpAuthMethod . scanResponse ( conn ) ;
authMethod = HttpAuthMethod . scanResponse ( conn , ignoreTypes ) ;
if ( authMethod . getType ( ) = = HttpAuthMethod . Type . NONE )
throw new TransportException ( uri , MessageFormat . format (
JGitText . get ( ) . authenticationNotSupported , uri ) ) ;
@ -501,15 +505,29 @@ public class TransportHttp extends HttpTransport implements WalkTransport,
String err = status + " " + conn . getResponseMessage ( ) ; //$NON-NLS-1$
throw new TransportException ( uri , err ) ;
}
}
} catch ( NotSupportedException e ) {
throw e ;
} catch ( TransportException e ) {
throw e ;
} catch ( IOException e ) {
if ( authMethod . getType ( ) ! = HttpAuthMethod . Type . NONE ) {
if ( ignoreTypes = = null ) {
ignoreTypes = new HashSet < Type > ( ) ;
}
ignoreTypes . add ( authMethod . getType ( ) ) ;
// reset auth method & attempts for next authentication type
authMethod = HttpAuthMethod . Type . NONE . method ( null ) ;
authAttempts = 1 ;
continue ;
}
throw new TransportException ( uri , MessageFormat . format ( JGitText . get ( ) . cannotOpenService , service ) , e ) ;
}
}
}
final HttpConnection httpOpen ( URL u ) throws IOException {
return httpOpen ( METHOD_GET , u ) ;