Browse Source

Extract the capability parsing logic in {Upload,Receive}Pack

Change-Id: I7ac4e0ae98872a74b01162b5ca936fb15e2f8cff
stable-2.0
Dave Borowitz 13 years ago
parent
commit
d2787d481e
  1. 43
      org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java
  2. 49
      org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java

43
org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java

@ -98,6 +98,39 @@ import org.eclipse.jgit.util.io.TimeoutOutputStream;
* Implements the server side of a push connection, receiving objects. * Implements the server side of a push connection, receiving objects.
*/ */
public class ReceivePack { public class ReceivePack {
/** Data in the first line of a request, the line itself plus capabilities. */
public static class FirstLine {
private final String line;
private final Set<String> capabilities;
/**
* Parse the first line of a receive-pack request.
*
* @param line
* line from the client.
*/
public FirstLine(String line) {
final HashSet<String> caps = new HashSet<String>();
final int nul = line.indexOf('\0');
if (nul >= 0) {
for (String c : line.substring(nul + 1).split(" "))
caps.add(c);
}
this.line = line.substring(0, nul);
this.capabilities = Collections.unmodifiableSet(caps);
}
/** @return non-capabilities part of the line. */
public String getLine() {
return line;
}
/** @return capabilities parsed from the line. */
public Set<String> getCapabilities() {
return capabilities;
}
}
/** Database we write the stored objects into. */ /** Database we write the stored objects into. */
private final Repository db; private final Repository db;
@ -713,7 +746,6 @@ public class ReceivePack {
pckOut = new PacketLineOut(rawOut); pckOut = new PacketLineOut(rawOut);
pckOut.setFlushOnEnd(false); pckOut.setFlushOnEnd(false);
enabledCapabilities = new HashSet<String>();
commands = new ArrayList<ReceiveCommand>(); commands = new ArrayList<ReceiveCommand>();
service(); service();
@ -891,12 +923,9 @@ public class ReceivePack {
break; break;
if (commands.isEmpty()) { if (commands.isEmpty()) {
final int nul = line.indexOf('\0'); final FirstLine firstLine = new FirstLine(line);
if (nul >= 0) { enabledCapabilities = firstLine.getCapabilities();
for (String c : line.substring(nul + 1).split(" ")) line = firstLine.getLine();
enabledCapabilities.add(c);
line = line.substring(0, nul);
}
} }
if (line.length() < 83) { if (line.length() < 83) {

49
org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java

@ -118,6 +118,44 @@ public class UploadPack {
ANY; ANY;
} }
/** Data in the first line of a request, the line itself plus options. */
public static class FirstLine {
private final String line;
private final Set<String> options;
/**
* Parse the first line of a receive-pack request.
*
* @param line
* line from the client.
*/
public FirstLine(String line) {
if (line.length() > 45) {
final HashSet<String> opts = new HashSet<String>();
String opt = line.substring(45);
if (opt.startsWith(" "))
opt = opt.substring(1);
for (String c : opt.split(" "))
opts.add(c);
this.line = line.substring(0, 45);
this.options = Collections.unmodifiableSet(opts);
} else {
this.line = line;
this.options = Collections.emptySet();
}
}
/** @return non-capabilities part of the line. */
public String getLine() {
return line;
}
/** @return options parsed from the line. */
public Set<String> getOptions() {
return options;
}
}
/** Database we read the objects from. */ /** Database we read the objects from. */
private final Repository db; private final Repository db;
@ -167,7 +205,7 @@ public class UploadPack {
private PreUploadHook preUploadHook = PreUploadHook.NULL; private PreUploadHook preUploadHook = PreUploadHook.NULL;
/** Capabilities requested by the client. */ /** Capabilities requested by the client. */
private final Set<String> options = new HashSet<String>(); private Set<String> options;
/** Raw ObjectIds the client has asked for, before validating them. */ /** Raw ObjectIds the client has asked for, before validating them. */
private final Set<ObjectId> wantIds = new HashSet<ObjectId>(); private final Set<ObjectId> wantIds = new HashSet<ObjectId>();
@ -664,12 +702,9 @@ public class UploadPack {
throw new PackProtocolException(MessageFormat.format(JGitText.get().expectedGot, "want", line)); throw new PackProtocolException(MessageFormat.format(JGitText.get().expectedGot, "want", line));
if (isFirst && line.length() > 45) { if (isFirst && line.length() > 45) {
String opt = line.substring(45); final FirstLine firstLine = new FirstLine(line);
if (opt.startsWith(" ")) options = firstLine.getOptions();
opt = opt.substring(1); line = firstLine.getLine();
for (String c : opt.split(" "))
options.add(c);
line = line.substring(0, 45);
} }
wantIds.add(ObjectId.fromString(line.substring(5))); wantIds.add(ObjectId.fromString(line.substring(5)));

Loading…
Cancel
Save