IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

Poster une requete POST avec fsockopen


Sujet :

Langage PHP

  1. #1
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut [Résolu]Poster une requete POST avec fsockopen
    Bonjour bonjour,

    Voila j'ai ecrit un petit script qui me permet d'envoyer une requete HTTP en PHP.

    Tant que je le fait en GET j'ai pas de souci, par contre quand j'essaie en POST sa plante lamentablement puisque la page appellée ne retrouve pas les variable en POST et je ne capte pas bien pourquoi.

    Pour le tester sans se prendre la tête télécharger ce fichier rar, dérarer le dans un rep sur votre serveur local et hop sa devrait fonctionner, ou presque !

    http://ns30826.ovh.net/~clement/pers...%20requete.rar


    Voila une copie du header type que je créé et envoie :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POST /Copie%20de%20requete/back.php?unecle=unevleur HTTP/1.0
    User-Agent : MSIE 1525
    Host : MoiYOYO
    Content-type : application/x-www-form-urlencoded
    Content-length : 15
     
    unecle=unevleur

    Au passage si il y'avait un guru de l'expression régulière qui veux bien m'aidé à créer une RegExp pour séparer l'entete du contenu je n'en serait pas mécontent !
    Parce qu'il faut bien dire que pour le moment c'est pas terrible :s

    Sa se passe à cet endroit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          /* HTTP BODY */ 
          /* Separation de l'entete du contenu */ 
          $temp = $status; 
          $temp .= implode("\n",$entete); 
     
          $this->HTTPResponse->Headers = $temp; 
          $this->HTTPResponse->Body = substr($content,strlen($temp));

    Merci pour votre aide !

    Bonne journée


    Le script complet le voila :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
     
    <?
     
    class HTTPRequest
    {
    	/* PRIVEE */
    	private $Socket;				// Socket de connexion au serveur
    	private $PORT;					// Numéro du port sur lequel se connecter
    	private $HostToCall;			// Domaine ou ip à appeler
    	private $HTTPResponse;			// Domaine ou ip à appeler
     
    	public function __construct ( )
    	{
    		$this->Socket 				= "";
    		$this->PORT 				= 80;
    		$this->HostToCall			= "";
    	}
     
    	public function ExecuteSSLRequest( HTTPHeaders $Header , $HostToCall )
    	{
    		/* Fonctionne uniquement si l'appel du script est réalisé en SSL */
    		$query = $errno = $errstr = $content = "";
    		$this->PORT = 443;
    		$this->HTTPResponse = NULL;
     
    		$this->HostToCall 	= $HostToCall;
    		$this->Socket 		= fsockopen("ssl://".$this->HostToCall , $this->PORT , $errno , $errstr , 10 );
     
    		try{
    			$this->StartHTTPRequest( $Header );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		try{
    			$this->ReadHTTPResponse ( );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		fclose($this->Socket);
    		return $this->HTTPResponse;
     
    	}
     
    	public function ExecuteRequest (HTTPHeaders $Header , $HostToCall )
    	{
    		$query = $errno = $errstr = $content = "";
    		$this->PORT = 80;
    		$this->HTTPResponse = NULL;
     
    		$this->HostToCall 	= $HostToCall;
    		$this->Socket 		= fsockopen($this->HostToCall , $this->PORT , $errno , $errstr , 10 );
     
    		try{
    			$this->StartHTTPRequest( $Header );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		try{
    			$this->ReadHTTPResponse ( );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		fclose($this->Socket);
    		return $this->HTTPResponse;
    	}
     
    	private function StartHTTPRequest( $Header )
    	{
    		/* L'ouverture du socket c'est il bien déroulé ? si non, pourquoi */
    		if(!$this->Socket)
    		{
    			fclose($this->Socket);
    			throw new Exception ( $errno." ".$errstr );
    		}
     
    		/* Envoi du HEADER HTTP  */
    		if( !fputs($this->Socket , $Header->__tostring()) )
    		{
    			fclose($this->Socket);
    			throw new Exception ( "Impossible d'ennvoyer le HEADER HTTP !" );
    		}
    		//echo $Header->__tostring();
    	}
     
    	private function ReadHTTPResponse ( )
    	{
    		$this->HTTPResponse = new HTTPResponse();
     
    		$content 	 = "";
    		$status 	 = "";
    		$entete 	 = "";
    		$contenu 	 = "";
    		$regs		 = array();
    		$CRLF		 = chr(13).chr(10);	/* CARRIAGE RETURN LINE FEED */
    		$CRLF		 = "\x0d\x0a";
    		$CRLF		 = "\r\n";
    		while( !feof($this->Socket) )
    		{
    			$content .= fgets($this->Socket);
    		}
     
    		/* Hypertext Transfer Protocol -- HTTP/1.1 -  RFC 2616 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html  */
     
    		/* HTTP STATUS */
    		$pattern 	= '#^HTTP/[0-9][.][0-9][ ][0-9]{3}[ ]{1}[\w- ]*['.$CRLF.']$#m';
    		$regs 		= array();
    		if(preg_match_all ( $pattern , $content , $regs) )
    		{
    			$status = $regs[0][0];
    		}
    		else
    		{
    			throw new Exception( "HEADER STATUS introuvable !" );
    		}		
     
    		/* HTTP INFO */
    		$pattern 	= "#^([A-Z-a-z]{1,}[\s]{0,1}[:]{1}[\s]{0,1})[0-9-\w-,-:- -\\-/-_]{1,}[".$CRLF."]$#m";
    		$regs 		= array();
    		if(preg_match_all ( $pattern , $content , $regs) )
    		{
    			$entete = $regs[0];
    		}
    		else
    		{
    			throw new Exception( "HEADER HTTP introuvable !" );
    		}
    		/* HTTP VARS */
    		//$pattern = "^([a-z-A-Z]*[\s]?[:]{1}[\s]?)[\w-,-:- -\\-/-_]*$[\r\n]{1}";
     
    		/* HTTP BODY */
    		/* Separation de l'entete du contenu */
    		$temp = $status;
    		$temp .= implode("\n",$entete);
     
    		$this->HTTPResponse->Headers = $temp;
    		$this->HTTPResponse->Body = substr($content,strlen($temp));
    	}
    }
     
    class HTTPResponse
    {
    	public $Headers;
    	public $Body;
     
    	public function __construct()
    	{
    		$this->Headers 	= array();
    		$this->Body 	= "";
    	}
     
    	public function __toString()
    	{
    		return $this->Body;
    	}
    }
    class HTTPHeaders
    {
     
    	public $UserAgent;			// Nom du navigateur qui appelle la page	'MSIE'
    	public $Host;				// nom de domaine appelant 					'www.monsite.com' - 213.21.25.26
    	public $ContentType;		// Type mime du contenu envoyer 			'text/xml'
    	public $Version;			// Version du protocole						1.0
    	public $URL;				// Chemin d'accès à la page					'/webservices/yo/'
    	public $TYPE;				// Type de requete à effectuer 				'GET' ou 'POST'
    	public $GetVars;
     
    	public function __construct ( )
    	{
    		$this->UserAgent 		= "";
    		$this->Host 			= "";
    		$this->ContentType 		= "";
    		$this->Version 			= "1.0";
    		$this->URL 				= "";
    		$this->TYPE 			= "";
    		$this->GetVars 			= new GetVars();
    		$this->PostVars 		= new PostVars();
    	}
     
    	public function __tostring()
    	{
    		$strReturn = "";
    		$strReturn .= $this->TYPE." ".$this->RawUrlEncode ($this->URL);
    		if($this->GetVars->__toString() != ""){
    		$strReturn .= "?".$this->GetVars->__toString();
    		}
    		$strReturn .= " HTTP/".$this->Version."\r\n";
    		$strReturn .= "User-Agent : ".$this->UserAgent."\r\n";
    		$strReturn .= "Host : ".$this->Host."\r\n";
    		$strReturn .= "Content-type : ".$this->ContentType."\r\n";
    		$strReturn .= "Content-length : ".strlen($this->PostVars->__toString());
    		$strReturn .= "\r\n\r\n".$this->PostVars->__toString()."\r\n";
    		return $strReturn;
    	}
     
    	private function RawUrlEncode( $url ) {
    	   $parts = explode('/', $url);
    	   for ($i = 0; $i < count($parts); $i++)
    	   {
    		 $parts[$i] = rawurlencode($parts[$i]);
    	   }
    	   return implode('/', $parts);
    	}
    }
     
    class GetVars
    {
     
    	public $TabVars;
     
    	public function __construct ()
    	{
    		$this->TabVars = array();
    	}
     
    	public function add($Key , $Value)
    	{
    		$this->TabVars[$Key] = $Value;
    	}
     
    	public function __toString()
    	{
    		$strReturn = "";
    		foreach($this->TabVars as $Key => $Value)
    		{
    			$strReturn .= urlencode($Key)."=".urlencode($Value)."&";
    		}
    		$strReturn = substr($strReturn , 0 , strlen($strReturn)-1 );
    		return $strReturn;
    	}
    }
     
    class PostVars
    {
    	public $TabVars;
     
    	public function __construct ()
    	{
    		$this->TabVars = array();
    	}
     
    	public function add($Key , $Value)
    	{
    		$this->TabVars[$Key] = $Value;
    	}
     
    	public function __toString()
    	{
    		$strReturn = "";
    		foreach($this->TabVars as $Key => $Value)
    		{
    			$strReturn .= $Key."=".$Value."&";
    		}
    		$strReturn = substr($strReturn , 0 , strlen($strReturn)-1 );
    		return $strReturn;
    	}
    }
     
    ?>

  2. #2
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    As tu regardé http://php.net/curl ?

  3. #3
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    Merci pour ta réponse, mais si je le fais c'est que j'avais pas envie de me servir d'une librairie tierce :/

    Oui c'est bête mais réinventé la roue parfois j'aime bien !

    Sinon par rapport à CURL en lui même le seul souci que j'ai c'est qu'il faut installer un package sur la machine et tout...

    Quoi qu'il en soit je vais essayer de voir si je ne peut pas trouver les sources de cette librairie pour voir comment eux on fait

    Merci,

    Bye

  4. #4
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    le code est un peu long à regarder... comment tu récupères tes variables postées ?

  5. #5
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    en faites télécharges cette rar ( http://ns30826.ovh.net/~clement/pers...%20requete.rar ) pour voir le pb en 2 sec chrono :o


    Sinon pour répondre à ta question sur la page back.php je fais un simple Qui me renvoie un bon gros array(0).

    Pour rappel voila l'entete type envoyé à la page back.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POST /Copie%20de%20requete/back.php?unecle=unevleur HTTP/1.0 
    User-Agent : MSIE 1525 
    Host : MoiYOYO 
    Content-type : application/x-www-form-urlencoded 
    Content-length : 15 
     
    unecle=unevleur
    L'idée c'est que j'espère récupérer unecle=unevleur dans mon POST.

    En Get sa marche très bien :/

    Merci bye

  6. #6
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    Citation Envoyé par ePoX
    Pour rappel voila l'entete type envoyé à la page back.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POST /Copie%20de%20requete/back.php?unecle=unevleur HTTP/1.0 
    User-Agent : MSIE 1525 
    Host : MoiYOYO 
    Content-type : application/x-www-form-urlencoded 
    Content-length : 15 
     
    unecle=unevleur
    Tu l'as pris où ce modèle de requète POST. Car en général quand tu postes des données, elles proviennent d'un forumulaire et dans ce cas la requète est plus compliquée que cela sinon tu peux regarder ce script (il ne marque pas les variables dans l'adresse !) :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    <?
    // Les données envoyées en POST sous forme d'url
    $data = 'txt1='.urlencode($txt1).'&txt2='.urlencode($txt2).'&id='.$id_session;
     
    // monfichier.php3 est l'URL du fichier devant recevoir la requete POST 
    $message  = "POST /monfichier.php3 HTTP/1.0\r\n";
    $message .= "Content-type: application/x-www-form-urlencoded\r\n";
    $message .= "Content-length: ".strlen( $data )."\r\n";
    $message .= "\r\n";
    $message .= $data."\r\n";
     
    // monserveur correspond au serveur qui doit recevoir la requete
    $fd = fsockopen( "monserveur", 80 );
    fputs($fd,$message);
    fclose($fd);
    ?>
    http://www.phpinfo.net/astuces/astuces110.html

  7. #7
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Salut,

    Oui car quand les variables sont passé en parametre de l'url c'est du GET.

    Maintenant, quand je fais des formulaires, sa m'arrive de faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <form name="f_test" action ="page.pgp?unevar=blahblah" method="post">
    ... des champs
    <input type="text" value ="text" />
    </form>
    Ainsi, dans page.php, je récupére du GET et du POST à la fois.

    Ce qui devrait donner une entête de ce type la :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POST /page.php?unevar=blahblah HTTP/1.0
    User-Agent : MSIE 1525
    Host : MoiYOYO
    Content-type : application/x-www-form-urlencoded
    Content-length : 24
     
    text=text
    Ceci dit je viens de tester tout de même, on c'est jamais, et si j'envoie mon entête de cette forme la :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POST /Copie%20de%20requete/back.php HTTP/1.0
    User-Agent : MSIE 1525
    Host : MoiYOYO
    Content-type : application/x-www-form-urlencoded
    Content-length : 24
     
    unecle=une sdfsd
    Donc un entête avec que du POST, cela ne fonctionne toujours pas :/

    Sinon le lien que tu as donné, c'est le lien que j'ai, entre autre, utilisé pour faire ce script.

    Mr N., j'ai tripattouillé un peu les librairies CURL sans succès, j'ai le sentiment sans être sur qu'ils utilisent des librairies déja disponible au niveau de l'OS pour parser les entête. Mais je n'en suis pas totalement sur.


    Encore merci de votre interets !

    Bye

  8. #8
    Membre éprouvé
    Inscrit en
    Juillet 2004
    Messages
    1 027
    Détails du profil
    Informations forums :
    Inscription : Juillet 2004
    Messages : 1 027
    Points : 1 164
    Points
    1 164
    Par défaut
    Bon sa y'est j'ai trouvé !

    C4EST LE TRUC LE PLUS BETE QUE JE POUVAIS LOUPE ET JE LAI FAIS !! :sorry:

    En faites, voial le header que je balancais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    POST /Copie%20de%20requete/back.php HTTP/1.0
    User-Agent : MSIE 1525
    Host : MoiYOYO
    Content-type : application/x-www-form-urlencoded
    Content-length : 24
     
    un ecle=une sdfsd  vleur

    Et voila ce qu'il fallait faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    POST /Copie%20de%20requete/back.php HTTP/1.0
    User-Agent: MSIE 1525
    Host: MoiYOYO
    Content-type: application/x-www-form-urlencoded
    Content-length: 24
     
    un ecle=une sdfsd  vleur
    Mais ou est la différence ?! C'est tout simple le nom des entités ( Content-type ect) DOIVENT ETRE COLLER au deux points !

    La plaie je vous jure...

    Bon bah c'est réglé, merci

    je vous le reposte corrigé si sa peut servir à quelqu'un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
     
    <?
     
    class HTTPRequest
    {
    	/* PRIVEE */
    	private $Socket;				// Socket de connexion au serveur
    	private $PORT;					// Numéro du port sur lequel se connecter
    	private $HostToCall;			// Domaine ou ip à appeler
    	private $HTTPResponse;			// Domaine ou ip à appeler
     
    	public function __construct ( )
    	{
    		$this->Socket 				= "";
    		$this->PORT 				= 80;
    		$this->HostToCall			= "";
    	}
     
    	public function ExecuteSSLRequest( HTTPHeaders $Header , $HostToCall )
    	{
    		/* Fonctionne uniquement si l'appel du script est réalisé en SSL */
    		$query = $errno = $errstr = $content = "";
    		$this->PORT = 443;
    		$this->HTTPResponse = NULL;
     
    		$this->HostToCall 	= $HostToCall;
    		$this->Socket 		= fsockopen("ssl://".$this->HostToCall , $this->PORT , $errno , $errstr , 10 );
     
    		try{
    			$this->StartHTTPRequest( $Header );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		try{
    			$this->ReadHTTPResponse ( );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		fclose($this->Socket);
    		return $this->HTTPResponse;
     
    	}
     
    	public function ExecuteRequest (HTTPHeaders $Header , $HostToCall )
    	{
    		$query = $errno = $errstr = $content = "";
    		$this->PORT = 80;
    		$this->HTTPResponse = NULL;
     
    		$this->HostToCall 	= $HostToCall;
    		$this->Socket 		= fsockopen($this->HostToCall , $this->PORT , $errno , $errstr , 10 );
     
    		try{
    			$this->StartHTTPRequest( $Header );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		try{
    			$this->ReadHTTPResponse ( );
    		}catch(Exception $E){
    			throw new Exception ( $E );
    		}
     
    		fclose($this->Socket);
    		return $this->HTTPResponse;
    	}
     
    	private function StartHTTPRequest( $Header )
    	{
    		/* L'ouverture du socket c'est il bien déroulé ? si non, pourquoi */
    		if(!$this->Socket)
    		{
    			fclose($this->Socket);
    			throw new Exception ( $errno." ".$errstr );
    		}
     
    		/* Envoi du HEADER HTTP  */
    		if( !fputs($this->Socket , $Header->__tostring()) )
    		{
    			fclose($this->Socket);
    			throw new Exception ( "Impossible d'ennvoyer le HEADER HTTP !" );
    		}
    		//echo $Header->__tostring();
    	}
     
    	private function ReadHTTPResponse ( )
    	{
    		$this->HTTPResponse = new HTTPResponse();
     
    		$content 	 = "";
    		$status 	 = "";
    		$entete 	 = "";
    		$contenu 	 = "";
    		$regs		 = array();
    		$CRLF		 = chr(13).chr(10);	/* CARRIAGE RETURN LINE FEED */
    		$CRLF		 = "\x0d\x0a";
    		$CRLF		 = "\r\n";
    		while( !feof($this->Socket) )
    		{
    			$content .= fgets($this->Socket);
    		}
     
    		/* Hypertext Transfer Protocol -- HTTP/1.1 -  RFC 2616 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html  */
     
    		/* HTTP STATUS */
    		$pattern 	= '#^HTTP/[0-9][.][0-9][ ][0-9]{3}[ ]{1}[\w- ]*['.$CRLF.']$#m';
    		$regs 		= array();
    		if(preg_match_all ( $pattern , $content , $regs) )
    		{
    			$status = $regs[0][0];
    		}
    		else
    		{
    			throw new Exception( "HEADER HTTP introuvable !" );
    		}		
     
    		/* HTTP INFO */
    		$pattern 	= "#^([A-Z-a-z]{1,}[\s]{0,1}[:]{1}[\s]{0,1})[0-9-\w-,-:- -\\-/-_]{1,}[".$CRLF."]$#m";
    		$regs 		= array();
    		if(preg_match_all ( $pattern , $content , $regs) )
    		{
    			$entete = $regs[0];
    		}
    		else
    		{
    			throw new Exception( "HEADER HTTP introuvable !" );
    		}
    		/* HTTP VARS */
    		//$pattern = "^([a-z-A-Z]*[\s]?[:]{1}[\s]?)[\w-,-:- -\\-/-_]*$[\r\n]{1}";
     
    		/* HTTP BODY */
    		/* Separation de l'entete du contenu */
    		$temp = $status;
    		$temp .= implode("\n",$entete);
     
    		$this->HTTPResponse->Headers = $temp;
    		$this->HTTPResponse->Body = substr($content,strlen($temp));
    	}
    }
     
    class HTTPResponse
    {
    	public $Headers;
    	public $Body;
     
    	public function __construct()
    	{
    		$this->Headers 	= array();
    		$this->Body 	= "";
    	}
     
    	public function __toString()
    	{
    		return $this->Body;
    	}
    }
    class HTTPHeaders
    {
     
    	public $UserAgent;			// Nom du navigateur qui appelle la page	'MSIE'
    	public $Host;				// nom de domaine appelant 					'www.monsite.com' - 213.21.25.26
    	public $ContentType;		// Type mime du contenu envoyer 			'text/xml'
    	public $Version;			// Version du protocole						1.0
    	public $URL;				// Chemin d'accès à la page					'/webservices/yo/'
    	public $TYPE;				// Type de requete à effectuer 				'GET' ou 'POST'
    	public $GetVars;
    	public $PostVars;
     
    	public function __construct ( )
    	{
    		$this->UserAgent 		= "";
    		$this->Host 			= "";
    		$this->ContentType 		= "";
    		$this->Version 			= "1.0";
    		$this->URL 				= "";
    		$this->TYPE 			= "";
    		$this->GetVars 			= new GetVars();
    		$this->PostVars 		= new PostVars();
    	}
     
    	public function __tostring()
    	{
    		$strReturn = "";
    		$strReturn .= $this->TYPE." ".$this->RawUrlEncode ($this->URL);
    		if($this->GetVars->__toString() != "")
    		{
    		$strReturn .= "?".$this->GetVars->__toString();
    		}
    		$strReturn .= " HTTP/".$this->Version."\r\n";
    		$strReturn .= "User-Agent: ".$this->UserAgent."\r\n";
    		$strReturn .= "Host: ".$this->Host."\r\n";
    		$strReturn .= "Content-type: ".$this->ContentType."\r\n";
    		$strReturn .= "Content-length: ".strlen($this->PostVars->__toString())."\r\n";
    		$strReturn .= "\r\n".$this->PostVars->__toString();
    		$strReturn .= "\r\n";
    		return $strReturn;
    	}
     
    	private function RawUrlEncode( $url ) {
    	   $parts = explode('/', $url);
    	   for ($i = 0; $i < count($parts); $i++)
    	   {
    		 $parts[$i] = rawurlencode($parts[$i]);
    	   }
    	   return implode('/', $parts);
    	}
    }
     
    class GetVars
    {
     
    	public $TabVars;
     
    	public function __construct ()
    	{
    		$this->TabVars = array();
    	}
     
    	public function add($Key , $Value)
    	{
    		$this->TabVars[$Key] = $Value;
    	}
     
    	public function __toString()
    	{
    		$strReturn = "";
    		foreach($this->TabVars as $Key => $Value)
    		{
    			$strReturn .= urlencode($Key)."=".urlencode($Value)."&";
    		}
    		$strReturn = substr($strReturn , 0 , strlen($strReturn)-1 );
    		return $strReturn;
    	}
    }
     
    class PostVars
    {
    	public $TabVars;
     
    	public function __construct ()
    	{
    		$this->TabVars = array();
    	}
     
    	public function add($Key , $Value)
    	{
    		$this->TabVars[$Key] = $Value;
    	}
     
    	public function __toString()
    	{
    		$strReturn = "";
    		foreach($this->TabVars as $Key => $Value)
    		{
    			$strReturn .= $Key."=".$Value."&";
    		}
    		$strReturn = substr($strReturn , 0 , strlen($strReturn)-1 );
    		return $strReturn;
    	}
    }
     
    ?>

    Et voila un exemple pour s'en servir en POST :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	$requete = new HTTPHeaders( );
    	$requete->UserAgent 		= "MSIE 1525";
    	$requete->Host 				= "MoiYOYO";
    	$requete->ContentType 		= "application/x-www-form-urlencoded";
    	$requete->Version 			= "1.0";
    	$requete->URL 				= "/Copie de requete/back.php";
    	$requete->TYPE 				= "POST";
    	$requete->PostVars->add("un ecle","une sdfsd  vleur");
    	$requete->GetVars->add("unecle","unevleur");
     
    	$Socket = new HTTPRequest( );
    	$HTTPResponse = $Socket->ExecuteRequest ($requete , "localhost");
     
     
    	echo "HEADER ENVOYES : <br>\n";
    	echo $requete;
    	echo "\n<br>";
    	echo "\n<br>";
    	echo "\n<br>\n";	
    	echo "DUMP : <br>\n";
    	var_dump($requete);
    	echo "\n<br>\n";
    	echo "<br>\n";
    	echo "<br>\n";
    	echo "<br>\n";
    	echo "HEADER REPONDU : <br>\n";
    	echo $HTTPResponse->Headers;
    	echo "<br>\n";
    	echo "CONTENU REPONDU : <br>\n";
    	echo $HTTPResponse->Body;
    Petite note, si vous voulez appeler http://www.google.fr/services/, faites ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    	$requete = new HTTPHeaders( );
    	$requete->UserAgent 		= "MSIE 1525";
    	$requete->Host 				= "MoiYOYO";
    	$requete->ContentType 		= "text/html";
    	$requete->Version 			= "1.0";
    	$requete->URL 				= "/services/";
    	$requete->TYPE 				= "GET";
    	//$requete->PostVars->add("un ecle","une sdfsd  vleur");
    	//$requete->GetVars->add("unecle","unevleur");
     
    	$Socket = new HTTPRequest( );
    	$HTTPResponse = $Socket->ExecuteRequest ($requete , "www.google.fr");
     
    	echo "HEADER ENVOYES : <br>\n";
    	echo $requete;
    	echo "\n<br>";
    	echo "\n<br>";
    	echo "\n<br>\n";	
    	echo "DUMP : <br>\n";
    	var_dump($requete);
    	echo "\n<br>\n";
    	echo "<br>\n";
    	echo "<br>\n";
    	echo "<br>\n";
    	echo "HEADER REPONDU : <br>\n";
    	echo $HTTPResponse->Headers;
    	echo "<br>\n";
    	echo "CONTENU REPONDU : <br>\n";
    	echo $HTTPResponse->Body;

    Voila voila,


    MERCI

    Bye

  9. #9
    FFF
    FFF est déconnecté
    Membre actif Avatar de FFF
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    342
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 342
    Points : 282
    Points
    282
    Par défaut
    n'oublie pas de mettre

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 9
    Dernier message: 21/06/2011, 19h30
  2. Google AuthSub avec une requete POST
    Par Dr. Greg dans le forum Général Dotnet
    Réponses: 0
    Dernier message: 21/10/2009, 20h26
  3. Probleme avec une requete POST
    Par y0ug dans le forum Réseau
    Réponses: 3
    Dernier message: 19/08/2007, 16h57
  4. Traiter une requête POST avec attachement
    Par queto_putito dans le forum Langage
    Réponses: 3
    Dernier message: 30/07/2007, 13h40
  5. Date nulle dans une requete paramétrée avec TParameter
    Par denrette dans le forum Bases de données
    Réponses: 3
    Dernier message: 16/06/2004, 08h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo