[PHP] Meerdere POST requests vanuit socket

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
Beste mensen,

op dit moment ben ik bezig met een klein hobby projectje waarbij ik een stukje joomla code wil laten communiceren met een door mijzelf gemaakte rest achtige service. Alles CRUD methoden gaan goed tot op het moment dat ik het volgende doe.

Ik heb een entiteit competitie en een entiteit game. Om een game in een competitie te plaatsen voer ik eerst een PUT request uit op mijn service voor de competitie. Waarna ik een POST er achter aan doe die de game toevoegt aan de aan de competitie.

Het probleem is nu dat op het moment dat ik de competitie resource aanspreek om te posten de php://input variabele niet wordt herschreven maar wordt aangevuld met gegevens van het tweede request. Dus in plaats van.

XML:
1
<competitie>...</competitie>


en

XML:
1
<game></game>


in twee losse 'requests' komt er dit uit de php://input

XML:
1
<competitie></competitie><game></game>


Ik vraag mij of dat dit normaal gedraag is en zo nee hoe ik dat voorkom. Op het moment dat er een request op de server binnen komt wordt er aan de hand van de url een bepaald resource object geinitializeerd. Dit object bevat methoden die overeenkomen met de http methodes ( put,post,delete,put,get). Omdat ik een aantal resources heb, heb ik een abstracte class gemaakt die een aantal functionaliteiten al in zich heeft zoals het uitlezen van de php://input.

Om de request te maken gebruik ik de volgende code:

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
<?
$eol = "\r\n";
        $header = null;
        
        if(($method == "PUT")|| ($method== "DELETE"))
        {
               $headers = "POST ".$resourceIdentifier." HTTP/1.1".$eol.
                    "Host: ".$url.$eol.
                    "hm_method: ".$method.$eol. // custom header zodat ik niet afhankelijk ben van x-methods wat niet altijd werkt
                    "hm_authentication: ".$this->configuration->getAuthenticationKey().$eol.
                    "Content-Type: text/xml".$eol.
                    "Content-Length: ".strlen($content).$eol.
                    "Connection: Close".$eol.$eol.
                    $content.$eol.$eol.$eol;
        }else{
            $headers =  $method." ".$resourceIdentifier." HTTP/1.1".$eol.
                    "Host: ".$url.$eol.
                    "hm_authentication: ".$this->configuration->getAuthenticationKey().$eol.
                    "Content-Type: text/xml".$eol.
                    "Content-Length: ".strlen($content).$eol.
                    "Connection: Close".$eol.
                    $content.$eol.$eol.$eol;
        }
        
        
        $host = str_replace("http://","",$url);
        $fp = fsockopen($host,80,$errno,$errstr);
        
        if($fp)
        {
            fputs($fp,$headers,strlen($headers));
            
            $data = stream_get_contents($fp);       
            fclose($fp);
            echo $data;
            if(strpos($data,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>") === false)
            {
                return substr($data,strpos($data,$eol),strlen($data));
            }else{
                return substr($data,strpos($data,"<?xml version=\"1.0\" encoding=\"UTF-8\"?>"),strlen($data));
            }
        }
?>


Nadat ik van het request de headers heb gecontroleerd doe ik het volgende:

PHP:
1
2
3
4
5
6
7
$fp = fopen("php://input","r");
                        while (!feof($fp))
                        {
                            $this->body .= fgets($fp,128);
                        }
                        
                        fclose($fp);



dit levert dus bij het maken van 2 requests vlak na elkaar een lange string in de body op die eigenlijk dus twee body's hadden moeten zijn . Nu is mijn idee dat dit komt omdat
  • fsockopen een static verbinding maakt met de server
  • of de connection toch niet op tijd gesloten wordt door fclose
Ik kan natuurlijk de request body gaan zitten uitpluizen om er zeker van te zijn dat het gaat om TWEE of meer requests maar ik wil eerst even weten of dat dit zo hoort of dat ik iets fout doe.

[ Voor 0% gewijzigd door Webgnome op 21-12-2008 20:12 . Reden: HTTP versie aangepast. Maar lost nog niet het proleem op. ]

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

  • Herko_ter_Horst
  • Registratie: November 2002
  • Niet online
Zit het probleem niet toevallig in het niet leegmaken/hergebruiken van $content?

"Any sufficiently advanced technology is indistinguishable from magic."


Acties:
  • 0 Henk 'm!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
Herko_ter_Horst schreef op zondag 21 december 2008 @ 20:19:
Zit het probleem niet toevallig in het niet leegmaken/hergebruiken van $content?
Dit bewijst maar weer eens dat het niet slim is om een hele dag en nacht door te programmeren |:(

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Waarom gebruik je überhaupt sockets en niet gewoon file_get_contents met het http:// protocol of cURL?

[ Voor 15% gewijzigd door .oisyn op 21-12-2008 22:37 ]

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!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
.oisyn schreef op zondag 21 december 2008 @ 22:37:
Waarom gebruik je überhaupt sockets en niet gewoon file_get_contents met het http:// protocol of cURL?
  • cURL wel naar gekeken maar nog niet mee gespeeld
Omdat, zover ik weet, file_get_contents gebruik maakt van de fopen wrappers en fsockopen doet dat niet.

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

That's the whole point. Waarom wil je de fopen wrappers niet gebruiken?

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!

  • Webgnome
  • Registratie: Maart 2001
  • Laatst online: 06:21
.oisyn schreef op maandag 22 december 2008 @ 11:06:
That's the whole point. Waarom wil je de fopen wrappers niet gebruiken?
Daarom: http://nl2.php.net/manual...n.php#ini.allow-url-fopen. Ga zowiezo eens kijken naar cURL. Als dat een beetje onder de knie heb dan komt er een check om te kijken of curl is geïnstalleerd of niet.

[ Voor 20% gewijzigd door Webgnome op 22-12-2008 11:30 ]

Strava | AP | IP | AW


Acties:
  • 0 Henk 'm!

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

.oisyn

Moderator Devschuur®

Demotivational Speaker

Ah, ik dacht dat dergelijke security settings ook gewoon bestonden voor fsockopen, maar dat is blijkbaar niet zo (best raar eigenlijk...)

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.

Pagina: 1