Willkommen in der Webstatt Zum Webstatt Blog und Stories
nuit nuit am 28.05.06 15:14

Die klasse ist noch nicht ganz fertig, aber sie funktioniert ;D Dokumentiert ist leider nur die Socket klasse...ich werde aber die HTTPRequest auch ncoh Dokumentieren, hatte bis jetzt nicht die Zeit dazu *fg*

Was ist das ganze?
Es ist eine klasse um eine HTTP Anfrage zu stellen. Die Anfrage basiert noch auf HTTP/1.0 weil HTTP/1.1 irgendwie seeehr langsam ist (wahrscheinlich noch ein fehler drin)

Man kann Post-Anfrage und Get-Anfragen machen, mit den antsprechenden Variablen...weil das ganze für einen Proxy geschrieben ist, ist auch eine Funktion dabei um Variablen einfach weiterzupipen ;) was wahrscheinlihc bei normalem Gebrauch nicht verwendet wird..

das ganze basiert auf sockets...d.h. es werden keine Funktionen wie file_get_contents verwenden (wobei das auch möglich wäre ;D, nur gibsch da schwierigkeiten mit dem Header)

das ganze ist in PHP5 geschrieben...ich habe es in PHP4 nicht ausprobiert sollte aber nach meiner erfahrung nicht laufen

Die Socket Klasse
/**
* Class for managing a socket
*/

class Socket {
/**
* handler for the socket
*
* @var resource
*/
private $handler;


/**
* Constructor of the class...if host and port are set opens a socket
*
* @param string $host host for the socket
* @param string $port port for the socket
*/
function __construct( $host='',$port='' ) {
if(!empty($host) AND !empty($port)) {
return $this->connect($host,$port);
}
}


/**
* Creates a socket to a certain host with a certain port
*
* @param string $host host for the socket
* @param string $port port for the socket
* @param int $timeout timeout for the socket
*
* @return resource $this->handler handler for the socket or bool false
*/
function connect( $host, $port,$timeout=30 ) {
$this->handler = @fsockopen( $host, $port, $errno, $errstr, $timeout );

if($this->handler) {
return $this->handler;
} else {
return false;
}
}


/**
* Reads from the socket
*
* @param int $bytes Number of bytes to read from the socket...if not set it will read everything
*
* @return string $buffer The output of the socket
*
*/
function read($bytes='') {
$buffer = '';
if(empty($bytes)) {
while (!feof($this->handler)) {
$buffer .= @fgets($this->handler, 1024);
}
} else {
$buffer = @fgets($this->handler,$bytes);
}

return $buffer;
}


/**
* Writes on the socket
*
* @param string $str The string you want to write on the socket
*
* @return bool always true
*
*/
function send($str) {
@fwrite($this->handler,$str);

return true;
}


/**
* Closes the socket handler
*/
function close( ) {
@fclose($this->handler);
}
}


HTTPRequest Klasse
define('ASARRAY',1);

