Webstatt.org - Community seit 2006 - 2012 (2024?)

HTTPRequest klasse

Avatar user-271
28.05.2006 13: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 zwinkern 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=''zwinkern {
$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'zwinkern {
$this->GetVars[$key] = $elem;
} elseif(strtoupper($method) == 'POST'zwinkern {
$this->PostVars[$key] = $elem;
}
}
return true;
}

function PassVarsThru( $method,$vars ) {
if(strtoupper($method) == 'GET'zwinkern {
$this->GetVars = array_merge($this->GetVars,$vars);
} elseif(strtoupper($method) == 'POST'zwinkern {
$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'zwinkern;
$buffer = (empty($this->method) ? 'GET' : $this->method).' '.$path.(!empty($getvars) ? '?'.$getvars : ''zwinkern.' HTTP/1.0'."\r\n";

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

if($this->method == 'POST'zwinkern {
$postvars = $this->_makeVars('POST'zwinkern;
$this->addHeader( 'Content-Type','application/x-www-form-urlencoded'zwinkern;
$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'zwinkern {
$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"zwinkern);
$this->recvContent = trim(substr($buffer,strpos($buffer,"\r\n\r\n"zwinkern));

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 : ''zwinkern);

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'zwinkern;

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

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

/* Wenn Post variablen gesetzt sind muss die funktion
*
* $http->setMethod('POST'zwinkern;
*
* 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*

#!/bin/bash
traurig){ neutral:& };: