git/list[1] front-page[2] threads[3] people[4] search[5] about
 

[PATCH] smart-http: Don't change POST to GET when following redirect

From
Andreas Schwab <schwab@linux-m68k.org>
Date
Sep 18, 2010, 08:47 UTC
Message-ID
<m21v8rcua1.fsf_-_@whitebox.home>
In-Reply-To
<m262y3cvpy.fsf@whitebox.home>

When the remote HTTP server returns a redirect the default libcurl action is to change a POST request into a GET request while following the redirect, but the remote http backend does not expect that. Tell libcurl to always keep the POST request.

Signed-off-by: Andreas Schwab <schwab@linux-m68k.org>
---
Andreas Schwab <schwab@linux-m68k.org> writes:
Show 22 quoted lines
> Ilari Liusvaara <ilari.liusvaara@elisanet.fi> writes:
>
>> On Sat, Sep 18, 2010 at 01:33:48PM +0900, Miles Bader wrote:
>>
>>> The savannah.gnu.org admins are trying out the git "smart http" server,
>>> but it doesn't seem to handle http redirects properly... should it?
>>> Is this a bug with the git server?
>>> 
>>> The follow is from Sylvain Beucler;
>>> > Hmmm, actually it works, but it doesn't support a HTTP redirect
>>> > (namely git.sv.gnu.org -> git.savannah.gnu.org).
>>> >
>>> > $ git clone http://git.sv.gnu.org/r/freedink.git
>>> > Initialized empty Git repository in /tmp/freedink/.git/
>>> > error: RPC failed; result=22, HTTP code = 405
>>
>> 405 (Method not allowed)? Can you see what request it is trying to send
>> and to where (the request that fails with 405 that is)?
>
> I think this is a bug in the apache setup at savannnah.  It is
> responding to POST .../git-upload-pack with both 301 and 405.  This does
> not happen if you use the redirected address directly.

Looking closer, this is actually a bug in git. It does not set the POSTREDIR option, so that libcurl changes the POST into GET when following a redirection.

Andreas.
---
 remote-curl.c |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)
diff --git a/remote-curl.c b/remote-curl.c
index 04d4813..309b024 100644
--- a/remote-curl.c
+++ b/remote-curl.c
@@ -393,6 +393,7 @@ static int post_rpc(struct rpc_state *rpc)
 	curl_easy_setopt(slot->curl, CURLOPT_POST, 1);
 	curl_easy_setopt(slot->curl, CURLOPT_URL, rpc->service_url);
 	curl_easy_setopt(slot->curl, CURLOPT_ENCODING, "");
+	curl_easy_setopt(slot->curl, CURLOPT_POSTREDIR, CURL_REDIR_POST_ALL);
 
 	headers = curl_slist_append(headers, rpc->hdr_content_type);
 	headers = curl_slist_append(headers, rpc->hdr_accept);
-- 
1.7.2.3


-- 
Andreas Schwab, schwab@linux-m68k.org
GPG Key fingerprint = 58CA 54C7 6D53 942B 1756  01D3 44D5 214B 8276 4ED5
"And now for something completely different."
Previous: Andreas SchwabNext: Miles Bader
Message 4 of 9 in “git "smart http" server vs. http redirects”
  1. Miles BaderSep 18, 2010
  2. Ilari LiusvaaraSep 18, 2010
  3. Andreas SchwabSep 18, 2010
  4. smart-http: Don't change POST to GET when following redirectAndreas Schwab, Sep 18, 2010
  5. Miles BaderSep 18, 2010
  6. Jay SoffianSep 18, 2010
  7. smart-http: Don't change POST to GET when following redirectTay Ray Chuan, Sep 24, 2010
  8. Andreas SchwabSep 24, 2010
  9. smart-http: Don't change POST to GET when following redirectTay Ray Chuan, Sep 25, 2010

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.