Commit c4d0fa85b1032690a89989bf15f984b3840b3eee

Carlos Martín Nieto 2011-06-16T01:54:19

Implement and use git_pkt_send_request This makes it easier to send a requqest for an URL. It assumes there is a socket where the string should go out to. Make git_pkt_gen_proto accept a command parameter, which defaults to git-upload-pack Signed-off-by: Carlos Martín Nieto <carlos@cmartin.tk>

diff --git a/include/git2/pkt.h b/include/git2/pkt.h
index 79c5828..7a91ed4 100644
--- a/include/git2/pkt.h
+++ b/include/git2/pkt.h
@@ -54,6 +54,7 @@ struct git_pkt_ref {
 /**
  * Create a git protocol request.
  */
-int git_pkt_gen_proto(char **out, int *outlen, const char *url);
+int git_pkt_gen_proto(char **out, int *outlen, const char *cmd, const char *url);
+int git_pkt_send_request(int socket, const char *cmd, const char *url);
 int git_pkt_parse_line(git_pkt **head, const char *line, const char **out, unsigned int len);
 void git_pkt_free(git_pkt *pkt);
diff --git a/src/pkt.c b/src/pkt.c
index 17edf32..a7365cc 100644
--- a/src/pkt.c
+++ b/src/pkt.c
@@ -29,6 +29,7 @@
 
 #include "common.h"
 #include "util.h"
+#include "netops.h"
 
 #include <ctype.h>
 
@@ -207,10 +208,10 @@ void git_pkt_free(git_pkt *pkt)
  *
  * TODO: the command should not be hard-coded
  */
-int git_pkt_gen_proto(char **out, int *outlen, const char *url)
+int git_pkt_gen_proto(char **out, int *outlen, const char *cmd, const char *url)
 {
 	char *delim, *repo, *ptr;
-	char command[] = "git-upload-pack";
+	char default_command[] = "git-upload-pack";
 	char host[] = "host=";
 	int len;
 
@@ -224,7 +225,10 @@ int git_pkt_gen_proto(char **out, int *outlen, const char *url)
 	if (delim == NULL)
 		delim = strchr(url, '/');
 
-	len = 4 + STRLEN(command) + 1 + strlen(repo) + 1 + STRLEN(host) + (delim - url) + 2;
+	if (cmd == NULL)
+		cmd = default_command;
+
+	len = 4 + strlen(cmd) + 1 + strlen(repo) + 1 + STRLEN(host) + (delim - url) + 2;
 
 	*out = git__malloc(len);
 	if (*out == NULL)
@@ -234,7 +238,30 @@ int git_pkt_gen_proto(char **out, int *outlen, const char *url)
 	ptr = *out;
 	memset(ptr, 0x0, len);
 	/* We expect the return value to be > len - 1 so don't bother checking it */
-	snprintf(ptr, len -1, "%04x%s %s%c%s%s", len - 1, command, repo, 0, host, url);
+	snprintf(ptr, len -1, "%04x%s %s%c%s%s", len - 1, cmd, repo, 0, host, url);
 
 	return GIT_SUCCESS;
 }
+
+int git_pkt_send_request(int s, const char *cmd, const char *url)
+{
+	int error, len;
+	char *msg = NULL;
+
+	error = git_pkt_gen_proto(&msg, &len, cmd, url);
+	if (error < GIT_SUCCESS)
+		goto cleanup;
+
+	error = gitno_send(s, msg, len, 0);
+
+cleanup:
+	free(msg);
+	return error;
+}
+
+int git_pkt_send_flush(int s)
+{
+	char flush[] = "0000";
+
+	return gitno_send(s, flush, STRLEN(flush), 0);
+}
diff --git a/src/transport_git.c b/src/transport_git.c
index 063f382..2441edf 100644
--- a/src/transport_git.c
+++ b/src/transport_git.c
@@ -89,9 +89,9 @@ static int extract_host_and_port(char **host, char **port, const char *url)
 static int do_connect(git_priv *priv, const char *url)
 {
 	int s = -1;
-	char *host, *port, *msg;
+	char *host, *port;
 	const char prefix[] = "git://";
-	int error, msg_len, connected = 0;
+	int error, connected = 0;
 
 	if (!git__prefixcmp(url, prefix))
 		url += STRLEN(prefix);
@@ -99,19 +99,9 @@ static int do_connect(git_priv *priv, const char *url)
 	error = extract_host_and_port(&host, &port, url);
 	s = gitno_connect(host, port);
 	connected = 1;
-
-	error = git_pkt_gen_proto(&msg, &msg_len, url);
-	if (error < GIT_SUCCESS)
-		goto cleanup;
-
-	error = gitno_send(s, msg, msg_len, 0);
-	free(msg);
-	if (error < GIT_SUCCESS)
-		goto cleanup;
-
+	error = git_pkt_send_request(s, NULL, url);
 	priv->socket = s;
 
-cleanup:
 	free(host);
 	free(port);