exm_socket.php
<?php
//
// Example usage...
//
$server ='127.0.0.1';
$port ='80';
$uri ='/cgi-bin/random-cgi';
$content='Your post content...';
$post_results=httpPost($server,$port,$uri,$content);
if (!is_string($post_results)) {
die('uh oh, something went wrong');
} else {
die('Here are your results: '.$post_results);
}
//
// Post provided content to an http server and optionally
// convert chunk encoded results. Returns false on errors,
// result of post on success. This example only handles http,
// not https.
//
functionhttpPost($ip=null,$port=80,$uri=null,$content=null) {
if (empty($ip)) { returnfalse; }
if (!is_numeric($port)) { returnfalse; }
if (empty($uri)) { returnfalse; }
if (empty($content)) { returnfalse; }
// generate headers in array.
$t = array();
$t[] ='POST '.$uri.' HTTP/1.1';
$t[] ='Content-Type: text/html';
$t[] ='Host: '.$ip.':'.$port;
$t[] ='Content-Length: '.strlen($content);
$t[] ='Connection: close';
$t =implode("\r\n",$t) ."\r\n\r\n".$content;
//
// Open socket, provide error report vars and timeout of 10
// seconds.
//
$fp= @fsockopen($ip,$port,$errno,$errstr,10);
// If we don't have a stream resource, abort.
if (!(get_resource_type($fp) =='stream')) { returnfalse; }
//
// Send headers and content.
//
if (!fwrite($fp,$t)) {
fclose($fp);
returnfalse;
}
//
// Read all of response into $rsp and close the socket.
//
$rsp='';
while(!feof($fp)) {$rsp.=fgets($fp,8192); }
fclose($fp);
//
// Call parseHttpResponse() to return the results.
//
returnparseHttpResponse($rsp);
}
//
// Accepts provided http content, checks for a valid http response,
// unchunks if needed, returns http content without headers on
// success, false on any errors.
//
functionparseHttpResponse($content=null) {
if (empty($content)) { returnfalse; }
// split into array, headers and content.
$hunks=explode("\r\n\r\n",trim($content));
if (!is_array($hunks) orcount($hunks) <2) {
returnfalse;
}
$header=$hunks[count($hunks) -2];
$body =$hunks[count($hunks) -1];
$headers=explode("\n",$header);
unset($hunks);
unset($header);
if (!verifyHttpResponse($headers)) { returnfalse; }
if (in_array('Transfer-Coding: chunked',$headers)) {
returntrim(unchunkHttpResponse($body));
} else {
returntrim($body);
}
}
//
// Validate http responses by checking header. Expects array of
// headers as argument. Returns boolean.
//
functionvalidateHttpResponse($headers=null) {
if (!is_array($headers) orcount($headers) <1) { returnfalse; }
switch(trim(strtolower($headers[0]))) {
case'http/1.0 100 ok':
case'http/1.0 200 ok':
case'http/1.1 100 ok':
case'http/1.1 200 ok':
returntrue;
break;
}
returnfalse;
}
//
// Unchunk http content. Returns unchunked content on success,
// false on any errors... Borrows from code posted above by
// jbr at ya-right dot com.
//
functionunchunkHttpResponse($str=null) {
if (!is_string($str) orstrlen($str) <1) { returnfalse; }
$eol="\r\n";
$add=strlen($eol);
$tmp=$str;
$str='';
do {
$tmp=ltrim($tmp);
$pos=strpos($tmp,$eol);
if ($pos===false) { returnfalse; }
$len=hexdec(substr($tmp,0,$pos));
if (!is_numeric($len) or$len<0) { returnfalse; }
$str.=substr($tmp, ($pos+$add),$len);
$tmp =substr($tmp, ($len+$pos+$add));
$check=trim($tmp);
} while(!empty($check));
unset($tmp);
return$str;
}
?>