diff options
author | Dave Borowitz <dborowitz@google.com> | 2012-03-07 12:53:49 -0800 |
---|---|---|
committer | Dave Borowitz <dborowitz@google.com> | 2012-03-07 12:53:49 -0800 |
commit | d2787d481efcd5f883d52eed5029be380196f0ef (patch) | |
tree | 5e290540a8f8db14aba84c7c6b6dce726a1557e7 /org.eclipse.jgit | |
parent | 2b0044f2225d5ba10c74a5f4b210a9301ab06a60 (diff) | |
download | jgit-d2787d481efcd5f883d52eed5029be380196f0ef.tar.gz jgit-d2787d481efcd5f883d52eed5029be380196f0ef.zip |
Extract the capability parsing logic in {Upload,Receive}Pack
Change-Id: I7ac4e0ae98872a74b01162b5ca936fb15e2f8cff
Diffstat (limited to 'org.eclipse.jgit')
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java | 43 | ||||
-rw-r--r-- | org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java | 49 |
2 files changed, 78 insertions, 14 deletions
diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java index f74e6661ba..0b43560912 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/ReceivePack.java +++ b/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. */ 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. */ private final Repository db; @@ -713,7 +746,6 @@ public class ReceivePack { pckOut = new PacketLineOut(rawOut); pckOut.setFlushOnEnd(false); - enabledCapabilities = new HashSet<String>(); commands = new ArrayList<ReceiveCommand>(); service(); @@ -891,12 +923,9 @@ public class ReceivePack { break; if (commands.isEmpty()) { - final int nul = line.indexOf('\0'); - if (nul >= 0) { - for (String c : line.substring(nul + 1).split(" ")) - enabledCapabilities.add(c); - line = line.substring(0, nul); - } + final FirstLine firstLine = new FirstLine(line); + enabledCapabilities = firstLine.getCapabilities(); + line = firstLine.getLine(); } if (line.length() < 83) { diff --git a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java index c61a23cabb..fd3df85db5 100644 --- a/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java +++ b/org.eclipse.jgit/src/org/eclipse/jgit/transport/UploadPack.java @@ -118,6 +118,44 @@ public class UploadPack { 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. */ private final Repository db; @@ -167,7 +205,7 @@ public class UploadPack { private PreUploadHook preUploadHook = PreUploadHook.NULL; /** 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. */ 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)); if (isFirst && line.length() > 45) { - String opt = line.substring(45); - if (opt.startsWith(" ")) - opt = opt.substring(1); - for (String c : opt.split(" ")) - options.add(c); - line = line.substring(0, 45); + final FirstLine firstLine = new FirstLine(line); + options = firstLine.getOptions(); + line = firstLine.getLine(); } wantIds.add(ObjectId.fromString(line.substring(5))); |