[PHP] GET en POST in dezelfde connectie

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Dutchmega
  • Registratie: September 2001
  • Niet online
Weet iemand of het mogelijk is om een GET en een POST request te sturen in dezelfde connectie?
Ik heb dit zelf ook al geprobeerd maar ik wil graag de gegevens van de GET opvragen en daarna nog een keer van de POST maar dat kan niet.

Ik wil een "requestcode" ophalen die bij elke refresh verandert (GET), en deze mee te geven in de POST.
Daarom wil ik het in dezelfde connectie omdat anders de code weer verandert.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
<?php
$fp = fsockopen($host, 80, $errno, $errstr, 30);
if (!$fp) {
    echo $errstr." (".$errno.")<br />\n";
} else {
    $out = "GET ".$get." HTTP/1.1\r\n";
    $out .= "Host: ".$host."\r\n";
    $out .= "Cookie: ".$matches[1];
    $out .= "Set-Cookie: ".$matches[1];
    $out .= "Connection: Keep-Alive\r\n\r\n";

    fputs($fp, $out);
    $html = "";
    while (!feof($fp)) {
       $html .= fgets($fp, 128);
    }
    
    $rew = "";
    $rew .= "POST ".$get." HTTP/1.1\r\n";
    $rew .= "Host: ".$host."\r\n";
    $rew .= "Cookie: ".$matches[1];
    $rew .= "Connection: Keep-Alive\r\n";

    $lenght = strlen( $postValues );

    $rew .= "Content-Type: application/x-www-form-urlencoded\r\n";
    $rew .= "Content-Length: ".$lenght."\r\n";
    $rew .= "\r\n";
    $rew .= $postValues;
    $rew .= "\r\n";
    $rew .= "\r\n";

    fputs($fp, $rew);

    $result = "";
    while (!feof($fp)) {
       $result .= fgets($fp, 128);
    }
}
fclose($fp);
?>


Resultaat: $result is leeg.

Weet iemand een oplossing?

Toevoeging: Wanneer aparte connectie voor de GET en POST request, werkt het wel maar wegens random-stuff, kan dat niet.

[ Voor 58% gewijzigd door Dutchmega op 29-03-2004 17:38 ]


Acties:
  • 0 Henk 'm!

  • Tom-Eric
  • Registratie: Oktober 2001
  • Laatst online: 25-03 09:11
Een POST is toch automatisch ook een GET, zo kan je gewoon dingen POST'en naar http://www.example.com/test.php?var=1&blaat=true zodat die variabelen beschikbaar zijn in het script dat draait.

i76 | Webdesignersgids | Online Gitaarlessen & Muziekwinkels


Acties:
  • 0 Henk 'm!

  • Bosmonster
  • Registratie: Juni 2001
  • Laatst online: 18-09 16:28

Bosmonster

*zucht*

TumTum schreef op 29 maart 2004 @ 15:46:
Een POST is toch automatisch ook een GET, zo kan je gewoon dingen POST'en naar http://www.example.com/test.php?var=1&blaat=true zodat die variabelen beschikbaar zijn in het script dat draait.
Das nogal een 'dirty' methode en de browser is volgens mij niet verplicht de variabelen als GET mee te sturen. Volgens mij doet bijvoorbeeld Opera dit ook niet.

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
PHP De while(feof) icm met de gets wachten bij het ontvangen net zolang tot alle data is uitgelezen of de verbinding is gesloten. Hierbij wacht PHP dus ook op data die nog kan komen terwijl jij het volgende request kunt sturen.

Als je bij de GET het "Connection: Keep-Alive" verandert in "Connection: Close" en dan de eerste while die data leest weghaalt dan komt alle data wel binnen.

Oftewel twee requests sturen gaat wel maar php de while(feof) icm met de gets wachten bij de eerste request.

Wat TumTum heeft getypt is opzich ook een goede optie om de POST en de GET te combineren.
you can use POST and GET together with this line :
POST /localhost/test/p.php?val=3 HTTP/1.1
(Staat ergens onderaan :D).

