My $0.02 on handling chunked transfer encoded output... Has rudimentary error handling.
// 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-Encoding: 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;
}?>