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

curl-and-php

Re: post then get help

From: Stephen Pynenburg <spynenburg_at_gmail.com>
Date: Tue, 8 Jul 2008 16:25:35 -0400

Ya, my mistake - I left the return variable the same as the input variable.
In this section:
    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;
Change the variable $url to something else, like $url2, etc.
Also, it's possible that
if ($http_code == 301 || $http_code == 302)
Isn't evaluating properly, so you might just want to take out that whole
conditional block.

-Stephen
2008/7/8 ryan pal <ryanpal_at_mail.com>:

> i see what you are referring to now.
>
> when testing your code it returns me the original url that i send the
> curl_POST_redirect function, not the redirect one.
>
>
>
>
>
> ----- Original Message -----
> From: "Stephen Pynenburg"
> To: "curl with PHP"
> Subject: Re: post then get help
> 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
>
>
> -- 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