curl / Mailing Lists / curl-library / Single Mail


Re: HTTP redirect to HTTPS stops

From: Ray Satiro via curl-library <>
Date: Tue, 21 Mar 2017 21:53:21 -0400

On 3/21/2017 8:47 PM, Dave S wrote:
> On Tue, Mar 21, 2017 at 2:54 PM, Ray Satiro via curl-library
> < <>> wrote:
> On 3/21/2017 4:25 PM, Dave S wrote:
>> I'm way back on 7.29.0, so this may be a stupid question, but ...
>> doing a POST to a service we subscribe to, and using the HTTP:
>> scheme, the server sends a 302 redirecting to the same URI with
>> the scheme changed to HTTPS. The 302 frame also has connection:
>> closed.
>> The return code from curl_easy_perform()is 0, but no data is
>> returned, and tcpdump doesn't show any additional interchange
>> after the ack.
>> Changing my URI string (in source) to use the HTTPS: scheme, the
>> exchange completes normally, but should I have been able to
>> troubleshoot this without using tcpdump? Is a redirect to change
>> scheme not automatically followed?
> Redirects are not enabled by default. Do you have
> CURLOPT_FOLLOWLOCATION [1] enabled? Try with this URL:
> <>
> [1]:
> <>
> My first try gets a response code from curl_easy_perform() of 41,
> necessary data rewind wasn't possible
> My POSTFIELDSIZE is 238 (bytes).
> This is with version 7.45.0, which I was using before the build system
> maintainer got hands on my makefile. (The BldSys is using 7.35.00 on
> Ubuntu, but Centos 7.2 seems to be stuck on 7.29.00)

Ok so it seems there is some data and libcurl tries to POST it, but then
has to rewind since it is redirected. To support rewind use
CURLOPT_SEEKFUNCTION [1]. Also note if you POST data and the server
replies with a 301,2,3 redirect then by default libcurl sends a GET
request, as noted in the FOLLOWLOCATION doc:

"When following a Location:, the 3xx response code that redirected it
also dictates which request method it will use in the subsequent
request: For 301, 302 and 303 responses libcurl will switch method to
GET unless CURLOPT_POSTREDIR instructs libcurl otherwise. All other 3xx
codes will make libcurl send the same method again."

I think the easiest way to solve this for you though is just use the
updated https URL, assuming you can POST data to that URL. You said
"same scheme" but I assume you meant same resource. Like you request
http://foo/bar/baz and the server is redirecting you to
https://foo/bar/baz. I have seen quite a few times as websites
transition to https they redirect all their http to https, so if that's
what's happening it should be ok to just switch over.


Received on 2017-03-22