cURL / Mailing Lists / curl-and-php / Single Mail

curl-and-php

Re: post then get help

From: Stephen Pynenburg <spynenburg_at_gmail.com>
Date: Mon, 7 Jul 2008 22:28:29 -0400

I was thinking - do the POST request, get the *first* returned redirection
URL, then use that URL for standard (GET) requests, using the full
curl_redir_exec function:

<?PHP
//Use this function to POST the page and parse the redirect location header
out of the response
function curl_POST_grab_redirect($url,$postfields){
    $ch = curl_init(); //initialize curl handle
    curl_setopt($ch, CURLOPT_URL, $url); //set url to post to
    curl_setopt($ch, CURLOPT_VERBOSE, 1);
    curl_setopt($ch, CURLOPT_FAILONERROR, 1);
    curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp");
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); //return into variable
    curl_setopt($ch, CURLOPT_TIMEOUT, 24); //timeout after 25s
    curl_setopt($ch, CURLOPT_POST, 1); //set POST method
    curl_setopt($ch, CURLOPT_POSTFIELDS, $postfields); //add post fields
    curl_setopt($ch, CURLOPT_AUTOREFERER, 1);
    //curl_setopt($ch, CURLINFO_HEADER_OUT, true);
    $result = curl_exec($ch); //run the whole process
    list($header, $data) = explode("\n\n", $data, 2);
    $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    //echo "HTTP CODE: $http_code<br>";
    if ($http_code == 301 || $http_code == 302)
    {
        echo "code is 301 or 302";
        $matches = array();
        preg_match('/Location:(.*?)\n/', $header, $matches);
        $url = @parse_url(trim(array_pop($matches)));
    }
    return $url;
    curl_close($ch);
    unset($ch); //clean up
}

