@ -42,11 +42,13 @@
* /
* /
package org.eclipse.jgit.internal.transport.parser ;
package org.eclipse.jgit.internal.transport.parser ;
import java.util.Arrays ;
import static org.eclipse.jgit.transport.GitProtocolConstants.OPTION_AGENT ;
import java.util.Collections ;
import java.util.Collections ;
import java.util.HashSet ;
import java.util.HashSet ;
import java.util.Set ;
import java.util.Set ;
import org.eclipse.jgit.annotations.Nullable ;
import org.eclipse.jgit.errors.PackProtocolException ;
import org.eclipse.jgit.errors.PackProtocolException ;
import org.eclipse.jgit.internal.JGitText ;
import org.eclipse.jgit.internal.JGitText ;
@ -72,6 +74,11 @@ public class FirstWant {
private final Set < String > capabilities ;
private final Set < String > capabilities ;
@Nullable
private final String agent ;
private static final String AGENT_PREFIX = OPTION_AGENT + '=' ;
/ * *
/ * *
* Parse the first want line in the protocol v0 / v1 pack negotiation .
* Parse the first want line in the protocol v0 / v1 pack negotiation .
*
*
@ -84,6 +91,7 @@ public class FirstWant {
public static FirstWant fromLine ( String line ) throws PackProtocolException {
public static FirstWant fromLine ( String line ) throws PackProtocolException {
String wantLine ;
String wantLine ;
Set < String > capabilities ;
Set < String > capabilities ;
String agent = null ;
if ( line . length ( ) > 45 ) {
if ( line . length ( ) > 45 ) {
String opt = line . substring ( 45 ) ;
String opt = line . substring ( 45 ) ;
@ -91,8 +99,15 @@ public class FirstWant {
throw new PackProtocolException ( JGitText . get ( ) . wantNoSpaceWithCapabilities ) ;
throw new PackProtocolException ( JGitText . get ( ) . wantNoSpaceWithCapabilities ) ;
}
}
opt = opt . substring ( 1 ) ;
opt = opt . substring ( 1 ) ;
HashSet < String > opts = new HashSet < > (
Arrays . asList ( opt . split ( " " ) ) ) ; //$NON-NLS-1$
HashSet < String > opts = new HashSet < > ( ) ;
for ( String clientCapability : opt . split ( " " ) ) { //$NON-NLS-1$
if ( clientCapability . startsWith ( AGENT_PREFIX ) ) {
agent = clientCapability . substring ( AGENT_PREFIX . length ( ) ) ;
} else {
opts . add ( clientCapability ) ;
}
}
wantLine = line . substring ( 0 , 45 ) ;
wantLine = line . substring ( 0 , 45 ) ;
capabilities = Collections . unmodifiableSet ( opts ) ;
capabilities = Collections . unmodifiableSet ( opts ) ;
} else {
} else {
@ -100,12 +115,14 @@ public class FirstWant {
capabilities = Collections . emptySet ( ) ;
capabilities = Collections . emptySet ( ) ;
}
}
return new FirstWant ( wantLine , capabilities ) ;
return new FirstWant ( wantLine , capabilities , agent ) ;
}
}
private FirstWant ( String line , Set < String > capabilities ) {
private FirstWant ( String line , Set < String > capabilities ,
@Nullable String agent ) {
this . line = line ;
this . line = line ;
this . capabilities = capabilities ;
this . capabilities = capabilities ;
this . agent = agent ;
}
}
/** @return non-capabilities part of the line. */
/** @return non-capabilities part of the line. */
@ -113,8 +130,17 @@ public class FirstWant {
return line ;
return line ;
}
}
/** @return capabilities parsed from the line as an immutable set. */
/ * *
* @return capabilities parsed from the line as an immutable set ( excluding
* agent ) .
* /
public Set < String > getCapabilities ( ) {
public Set < String > getCapabilities ( ) {
return capabilities ;
return capabilities ;
}
}
/** @return client user agent parsed from the line. */
@Nullable
public String getAgent ( ) {
return agent ;
}
}
}