Avatar billede andreas13_fam Nybegynder
10. april 2010 - 13:43 Der er 8 kommentarer og
1 løsning

omdiager AJAX kald med cURL

Omdiriger AJAX kald med cURL

Jeg vil gerne kunne fortage en XMLHttpRequest til en af mine subdomæner.
Problemet er så bare at det opfattes som et "cross domain" kald, hvilket ikke er "tilladt".
Løsningen må være at lave en php side der bruger cURL, og som tager alle de parameter der blev sendt til siden og sender dem videre til en anden side.

Jeg har forsøgt mig med denne kode:

cURL
<?php
date_default_timezone_set("Europe/Copenhagen");
error_reporting(E_ALL);

/*** disable "magic quoutes if exist ***/
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

//Start cURL
$cURL = curl_init();

//sætter URL
curl_setopt($cURL, CURLOPT_URL, $_GET['url']);

curl_setopt($cURL, CURLOPT_HEADER, true);
curl_setopt($cURL, CURLOPT_POST, true);
curl_setopt($cURL, CURLOPT_TIMEOUT, 60);


$headers = '';
foreach (getallheaders() as $header => $value) {
  $headers .= $header .":". $value . "\n";
}

$post = '';
foreach ($_POST as $key => $val) {
  $post .= $key ."=". $val . "&";
}
$post = subStr($post,0,strlen($post) - 1);

curl_setopt($cURL, CURLOPT_HTTPHEADER, (array)$headers);
curl_setopt($cURL, CURLOPT_POSTFIELDS, $post);

if (curl_errno($cURL)) {
    echo 'Error: '. curl_error($cURL);
} else {
    curl_exec($cURL);
    curl_close($cURL);
}


Scriptet skulle gerne blive kaldt som fx: http://minside.dk/curl.php?url=http://eksperten.dk
Problemerne er så bare:
1.    Jeg kan ikke finde nogen god måde at teste om det virker.
2.    Når jeg ligger det op på min server/host fejler det med beskeden: getallheaders()
3.    Der vises bare en blank side når jeg køre: http://localhost/curl.php?url=http://eksperten.dk
4.    Jeg har enlig ikke meget forstand på HTTP 1.1/1.0
Avatar billede coderdk Praktikant
10. april 2010 - 16:39 #1
Det virker ved i andre browsere end IE? IE bruger nemlig P3P, hvis du i dit andet script på subdomænet, sætter denne header:

header('P3P: CP="CAO PSA OUR"');

Se om det virker...
Avatar billede andreas13_fam Nybegynder
10. april 2010 - 16:43 #2
coderdk: Jeg forstår ikke et ord af hvad du skriver.
Avatar billede coderdk Praktikant
10. april 2010 - 16:45 #3
Det script du kalder via ajax, på dit sumdomæne, prøv at smide den linje jeg pastede ind, i toppen af scriptet.
Avatar billede Slettet bruger
10. april 2010 - 16:47 #4
Hvilken fejlbesked får du?
Og har du tjekket om (array)$headers er blevet lavet om til et "validt"-array?
Jeg ville nok have været lidt mere specifik og lavet $headers som et array, ala det her:
<?php
//...
$headers = array();
foreach (getallheaders() as $header => $value) {
  $headers[] = $header .":". $value;
}
//...
curl_setopt($cURL, CURLOPT_HTTPHEADER, $headers);
?>

Men hvis du gider komme med en fejlbesked kunne det hjælpe en del på det, da vi ellers skal sidde og gætte i blinde.
Avatar billede erikjacobsen Ekspert
10. april 2010 - 16:49 #5
Du kan formentlig ignorere de headers:

<?php
date_default_timezone_set("Europe/Copenhagen");
error_reporting(E_ALL);

/*** disable "magic quoutes if exist ***/
if (get_magic_quotes_gpc()) {
    function stripslashes_deep($value)
    {
        $value = is_array($value) ?
                    array_map('stripslashes_deep', $value) :
                    stripslashes($value);

        return $value;
    }

    $_POST = array_map('stripslashes_deep', $_POST);
    $_GET = array_map('stripslashes_deep', $_GET);
    $_COOKIE = array_map('stripslashes_deep', $_COOKIE);
    $_REQUEST = array_map('stripslashes_deep', $_REQUEST);
}

//Start cURL
$cURL = curl_init();

//sætter URL
curl_setopt($cURL, CURLOPT_URL, $_GET['url']);

curl_setopt($cURL, CURLOPT_HEADER, false);    // was true
curl_setopt($cURL, CURLOPT_POST, true);
curl_setopt($cURL, CURLOPT_TIMEOUT, 60);