//POST and get the url
$theurl = curl_POST_grab_redirect("http://yoursite.com/page.php
","key=value&so=on&so=forth");
//proceed with curl_redir_exec
$ch2 = curl_init();
curl_setopt($ch2, CURLOPT_GET, 1); //this is set by default anyway
curl_setopt($ch2, CURLOPT_URL, $theurl); //from the function
/* Add any other options as needed */
$res = curl_redir_exec($ch2);
?>

2008/7/7 ryan pal <ryanpal_at_mail.com>:

> In order to first post I must tell curl to use POST, which I have done
> with:
>
> curl_setopt(
> $ch, CURLOPT_POSTFIELDS, $postfields);
>
> Since I need to do a GET after this, don't I have to do a CURLPT_HTTPGET
> after or else it will still try to post?
>
> I believe that's the issue I'm having from the beginning. How to do a POST
> then a get. I'm under the impression that I have to write code to switch
> between the two. I'm also a little confused of I should code what you
> describe.
>
> Here is my main function along with the one you describe. How would I
> modify it to do GET?
>
> list($header, $data) = explode("\n\n", $data, 2);
>
> $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
>
> //echo "HTTP CODE: $http_code<br>";
>
> if ($http_code == 301 || $http_code == 302
> )
>
> {
>
> curl_setopt(
> $ch, CURLOPT_POST, 0); //turn off POST method
>
> curl_setopt(
> $ch, CURLOPT_HTTPGET, 1); //set GET method
>
> //curl_setopt($ch, CURLOPT_DEBUGFUNCTION,1);
>
> curl_setopt(
> $ch, CURLOPT_POSTFIELDS, NULL);
>
> echo "code is 301 or 302";
>
> $matches = array();
>
> preg_match(
> '/Location:(.*?)\n/', $header, $matches);
>
> $url = @parse_url(trim(array_pop($matches)));
>
> }
>
> function
> curl_navigate($url,$postfields){
>
> $ch = curl_init(); //initialize curl handle
>
> curl_setopt(
> $ch, CURLOPT_URL,$url); //set url to post to
>
> curl_setopt(
> $ch, CURLOPT_VERBOSE, 1);
>
> curl_setopt(
> $ch, CURLOPT_FAILONERROR, 1);
>
> curl_setopt($ch, CURLOPT_COOKIEFILE, "/tmp");
>
> curl_setopt(
> $ch, CURLOPT_RETURNTRANSFER, 1); //return into variable
>
> curl_setopt(
> $ch, CURLOPT_TIMEOUT, 24); //timeout after 25s
>
> curl_setopt(
> $ch, CURLOPT_POST, 1); //set POST method
>
> curl_setopt(
> $ch, CURLOPT_POSTFIELDS, $postfields); //add post fields
>
> curl_setopt(
> $ch, CURLOPT_AUTOREFERER, 1);
>
> //curl_setopt($ch, CURLINFO_HEADER_OUT, true);
>
> curl_redir_exec(
> $ch);
>
> $result = curl_exec($ch); //run the whole process
>
> return $result;
>
> curl_close(
> $ch);
>
> }
>
>
>
>
> ----- Original Message -----
> From: "Stephen Pynenburg"
> To: "curl with PHP"
> Subject: Re: post then get help
> Date: Mon, 7 Jul 2008 21:43:07 -0400
>
> Hey,
> After the first POST, you only need that little snippet from the function
> to get the new Location header.
> Once you've got the new URL from your special POST request, you can
> actually just use the full function for the rest of your requests.
> About using GET, unless you explicitly tell cURL to use POST or PUT or
> something, it defaults to a GET request, so you shouldn't have to worry.
>
> -Stephen
>
> 2008/7/7 ryan pal <ryanpal_at_mail.com>:
>
>> stephen,
>>
>> i see you displayed only a little bit of the redirect function. are you
>> suggesting i omit the rest?
>>
>> also, how do you do a get request? use the CURLOPT_HTTPGET?
>>
>> oh and one more thing. should this be a seperate function since you
>> mention i should do the POST as normal?
>>
>> thanks,
>> ryan
>>
>> ----- Original Message -----
>> From: "Stephen Pynenburg"
>> To: "curl with PHP"
>> Subject: Re: post then get help
>> Date: Mon, 7 Jul 2008 18:39:08 -0400
>>
>> My recommendation would be to do your first POST request normally, then
>> take the data you get and use a little bit of the redir_exec function:
>>
>> list($header, $data) = explode("\n\n", $data, 2);
>> $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
>> if ($http_code == 301 || $http_code == 302) {
>> $matches = array();
>> preg_match('/Location:(.*?)\n/ ', $header, $matches);
>> $url = @parse_url(trim(array_pop($matches)));
>>
>> To get the next URL, then just do a while loop, with a cURL GET request in
>> it, until there are no more URLs.
>>
>> -Stephen
>>
>>
>> 2008/7/7 ryan pal <ryanpal_at_mail.com>:
>>
>>> i'm trying to figure out how i can do a "post" then a "get". due to
>>> restrictions on my server, i have to use the redirect script found on
>>> php.net:
>>>
>>> function curl_redir_exec($ch,$debug="")
>>> {
>>> static $curl_loops = 0;
>>> static $curl_max_loops = 20; if ($curl_loops++ >=
>>> $curl_max_loops)
>>> {
>>> $curl_loops = 0;
>>> return FALSE;
>>> }
>>> curl_setopt($ch, CURLOPT_HEADER, true);
>>> curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
>>> $data = curl_exec($ch);
>>> list($header, $data) = explode("\n\n", $data, 2);
>>> $http_code = curl_getinfo($ch, CURLINFO_HTTP_CODE);
>>> if ($http_code == 301 || $http_code == 302) {
>>> $matches = array();
>>> preg_match('/Location:(.*?)\n/', $header, $matches);
>>> $url = @parse_url(trim(array_pop($matches)));
>>> //print_r($url);
>>> if (!$url)
>>> {
>>> //couldn't process the url to redirect to
>>> $curl_loops = 0;
>>> return $data;
>>> }
>>> $last_url = parse_url(curl_getinfo($ch,
>>> CURLINFO_EFFECTIVE_URL));
>>> /* if (!$url['scheme'])
>>> $url['scheme'] = $last_url['scheme'];
>>> if (!$url['host'])
>>> $url['host'] = $last_url['host'];
>>> if (!$url['path'])
>>> $url['path'] = $last_url['path'];*/
>>> $new_url = $url['scheme'] . '://' . $url['host'] .
>>> $url['path'] . ($url['query']?'?'.$url['query']:'');
>>> curl_setopt($ch, CURLOPT_URL, $new_url);
>>> // debug('Redirecting to', $new_url); return
>>> curl_redir_exec($ch);
>>> } else {
>>> $curl_loops=0;
>>> return $data;
>>> }
>>> i have my curl_setopt to POST, but need to do GET also. how do setup my
>>> code so that i post and then do a get for the next few redirects?
>>>
>>> -- Be Yourself @ mail.com!
>>> Choose From 200+ Email Addresses
>>> Get a *Free* Account at www.mail.com <http://www.mail.com/Product.aspx>!
>>>
>>> _______________________________________________
>>> http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-and-php
>>>
>>>
>>
>> _______________________________________________
>> http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-and-php
>>
>>
>> -- Be Yourself @ mail.com!
>> Choose From 200+ Email Addresses
>> Get a *Free* Account at www.mail.com <http://www.mail.com/Product.aspx>!
>>
>> _______________________________________________
>> http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-and-php
>>
>>
>
> _______________________________________________
> http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-and-php
>
>
> -- Be Yourself @ mail.com!
> Choose From 200+ Email Addresses
> Get a *Free* Account at www.mail.com <http://www.mail.com/Product.aspx>!
>
> _______________________________________________
> http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-and-php
>
>

_______________________________________________
http://cool.haxx.se/cgi-bin/mailman/listinfo/curl-and-php
Received on 2008-07-08