summaryrefslogtreecommitdiff
path: root/src/transports/http.c
diff options
context:
space:
mode:
authorMichael Schubert <schu@schu.io>2012-08-18 12:47:49 +0200
committerMichael Schubert <schu@schu.io>2012-10-11 20:48:00 +0200
commitf6635b17215164eb1908afed70f53bd479233502 (patch)
tree038f2015cda4fab8cef16a694c3226fb35d54f3d /src/transports/http.c
parentf869d2c09221f9f1bb9c70e666eaeceb19da43f2 (diff)
downloadlibgit2-f6635b17215164eb1908afed70f53bd479233502.tar.gz
gsoc-push WIP
Diffstat (limited to 'src/transports/http.c')
-rw-r--r--src/transports/http.c41
1 files changed, 36 insertions, 5 deletions
diff --git a/src/transports/http.c b/src/transports/http.c
index a038408ce..1f24a254d 100644
--- a/src/transports/http.c
+++ b/src/transports/http.c
@@ -540,10 +540,8 @@ static int http_connect(git_transport *transport, int direction)
const char *default_port;
git_pkt *pkt;
- if (direction == GIT_DIR_PUSH) {
- giterr_set(GITERR_NET, "Pushing over HTTP is not implemented");
- return -1;
- }
+ if (direction == GIT_DIR_PUSH)
+ service = "receive-pack";
t->parent.direction = direction;
@@ -568,7 +566,7 @@ static int http_connect(git_transport *transport, int direction)
if ((ret = do_connect(t)) < 0)
goto cleanup;
- if ((ret = send_request(t, "upload-pack", NULL, 0, 1)) < 0)
+ if ((ret = send_request(t, t->service, NULL, 0, 1)) < 0)
goto cleanup;
if ((ret = git_protocol_store_refs(transport, 2)) < 0)
@@ -595,6 +593,38 @@ cleanup:
return ret;
}
+static int http_push(struct git_transport *transport, git_buf *pktline, git_buf *pack)
+{
+ transport_http *t = (transport_http *) transport;
+ gitno_buffer *buf = &transport->buffer;
+ git_buf request = GIT_BUF_INIT;
+ int ret;
+
+ if ((ret = do_connect(t)) < 0)
+ return -1;
+
+ if ((ret = gen_request(&request, t->path, t->host, "POST", "receive-pack",
+ pktline->size + pack->size, 0, t->user, t->pass)) < 0)
+ goto cleanup;
+
+ if ((ret = gitno_send(transport, request.ptr, request.size, 0)) < 0)
+ goto cleanup;
+
+ if ((ret = gitno_send(transport, pktline->ptr, pktline->size, 0)) < 0)
+ goto cleanup;
+
+ if ((ret = gitno_send(transport, pack->ptr, pack->size, 0)) < 0)
+ goto cleanup;
+
+ setup_gitno_buffer(transport);
+
+ ret = gitno_recv(buf);
+
+cleanup:
+ git_buf_free(&request);
+ return ret;
+}
+
static int http_negotiation_step(struct git_transport *transport, void *data, size_t len)
{
transport_http *t = (transport_http *) transport;
@@ -693,6 +723,7 @@ int git_transport_http(git_transport **out)
memset(t, 0x0, sizeof(transport_http));
t->parent.connect = http_connect;
+ t->parent.push = http_push;
t->parent.negotiation_step = http_negotiation_step;
t->parent.close = http_close;
t->parent.free = http_free;