[ Voor 10% gewijzigd door Shadowman op 29-03-2004 17:23 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Bosmonster schreef op 29 maart 2004 @ 15:49:
[...]


Das nogal een 'dirty' methode en de browser is volgens mij niet verplicht de variabelen als GET mee te sturen. Volgens mij doet bijvoorbeeld Opera dit ook niet.
GET variabelen ook echt GET variabelen noemen is eigenlijk hetgene wat dirty is; het zijn namelijk geen vars die specifiek voor GET zijn, maar het is een query string. En ja, ook een POST kan een query string hebben

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Dutchmega
  • Registratie: September 2001
  • Niet online
Sorry, ik ben 1 ding vergeten te melden. Het zit zo:

Ik wil een "requestcode" ophalen die bij elke refresh verandert (GET), en deze mee te geven in de POST.
Daarom wil ik het in dezelfde connectie omdat anders de code weer verandert.

(ik zet het gelijk in de topic :P)

Acties:
  • 0 Henk 'm!

  • Shadowman
  • Registratie: Januari 2002
  • Niet online
Volgens php.net kun je het beste een timeout instellen zodat feof iig een keer een FALSE returned.
Warning

feof() will return TRUE only if the connection opened by fsockopen() is closed. This can cause a script to timeout. The workaround for this is to use stream_set_timeout(), so that feof() will return FALSE on timeout.

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Oh wacht, nu snap ik het probleem
Je moet daar niet eens feof () voor gebruiken, er is namelijk helemaal geen end of file als een request is afgewerkt.

Je zou het met een timeout op kunnen lossen, maar dat lijkt me een beetje een vieze oplossing: ten eerste is het helemaal niet zeker dat na de timeout alles wel binnen is, en ten tweede loop je onnodig te wachten als wel alles binnen is.

Je kunt dan denk ik beter kijken of je een request hebt afgewerkt, hoe je dat kunt detecteren staat wel in de HTTP RFC

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Dutchmega
  • Registratie: September 2001
  • Niet online
.oisyn schreef op 29 maart 2004 @ 18:06:
Oh wacht, nu snap ik het probleem
Je moet daar niet eens feof () voor gebruiken, er is namelijk helemaal geen end of file als een request is afgewerkt.

Je zou het met een timeout op kunnen lossen, maar dat lijkt me een beetje een vieze oplossing: ten eerste is het helemaal niet zeker dat na de timeout alles wel binnen is, en ten tweede loop je onnodig te wachten als wel alles binnen is.

Je kunt dan denk ik beter kijken of je een request hebt afgewerkt, hoe je dat kunt detecteren staat wel in de HTTP RFC
Volgens mij kan dat door te kijken wat voor header je krijgt en wanneer 2xx melding is, dan is het goed. Maar hoe vraag ik dan die headers op ;)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Nee, je krijgt ook html data, die moet je uiteraard ook uitlezen (of kun je ondertussen al een nieuwe request doen?)

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • stekkel
  • Registratie: Augustus 2001
  • Laatst online: 17-09 08:05
Volgens mij is het niet vanzelfsprekend om er vanuit te gaan dat je server persistent connecties ondersteund waardoor je pipelined requests kan sturen.

Zie sectie 8.1.2.1 en 8.1.2.2 (let op de MAY, MUST en SHOULD woorden wanneer je RFC's leest)

http://www.w3.org/Protocols/rfc2616/rfc2616-sec8.html#sec8

[ Voor 169% gewijzigd door stekkel op 30-03-2004 00:22 . Reden: ff rfc2616 doorgeploeterd ]


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
.oisyn schreef op 29 maart 2004 @ 20:11:
Nee, je krijgt ook html data, die moet je uiteraard ook uitlezen (of kun je ondertussen al een nieuwe request doen?)
De Content-Length-header uitlezen? :)

Vervolgens vanaf de \r\n\r\n (dubbele enter) beginnen met tellen :)

Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

Osiris schreef op 29 maart 2004 @ 23:56:
[...]

De Content-Length-header uitlezen? :)

Vervolgens vanaf de \r\n\r\n (dubbele enter) beginnen met tellen :)
Idd, maar is dat altijd zo? Ik kan me bijvoorbeeld iets van een chunked encoding voorstellen waarbij er steeds stukjes worden gestuurd, oid

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
.oisyn schreef op 30 maart 2004 @ 00:41:
[...]


Idd, maar is dat altijd zo? Ik kan me bijvoorbeeld iets van een chunked encoding voorstellen waarbij er steeds stukjes worden gestuurd, oid
Dan zoeken we dat ff op en vinden we dit :P :
Improved HTTP/1.1 chunked transfer-encoding example.

The sample code given below by Jack does not function correctly when run against a recent version of Apache (I'm assuming that this did once work, but from the HTTP/1.1 spec I can only assume if it did work it was based mostly on luck).

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
<?php

$header = "";
$response = "";

// connect
if (!($request=fsockopen('whatever.com',80,$errno,$errstr))) exit($errstr);
else {
   socket_set_timeout($request,10);
   // send request
   fwrite($request,$post);
   // get header
   do $header.=fread($request,1); while (!preg_match('/\\r\\n\\r\\n$/',$header));
   // check for chunked encoding
   if (preg_match('/Transfer\\-Encoding:\\s+chunked\\r\\n/',$header))
     do {
         $byte = "";
         $chunk_size="";
         do {
           $chunk_size.=$byte;
           $byte=fread($request,1);
         } while ($byte!="\\r");      // till we match the CR
         fread($request, 1);        // also drop off the LF
         $chunk_size=hexdec($chunk_size); // convert to real number
         $response.=fread($request,$chunk_size);
         fread($request,2);          // ditch the CRLF that trails the chunk
     } while ($chunk_size);        // till we reach the 0 length chunk (end marker)
   else {
     // check for specified content length
     if (preg_match('/Content\\-Length:\\s+([0-9]*)\\r\\n/',$header,$matches)) {
         $response=fread($request,$matches[1]);
     } else {
         // not a nice way to do it (may also result in extra CRLF which trails the real content???)
         while (!feof($request)) $response .= fread($request, 4096);
     }
   }
   // close connection
   fclose($request);
}

// do something useful with the response
print($header);
print($response);

?>
Ik denk wel dat men hier weer wat mee kan? :? :)

edit:
Dit is dus een User Contributed Note op die pagina ergens :)

[ Voor 10% gewijzigd door Osiris op 30-03-2004 01:09 ]


Acties:
  • 0 Henk 'm!

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 03:42

.oisyn

Moderator Devschuur®

Demotivational Speaker

_o_

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


Acties:
  • 0 Henk 'm!

  • Osiris
  • Registratie: Januari 2000
  • Niet online
Ow, niet vergeten de fclose($request); eruit te slopen, anders werkt het alsnog niet :D 8)7
Pagina: 1