diff options
author | Michael Schubert <schu@schu.io> | 2012-08-18 12:47:49 +0200 |
---|---|---|
committer | Michael Schubert <schu@schu.io> | 2012-10-11 20:48:00 +0200 |
commit | f6635b17215164eb1908afed70f53bd479233502 (patch) | |
tree | 038f2015cda4fab8cef16a694c3226fb35d54f3d /src/transports/http.c | |
parent | f869d2c09221f9f1bb9c70e666eaeceb19da43f2 (diff) | |
download | libgit2-f6635b17215164eb1908afed70f53bd479233502.tar.gz |
gsoc-push WIP
Diffstat (limited to 'src/transports/http.c')
-rw-r--r-- | src/transports/http.c | 41 |
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; |