class HTTPRequest extends Socket {

// Set Private Variables
private $recvHeader,$recvContent;
private $parsedHeader=array();
private $sendHeader=array();
private $PostVars=array();
private $GetVars=array();
private $method='GET';
private $StatusCode;

function setMethod( $method='GET' ) {
$method = strtoupper($method);
$this->method = $method;
return $method;
}

function setHeader( $key,$value ) {
if(is_array($key) AND is_array($value) AND count($key) == count($value)) {
for($i = 0; $i < count($key); $i++) {
$this->sendHeader[$key[$i]] = $value[$i];
}

return true;
} elseif(!is_array($key) AND !is_array($value)) {
$this->sendHeader[$key] = $value;

return true;
}

return false;
}

function setVars( $method,$key,$elem ) {
if(is_array($key) AND is_array($elem) AND count($key) == count($elem)) {
for($i = 0; $i < count($key); $i++) {
$this->setVars( $method,$key[$i], $elem[$i] );
}
} else {
if(strtoupper($method) == 'GET') {
$this->GetVars[$key] = $elem;
} elseif(strtoupper($method) == 'POST') {
$this->PostVars[$key] = $elem;
}
}
return true;
}

function PassVarsThru( $method,$vars ) {
if(strtoupper($method) == 'GET') {
$this->GetVars = array_merge($this->GetVars,$vars);
} elseif(strtoupper($method) == 'POST') {
$this->PostVars = array_merge($this->PostVars,$vars);
}

return true;
}

function fetchURL( $site, $method='GET',$port=80 ) {
$this->setMethod(empty($this->method) ? $method : $this->method);

$parsed_url = parse_url($site);

if($parsed_url['query']) {
$pairs = explode("&",$parsed_url);
foreach($pairs as $pair) {
$split = explode('=',$pair);
$this->addVar( 'GET', $split[0], $split[1] );
}
}

if($this->connect($parsed_url['host'],$port)) {
$this->send($this->_makeHeader($parsed_url['host'],$parsed_url['path']));

if($this->_splitHeaderContent( $this->read() )) {
$this->_statuscode();
$this->_interpretHeader();

return $this->recvContent;

/*if(preg_match('/^30\d/',$this->getStatusCode)) {
return $this->fetchURL( $this->parsedHeader['Location'] );
} elseif(preg_match('/^20\d/',$this->getStatusCode)) {
return $this->recvContent;
}*/
}
}
}

function getHeader( $mod ) {
return ($mod ? $this->parsedHeader : $this->recvHeader);
}

function getContent( ) {
if(!empty($this->recvContent)) {
return $this->recvContent;
} else {
return false;
}
}

function getStatusCode( ) {
return (empty($this->StatusCode) ? $this->_statuscode() : $this->StatusCode);
}

private function _makeHeader( $host,$path ) {
$getvars = $this->_makeVars('GET');
$buffer = (empty($this->method) ? 'GET' : $this->method).' '.$path.(!empty($getvars) ? '?'.$getvars : '').' HTTP/1.0'."\r\n";

$buffer .= 'Host: '.$host."\r\n";

if($this->method == 'POST') {
$postvars = $this->_makeVars('POST');
$this->addHeader( 'Content-Type','application/x-www-form-urlencoded');
$this->addHeader( 'Content-length',strlen($postvars));
}

if(count($this->sendHeader) != 0) {
foreach($this->sendHeader as $key=>$value) {
$buffer .= $key.': '.$value."\r\n";
}
}

if($this->method == 'POST') {
$buffer .= "\r\n".$postvars;
}
#print $buffer;
return $buffer;
}

private function _interpretHeader( ) {
preg_match_all("/([A-Za-z\-]+): (.*?)\r\n/",$this->recvHeader,$match);

for($i = 0; $i < count($match[1]); $i++) {
$this->parsedHeader[$match[1][$i]] = $match[2][$i];
}
return $this->parsedHeader;
}

private function _splitHeaderContent( $buffer ) {
$this->recvHeader = substr($buffer,0,strpos($buffer,"\r\n\r\n"));
$this->recvContent = trim(substr($buffer,strpos($buffer,"\r\n\r\n")));

return true;
}

private function _statuscode( ) {
$arrHeader = explode("\r\n",$this->recvHeader);
$this->parsedHeader['Query'] = trim($arrHeader[0]);

preg_match_all("/HTTP\/\d\.\d (\d{3}) ([a-zA-Z\s\-]+)/",$arrHeader[0],$match);

$this->StatusCode = $match[1][0];

return $match[1][0];
}

private function _makeVars( $method ) {
$vars = (strtoupper($method) == 'GET' ? $this->GetVars : (strtoupper($method) == 'POST' ? $this->PostVars : ''));

if(!empty($vars)) {
$output = '';
foreach($vars as $key=>$elem) {
$output .= $key.'='.$elem.'&';
}

return substr($output,0,-1);
} else {
return false;
}
}
}


Nachdem die HTTPRequest klasse von der Socket klasse erbt werden beide benötigt ;D

Anwendugsbeispiel
<?php
/* Einbindung der beiden klassen */

$http = new HTTPRequest();

/* GET variabeln hinzufügen (normal) */
$http->setVars('GET','argument1','Wert1');

/* GET variablen hinzufügen (mit Arrays) */
$http->setVars('GET',array('argument2','argument3'),array('Wert2','Wert3'));

/* Das gleiche geht mit Post auch, halt nur GET durch POST ersetzen */

/* Wenn Post variablen gesetzt sind muss die funktion
*
* $http->setMethod('POST');
*
* aufgerufen werden, oder der Methode in fetchURL gesetzt werden) */


/* Fals die variablen nur durchgepiped werden sollen */
$http->PassVarsThru('POST',$_POST);


/* Es kann noch die Methode angegeben werden...muss aber nicht */
$content = $http->fetchURL('http://example.com' [ ,$method ]);

/* mit der Constate ASARRAY wird der Header in einem Hash zurückgegeben */
print_r( $http->getHeader(ASARRAY) );
/* wenn er nicht gesetzt ist, wird der Header einfach als Text geliefert */

?>



Wie gesagt das ganze teil ist noch im aufbau...vielleicht kommen nochen methoden wie PUT DELETE oder so hinzu...aber imo funzt sie so ;D und ich werde sie so lassen *fg*

netcup.de Warum gibt es hier Werbung?
Creative Commons Lizenzvertrag
Alle Inhalte des Webstatt-Archivs stehen unter einer Creative Commons Namensnennung - Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.

Impressum & Kontakt