//$headers = '';
//foreach (getallheaders() as $header => $value) {
//  $headers .= $header .":". $value . "\n";
//}

$post = '';
foreach ($_POST as $key => $val) {
  $post .= $key ."=". $val . "&";
}
$post = subStr($post,0,strlen($post) - 1);

//curl_setopt($cURL, CURLOPT_HTTPHEADER, (array)$headers);
curl_setopt($cURL, CURLOPT_POSTFIELDS, $post);

if (curl_errno($cURL)) {
    echo 'Error: '. curl_error($cURL);
} else {
    curl_exec($cURL);
    curl_close($cURL);
}
?>
Avatar billede andreas13_fam Nybegynder
10. april 2010 - 17:28 #6
@coderdk for en god ordens skyld er jeg endnu ikke nået så langt at jeg er begyndt at bruge PHP siden i forbindelse med AJAX. Jeg går bare ind på den.


@roxki Jeg for ingen fejl besked, det er det der er problemet.

@erikjacobsen
Jeg kan nok undvære de headers der er i starten.
Men dem der bruges i cURL delen kan jeg nok ikke undvære. Da jeg gerne skulle være i stand til at videresende cookies.
Men ellers så virker det med dine rettelser.

---
I mellemtiden har jeg forsøgt at starte helt forfra, og udelukkende fokusere på at sende de rigtige headers af sted, og derefter modtage dem rigtigt.

Til det har jeg taget udgangs punkt i dette:

<?php
    // create curl resource
    $cURL = curl_init();

    // set url
    curl_setopt($cURL, CURLOPT_URL, "http://www.api.netkogeren.dk/test.php");

    curl_setopt($cURL, CURLOPT_HEADER, true);
    curl_setopt($cURL, CURLOPT_RETURNTRANSFER, true);


    /*
    $headers = '';
    foreach (apache_request_headers() as $header => $value) {
      $headers .= $header .":". $value . "\n";
    }
    curl_setopt($cURL, CURLOPT_HTTPHEADER, (array)$headers);
    */
   
    // er er sket en fejl
    if (curl_errno($cURL))
    {
        echo 'Error: '. curl_error($cURL);
    }
    else
    {
        $response = curl_exec($cURL);
        $info = curl_getinfo($cURL);
       
       
        //echo '<pre>'.print_r($info,true).'</pre>';
       
        $header = substr($response, 0, $info['header_size']);
        $body = substr($response, $info['header_size']);
       
        $headers = preg_split('/\n/', $header, NULL, PREG_SPLIT_NO_EMPTY);
       
        //echo '<pre>'.print_r($headers,true).'</pre>';

       
        foreach ($headers as $value) {
        //    header($value);
        }
       
        print(
            $body
        );
       
        curl_close($cURL);
    }
?>


Problemerne er som følgende:
1. hvis >>header($value);<< bruges skriver browseren at siden ikke kunne åbnes.

2. hvis >>curl_setopt($cURL, CURLOPT_HTTPHEADER, (array)$headers);<< bruges for jeg et kryptisk resultat bestående af mærkelige tegn. ( http://beta.localhost/test.php )

3. hvis >>curl_setopt($cURL, CURLOPT_HTTPHEADER, $headers);<< som i roxki's eksempel for jeg "Bad request"
Avatar billede erikjacobsen Ekspert
10. april 2010 - 19:46 #7
Kig på http://php.net/getallheaders - der er et forslag til hvis at man ikke har den implementeret.
Avatar billede andreas13_fam Nybegynder
11. april 2010 - 18:58 #8
Tak erikjacobsen, det løser da et af mine problemer, og gør at i nu kan se det kryptiske resultat.

For en god ordens skyld så er det denne header der bliver videresendt:


Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Charset:ISO-8859-1,utf-8;q=0.7,*;q=0.7
Accept-Encoding:gzip,deflate
Accept-Language:da,en-us;q=0.7,en;q=0.3
Cache-Control:max-age=0
Connection:keep-alive
Cookie:__utma=182901049.1034397808.1268397907.1270536661.1271003340.9; __utmz=182901049.1268397907.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none); __utmb=182901049.1.10.1271003340
Host:beta.netkogeren.dk
Keep-Alive:115
User-Agent:Mozilla/5.0 (Windows; U; Windows NT 6.1; da; rv:1.9.2.3) Gecko/20100401 Firefox/3.6.3
Avatar billede andreas13_fam Nybegynder
23. maj 2010 - 00:03 #9
Ingen har desvære kunne sige de magiske ord, der ville få det til at virker. Men kan vi ikke dele point.
Sådan at coderdk, roxki og mig for point.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester