Avatar billede emileej Nybegynder
22. januar 2003 - 18:39 Der er 4 kommentarer og
1 løsning

Problemer med post via sockets...

Jeg bruger følgende funktion til at udføre post kald inde i mine scripts, men jeg har meget besvær med at klippe de headers fra, jeg får og desuden kommer det et undeligt "0" til sidst - er der nogle, der har en bedre funktion eller kan se hvad der er galt i denne?

function post($data, $url, $timeout=30){
    $url_array = parse_url($url);
    $query = "";
    foreach ($data as $key => $value) {
        if ($query) $query .= "&";
        $query.= $key."=".urlencode($value);
    }
    $len = strlen($query);
    $headers =
        "POST ".$url_array["path"]."?".$url_array["query"]." HTTP/1.1\n".
        "Host: $url_array[host]\n".
        "User-Agent: PHP/".phpversion()."\n".
        "Content-Type: application/x-www-form-urlencoded\n".
        "Content-Length: $len\n\n".
        "$query\n";
    $socket = fsockopen($url_array["host"], 80, $errno, $errstr, $timeout);
    if (!$socket) {
        return false;
    }else{
        fputs($socket, $headers);
        while(!feof($socket))$in.=fgets($socket, 128);
        $oin=$in;
        $in=substr($in,strpos($in,"\n\n"));
        if($oin==$in)
            $in=substr($in,strpos($in,"\r\r"));
        if($oin==$in)
            $in=substr($in,strpos($in,"\r\n\r\n"));
        return $in;
    }
}


E-)mil
Avatar billede rednex Nybegynder
31. januar 2003 - 00:23 #1
Hmm, umiddelbart ser det jo rigtig nok ud. Det eneste jeg kan få øje på er, at du sender $url_array["query"] med i dir POST request i headeren.
Så vidt jeg ved hører det kun hjemme i et GET request. Det kan være det er det der forvirrer den lidt. Prøv at ændre den linie til:
"POST " . $url_array["path"] . " HTTP/1.1\n" .
Avatar billede emileej Nybegynder
01. februar 2003 - 10:01 #2
Hvis jeg ikke sender min query sådan - kommer mit query jo slet ikke frem...
Mit problem er desuden heller ikke at sende min post - det er at filtrere outputtet fra den for headers etc....
Avatar billede rednex Nybegynder
01. februar 2003 - 19:37 #3
OK, jeg havde misforstået dit spm. Men dine POST variable bliver sendt i body'en og skal ikke sendes i POST requestet (sådan skal det være iflg. RFC'en).
Jeg har fiflet lidt med det, og fået det til at virke. Jeg er gået over til HTTP/1.0 for at sikre at jeg ikke får svar tilbage i komprimeret form eller lignende. Det øgede også svartiden på min server fra ca. 15 sek. til 0.5 sekund !?!?
Desuden har jeg ændret de linier som filtrerer headeren fra. Den skulle nu være sikret mod enhver kombination af \n og \r.

function post($data, $url, $timeout=30)
{
    $url_array = parse_url($url);
    $query = "";

    foreach ($data as $key => $value)
    {
        if ($query)
        {
            $query .= "&";
        }
        $query .= $key . "=" . urlencode($value);
    }

    $len = strlen($query);

    $headers = "POST " . $url_array["path"] . " HTTP/1.0\n" .
              "Host: $url_array[host]\n" .
              "User-Agent: PHP/" . phpversion() . "\n" .
              "Content-Type: application/x-www-form-urlencoded\n" .
              "Connection: Keep-Alive\n" .
              "Cache-Control: no-cache\n" .
              "Content-Length: $len\n\n" .
              "$query\n";

    $socket = fsockopen($url_array["host"], 80, $errno, $errstr, $timeout);
    if (!$socket)
    {
        return false;
    }
    else
    {
        fputs($socket, $headers);
        while(!feof($socket))
            $in .= fgets($socket, 128);

        $in = str_replace("\r", "\n", $in);
        $in = str_replace("\n\n", "\n", $in);
        $in = strstr($in, "\n\n");
        $in = trim($in);

        return $in;
    }
}
Avatar billede rednex Nybegynder
01. februar 2003 - 19:38 #4
Og det skulle jo så have været et svar :P
Avatar billede emileej Nybegynder
02. februar 2003 - 12:52 #5
Som en stakkels 3g'er har jeg stygge lektier :(
Jeg tager et kig på din kode når tid er. Tak for svaret :)
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