Extract the capability parsing logic in {Upload,Receive}Pack
Change-Id: I7ac4e0ae98872a74b01162b5ca936fb15e2f8cff
This commit is contained in:
parent
2b0044f222
commit
d2787d481e
|
@ -98,6 +98,39 @@
|
||||||
* 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 void receive(final InputStream input, final OutputStream output,
|
||||||
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 @@ private void recvCommands() throws IOException {
|
||||||
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) {
|
||||||
|
|
|
@ -118,6 +118,44 @@ public static enum RequestPolicy {
|
||||||
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 static enum RequestPolicy {
|
||||||
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 @@ private void recvWants() throws IOException {
|
||||||
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…
Reference in New Issue