Accueil > > > RELAIS HTTP 1.1 METHODES GET/POST
RELAIS HTTP 1.1 METHODES GET/POST
Information sur la source
Description
Ce script permet de relayer des requetes http pour les methodes POST/GET. Je l'ai devellopé pour une entreprise qui possedait un site internet sous environnement Linux et qui voulait le doter de fonctions cartographiques qui necessitaient un serveur windows qui contiendrait du coup des données confidentielles; le serveur windows était en fait caché par le serveur Linux. Ce relais peut servir à filtrer des requêtes sur des serveurs que vous voulez protéger. Il permet également de voir comment fonctionne les requêtes http 1.1 POST et GET. Pour le faire tourner n'oublier pas d'activer le module socket php, et la ligne always_populate_raw_post_data = On dans le php.ini. Enfin, il semble que ce script ne peut fonctionner que sous apache car il utilise getallheaders() fonction propre à ce logiciel.
Source
- <?
- /////////////////////////////////////////////////////////////////////////////////////////////////////
- // crée le 07/08/05 par Pierre ELINE (pierre95400@hotmail.com) //
- // ------------------------------------------------------------------------------------------------ //
- // Relais de Requête HTTP 1.1 dévellopé pour le CGI de GCIS, il est prévu pour les méthodes GET et //
- // POST. //
- // Pour le configurer, il faut renseigner les variables de la partie CONFIGURATION (ci-dessous) //
- // ------------------------------------------------------------------------------------------------ //
- // Requis : - Le module php_sockets doit être active //
- // - Dans php.ini : always_populate_raw_post_data = On //
- /////////////////////////////////////////////////////////////////////////////////////////////////////
-
- /* CONFIGURATION : */
- /////////////////////////////
- $service_port = 80; // numéro de port du serveur GCIS (par défaut 80)
- $serveur_distant = "beai59"; // adresse du serveur GCIS (exemple : beai59), une IP convient
- $chemin_script = "/scripts/gcis.exe"; // chemin d'accès au script (exemple: /scripts/gcis.exe)
- $serveur_relais = "b563071.inetpsa.com"; // adresse du serveur relais sur lequel est hebergée cette page (côté réseau serveur_distant), une IP convient
- $option_log = false; // true : log active, false : log désactive
-
- /* FONCTIONS : */
- /////////////////////////////
- function dechunk ($var)
- {
- $sortie='';$long_dec=0;
- $i=0;
- do
- {
- $sortie .= substr ($var,$i,$long_dec);
- $long_hexa='';
- do
- {
- $long_hexa .= $var[$i];
- $i++;
- } while ($var[$i] != CHR(13) || $var[$i+1] != CHR(10));
- $i=$i+2;
- $long_dec = hexdec ($long_hexa);
- } while ($long_dec != 0);
- return $sortie;
- }
-
- function envois_reponse ($reponse)
- {
- $tab_reponse = explode (CHR(13).CHR(10).CHR(13).CHR(10),$reponse,2);
- $tab_reponse[0] .= CHR(13).CHR(10).CHR(13).CHR(10);
- header ($tab_reponse[0]);
- $pos = strpos ($tab_reponse[0],"HTTP/1.1 200 OK");
- if ( $pos > 0 or $pos === false) // est-ce le header de la reponse?
- {
- envois_reponse ($tab_reponse[1]); // si non, alors on redecoupe le reste de la reponse en (Header + Reste)
- }
- else // Si oui alors on envoit le coprs de la réponse
- {
- if (strpos ($tab_reponse[0],"Transfer-Encoding: chunked") !== false) // donnees chunked
- {
- echo dechunk ($tab_reponse[1]); // dechunk avant envois
- }
- else
- echo $tab_reponse[1]; // envois sans modifcation
- }
- }
-
- /* SCRIPT : */
- /////////////////////////////
-
- // constitution de la requete http
- $message = $_SERVER['REQUEST_METHOD']; // methode
- $message .= " ".$chemin_script;
- if ($_SERVER['QUERY_STRING']!="")
- {
- $message .= "?".$_SERVER['QUERY_STRING'];
- }
- $message .= " HTTP/1.1\r\n"; // fin methode
- $message .= "Host: ".$serveur_relais."\r\n"; // HOST
-
- $entetes = getallheaders (); // autres champs
- foreach ($entetes as $key=>$val)
- {
- if ($key == "Transfer-Encoding" && $val == "chunked"); // on envoit pas de chunk mais en un seul bloc
- elseif ($key != "Host")
- $message .= $key.": ".$val." \r\n";
- } // fin autres champs
- $message .= "\r\n"; // fin entete
-
- if ($_SERVER['REQUEST_METHOD']=="POST") // ajout du POST
- $message .= $HTTP_RAW_POST_DATA."\r\n";
-
- // Lit l'adresse IP du serveur de destination
- $address = gethostbyname($serveur_distant);
-
- // Cree une socket TCP/IP
- $socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
- $result = socket_connect($socket, $address, $service_port);
-
- // envois de la requete
- socket_write($socket, $message, strlen($message));
-
- // lecture de la reponse
- $tmp = '';
- $reponse = '';
- while ($tmp = socket_read($socket, 2048))
- {
- $reponse .= $tmp;
- }
-
- // Partie Log
- if ($option_log == true)
- {
- $fp = fopen ("log.txt","a+");
- fputs ($fp,$message."\r\n<----------REPONSE---------->\r\n".$reponse."\r\n==============FIN==============\r\n");
- fclose ($fp);
- }
- // fin socket
- socket_close ($socket);
-
- // separation des headers du corps de la reponse puis envois
- envois_reponse ($reponse);
-
- // fin du script
- exit();
- ?>
<?
/////////////////////////////////////////////////////////////////////////////////////////////////////
// crée le 07/08/05 par Pierre ELINE (pierre95400@hotmail.com) //
// ------------------------------------------------------------------------------------------------ //
// Relais de Requête HTTP 1.1 dévellopé pour le CGI de GCIS, il est prévu pour les méthodes GET et //
// POST. //
// Pour le configurer, il faut renseigner les variables de la partie CONFIGURATION (ci-dessous) //
// ------------------------------------------------------------------------------------------------ //
// Requis : - Le module php_sockets doit être active //
// - Dans php.ini : always_populate_raw_post_data = On //
/////////////////////////////////////////////////////////////////////////////////////////////////////
/* CONFIGURATION : */
/////////////////////////////
$service_port = 80; // numéro de port du serveur GCIS (par défaut 80)
$serveur_distant = "beai59"; // adresse du serveur GCIS (exemple : beai59), une IP convient
$chemin_script = "/scripts/gcis.exe"; // chemin d'accès au script (exemple: /scripts/gcis.exe)
$serveur_relais = "b563071.inetpsa.com"; // adresse du serveur relais sur lequel est hebergée cette page (côté réseau serveur_distant), une IP convient
$option_log = false; // true : log active, false : log désactive
/* FONCTIONS : */
/////////////////////////////
function dechunk ($var)
{
$sortie='';$long_dec=0;
$i=0;
do
{
$sortie .= substr ($var,$i,$long_dec);
$long_hexa='';
do
{
$long_hexa .= $var[$i];
$i++;
} while ($var[$i] != CHR(13) || $var[$i+1] != CHR(10));
$i=$i+2;
$long_dec = hexdec ($long_hexa);
} while ($long_dec != 0);
return $sortie;
}
function envois_reponse ($reponse)
{
$tab_reponse = explode (CHR(13).CHR(10).CHR(13).CHR(10),$reponse,2);
$tab_reponse[0] .= CHR(13).CHR(10).CHR(13).CHR(10);
header ($tab_reponse[0]);
$pos = strpos ($tab_reponse[0],"HTTP/1.1 200 OK");
if ( $pos > 0 or $pos === false) // est-ce le header de la reponse?
{
envois_reponse ($tab_reponse[1]); // si non, alors on redecoupe le reste de la reponse en (Header + Reste)
}
else // Si oui alors on envoit le coprs de la réponse
{
if (strpos ($tab_reponse[0],"Transfer-Encoding: chunked") !== false) // donnees chunked
{
echo dechunk ($tab_reponse[1]); // dechunk avant envois
}
else
echo $tab_reponse[1]; // envois sans modifcation
}
}
/* SCRIPT : */
/////////////////////////////
// constitution de la requete http
$message = $_SERVER['REQUEST_METHOD']; // methode
$message .= " ".$chemin_script;
if ($_SERVER['QUERY_STRING']!="")
{
$message .= "?".$_SERVER['QUERY_STRING'];
}
$message .= " HTTP/1.1\r\n"; // fin methode
$message .= "Host: ".$serveur_relais."\r\n"; // HOST
$entetes = getallheaders (); // autres champs
foreach ($entetes as $key=>$val)
{
if ($key == "Transfer-Encoding" && $val == "chunked"); // on envoit pas de chunk mais en un seul bloc
elseif ($key != "Host")
$message .= $key.": ".$val." \r\n";
} // fin autres champs
$message .= "\r\n"; // fin entete
if ($_SERVER['REQUEST_METHOD']=="POST") // ajout du POST
$message .= $HTTP_RAW_POST_DATA."\r\n";
// Lit l'adresse IP du serveur de destination
$address = gethostbyname($serveur_distant);
// Cree une socket TCP/IP
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
$result = socket_connect($socket, $address, $service_port);
// envois de la requete
socket_write($socket, $message, strlen($message));
// lecture de la reponse
$tmp = '';
$reponse = '';
while ($tmp = socket_read($socket, 2048))
{
$reponse .= $tmp;
}
// Partie Log
if ($option_log == true)
{
$fp = fopen ("log.txt","a+");
fputs ($fp,$message."\r\n<----------REPONSE---------->\r\n".$reponse."\r\n==============FIN==============\r\n");
fclose ($fp);
}
// fin socket
socket_close ($socket);
// separation des headers du corps de la reponse puis envois
envois_reponse ($reponse);
// fin du script
exit();
?>
Conclusion
Je garantis (et encore :p)ce script uniquement pour les methodes GET et POST, je n'ai pas essaye les autres.Il se peut que vous ayez besoin de l'adapter vu que je ne connais pas par coeur le protocole http (header exotique genre erreur xxx) Une optimisation possible mais j'avais la flemme, c'est de relayer les données à la volée alors que la on attend d'avoir charger tout la page avant de la relayer. Je ne l'ai pas fais car normalement il faut séparer le header du corps de la réponse, donc ca demande quelques modifications.
Historique
- 10 août 2005 14:38:43 :
- Ajout d'une option log, ca n'a rien d'extraordianaire mais ca m'a pas mal aider pour le debuguer ou pour ajouter d'autes fonctionnalités.
Désormais, le relais gère les modes de transmissions "chunked" (seulement dans le sens serveur_distant => serveur_relais, la transmission serveur_relais => client se fait d'un seul tenant), ce mode consiste en fait à découper la page en plusieurs morceaux avant de l'envoyer.
- 10 août 2005 16:33:26 :
- Le corps d'une requete POST n'est desormais plus reconstitue en parcourant le tableau $_POST, c'est la variable $HTTP_RAW_POST_DATA qui est utilisee. Cela permet par exemple de relayer l'envois de fichier.
Sources de la même categorie
SONDAGE - VOTE - POLL (AVEC MYSQL)SONDAGE - VOTE - POLL (AVEC MYSQL) Vous souhaitez inclure un sondage en ligne sur votre site. Certes, l'interface admin n'est pas de toute beauté mais ça fonctionne ;-)
- Gestion/sto...
par hornet_bzz
LISTENGEN GÉNÉRATEUR DE FICHIER PLAYLISTLISTENGEN GÉNÉRATEUR DE FICHIER PLAYLISTLisTenGEN
Générateur de fichier playlist pour webradio
Extension compatible : .pls, .m3u, .m3u8, .ram, .qtl, asx, wax, wpl....
par AGG
IP CALCULATORIP CALCULATOR Cette classe est la version PHP du programme unix ipcalc. Il permet de calculer à partir d'une adresse IP (en binaire, hexadécimal ou au format xxx.xx...
par X_Cli
WHOIS DOMAIN CLASS : LOOKUP & AVAIBILITYWHOIS DOMAIN CLASS : LOOKUP & AVAIBILITYCe script vous permettra de lancer une requette whois. Le whois vous renseigne les informations d'un nom de domaine, et éventuellement vous indique si...
par aKheNathOn
Commentaires et avis
Discussions en rapport avec ce code source dans le forum
Construisez votre site portail en Php avec Xoops [ par frxoops ]
Nouveau sur ce forum, je vous invite à découvrir Xoops... (eXtended Object Oriented Portal System)Xoops est un CMS (Content Management System) écrit e
remplacer un lien dans un fichier HTML [ par bibou56 ]
Salut je dois modifier l'url d'un lien dans un fichier html.Je fais ca : if(is_writeable($cheminAbsoluPage)){$fic=fopen($cheminAbsoluPage, "r+");while
MySQL et images [ par Marneus Calgar ]
SalutJ'aimerais savoir s'il est possible de stocker des images dans une table MySQL et d'y accéder depuis une page PHP. En fait, je voudrais faire un
MySQL et images [ par Marneus Calgar ]
SalutJ'aimerais savoir s'il est possible de stocker des images dans une table MySQL et d'y accéder depuis une page PHP. En fait, je voudrais faire un
Ne pas afficher la barre de Menu Image [ par microdav ]
Bonjour à vous Internaute,je vous soumets une petite question...Je recherche Code permettant de ne pas faire afficher la barre de menu "Image" sur une
formulaire a envois double [ par Henixiz ]
est ce que cest possible d'envoyer un formulaire a 2 e-mail a la fois !voici mon code source<? $Emaildest="mon_email@et_la.net"; function Formulai
formatter du texte [ par eax ]
bonsoir,g besoin d'aide:je souhaiterais transformer le contenu d'une variable $url pour avoir une addresse du genre http://www...com quelque soit la v
FreeTelecom et MySql [ par bigfootspi ]
je n'y comprends rien !!! ca me depasse !!!j'ai fais un livre d'or qui marche tres bien (en local) mais le probleme, c'est que des qu'il est hebergé s
Peu commun select + transmission de variables [ par bladbud ]
Bonjour,Voilà je vous mets de screen si jamais je n'explique mal ici ma premiere page :les boutons "+ " servent aux zones de liste et derrière chaque
Tester lien [ par wbr ]
Bonjour, j'ai besoin d'un script pour tester si un lien http est valide ou pas. Ex. Je tape http://phpcs.com dans une champ de texte et ilme retourne
|
Derniers Blogs
UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010TECHDAYS PARIS 2010 : LA BI DANS SHAREPOINT 2010 par ROMELARD Fabrice
Animé par: Vincent Bellet et Baptiste Giraudier La BI dans SharePoint 2010, Les nouveaux services d'application dans SP2010 et SQL Server Reporting services 2008 R2. La BI dans SharePoint est généralisée pour tous afin de permettre à tous les coll...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice
Forum
RE : IMPORT CSVRE : IMPORT CSV par ykhider
Cliquez pour lire la suite par ykhider RE : HTML VERS PDFRE : HTML VERS PDF par abdennassir2
Cliquez pour lire la suite par abdennassir2
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|