[b]De class:[/b]
[code]
<?php
class httpRequest {
	/////
	// Met deze class kan je een HTTP POST request versturen naar een url
	
	/////
	// De variabelen
	
	// De host, uri en poort waarnaar gepost moet worden
	private $strUrl;           // Zonder 'http://'
	private $strHost;
	private $strUri;
	private $intPoort;
	
	// De headers die meegegeven worden, als array en als string
	private $arrHeader;
	private $strHeader;
	
	// De argumenten die meegegeven worden, als array, als string en als int (lengte van string)
	// Allemaal al geëncodeerd (met urlencode)
	private $arrArgumenten;
	private $strArgumenten;
	private $intArgumenten;
	
	// De variabele die de pointer van fsockopen bevat
	private $resFilePointer;
	
	// De response die tergugekregen wordt
	private $strResponse;
	private $strResponseHeader;
	private $strResponseBody;
	
	/////
	// De publieke functies
	
	// De functie die wordt aangeroepen aan het begin van de class
	public function __construct($strUrl, $arrArgumenten=array(), $intPoort=80) {
		// Verwerk de url en sla het op
		$this->verwerkUrl($strUrl);
		
		// Verwerk de argumenten en sla ze op
		$this->verwerkArgumenten($arrArgumenten);
		
		// Verwerk de poort en sla hem op
		$this->verwerkPoort($intPoort);
		
		// Maak de headers
		$this->maakArrHeader();
		$this->maakStrHeader();
		
		return true;
	}
	
	// De functie die wordt aangeroepen aan het einde van de class
	public function __destruct() {
		// Sluit de verbinding als die nog bestaat
		if ($this->resFilePointer) {
			fclose($this->resFilePointer);
		}
		
		return true;
	}
	
	// De functie die de verbinding opent en de variabelen verzent
	public function verzendRequest() {
		// Probeer de verbinding te maken en de variabelen te verzenden
		try {
			// De 30 aan het einde geeft aan dat er maximaal 30 seconden geprobeerd wordt om een verbinding te maken
			$this->resFilePointer = fsockopen($this->strHost, $this->intPoort, $intErrNummer, $strErrBericht, 30);
			if (!$this->resFilePointer) {
				throw new Exception ($intErrNummer.": ".$strErrBericht);
			}
			if (fputs($this->resFilePointer, $this->strHeader) === false) {
				throw new Exception ("Kan de header niet verzenden");
			}
			if (fputs($this->resFilePointer, $this->strArgumenten) === false) {
				throw new Exception ("Kan de argumenten niet verzenden");
			}
			
			return true;
		}
		// Als het niet gelukt is...
		catch (Exception $e) {
			$this->errorHandler("Fout tijdens het verzenden van de request (".$e->getMessage().")");
		}
		
		return false;
	}
	
	// De functie die de response ophaalt en teruggeeft
	public function response ($booInclHeaders=false) {
		// Haal de response op, als die nog niet is opgehaald
		if (empty($this->strResponse)) {
			$strResponse = "";
			while (!feof($this->resFilePointer)) {
				$strResponse .= fread($this->resFilePointer, 4096);
			}
			
			// Sla de response op als private variabele
			$this->strResponse = $strResponse;
			
			// Verwerk de response
			list($strResponseHeader, $strResponseBody) = explode("\r\n\r\n", $strResponse, 2);
			// En sla het op als private variabele
			$this->strResponseHeader = $strResponseHeader;
			$this->strResponseBody = $strResponseBody;
		}
		
		// Return de waarde
		if ($booInclHeaders) {
			return $this->strResponse;
		}
		else {
			return $this->strResponseBody;
		}
	}
	
	/////
	// De privé-functies
	
	// De functie die de url verwerkt en opslaat
	private function verwerkUrl($strUrl) {
		// verwijder het 'http://' van de url
		if (substr($strUrl, 0, 7) == "http://") {
			$strUrl = substr($strUrl, 7);
		}
		
		// Haal de host en de uri op uit de url
		list($strHost, $strUri) = explode("/", $strUrl, 2);
		
		// Voeg een slash toe voor de uri
		$strUri = "/".$strUri;
		
		// Sla de gevonden url, host en uri op als private variabelen
		$this->strUrl = $strUrl;
		$this->strHost = $strHost;
		$this->strUri = $strUri;
		
		return true;
	}
	
	// De functie die de argumenten verwerkt en opslaat
	private function verwerkArgumenten($arrArgumenten) {
		// Url encode de waardes van de argumenten
		// NIET DE NAMEN VAN DE VARIABELEN!!!
		$arrArgumentenEncoded = array();
		foreach ($arrArgumenten as $strVarNaam => $strVarWaarde) {
			$arrArgumentenEncoded[$strVarNaam] = urlencode($strVarWaarde);
		}
		
		// Van array naar string
		$strArgumentenEncoded = "";
		foreach ($arrArgumentenEncoded as $strVarNaam => $strVarWaardeEncoded) {
			$strArgumentenEncoded .= "&".$strVarNaam."=".$strVarWaardeEncoded;
		}
		// Haal de eerste ampersand (&) weg
		$strArgumentenEncoded = substr($strArgumentenEncoded, 1);
		
		// Van string naar int (hoeveel karakters)
		$intArgumentenEncoded = strlen($strArgumentenEncoded);
		
		// Sla de gevonden variabelen opo als private variabelen
		$this->arrArgumenten = $arrArgumentenEncoded;
		$this->strArgumenten = $strArgumentenEncoded;
		$this->intArgumenten = $intArgumentenEncoded;
		
		return true;
	}
	
	// De functie die de poort controleerd en opslaat als het klopt
	private function verwerkPoort($intPoort) {
		// Controleer of het een getal is
		if (is_numeric($intPoort)) {
			// Controleer of het tussen de 0 en 65535 ligt
			if ($intPoort >= 0 && $intPoort <= 65535) {
				// Controleer of het geen comma-getal is
				if ((float)$intPoort-(int)$intPoort == 0) {
					// Poort klopt, sla op als private variabele
					$this->intPoort = (int)$intPoort;
					
					return true;
				}
				else {
					$this->errorHandler("Poort kan geen komma-getal zijn");
				}
			}
			else {
				$this->errorHandler("Poort ligt niet tussen de 0 (nul) en 65535.");
			}
			$this->errorHandler("Poort is geen getal.");
		}
		
		return false;
	}
	
	// De functie die de header array vult
	private function maakArrHeader($arrExtraHeader=array()) {
		$arrHeader = array (
			// Vertel dat we een POST request gaan doen en naar welke uri
			"POST ".$this->strUri." HTTP/1.1",
			// Vertel welk content type het is
			'Content-Type' => "application/x-www-form-urlencoded",
			// Vertel hoelang de string met variabelen is
			'Content-Length' => $this->intArgumenten,
			// Vertel dat aan het einde de verbinding verbroken moet worden
			'Connection' => "Close"
		);
		
		// Voeg de extra headers toe
		// Niet via array_merge, omdat die bij dubbele keys de oude overschrijft
		foreach ($arrExtraHeader as $varNaam => $strWaarde) {
			if ($varNaam == "" || is_int($varNaam)) {
				$arrHeader[] = $strWaarde;
			}
			else {
				$arrHeader[$varNaam] = $strWaarde;
			}
		}
		
		// Sla de headers op als private variabele
		$this->arrHeader = $arrHeader;
		
		return true;
	}
	
	// De functie de de header array omzet in een string
	private function maakStrHeader($arrHeader=array()) {
		// Als er niks is meegegeven, gebruik dan $this->arrHeader
		if (empty($arrHeader)) {
			$arrHeader = $this->arrHeader;
		}
		
		// Voeg de waardes samen met een '\r\n' ertussen.
		// Bij een numerieke key, de key niet weergeven. Anders ': ' ertussen.
		$strHeader = "";
		foreach ($arrHeader as $varNaam => $strValue) {
			if (is_int($varNaam)) {
				$strHeader .= $strValue;
			}
			else {
				$strHeader .= $varNaam.": ".$strValue;
			}
			$strHeader .= "\r\n";
		}
		
		// Voeg aan het einde een extra '\r\n' toe
		$strHeader .= "\r\n";
		
		// Sla de header string op als private variabele
		$this->strHeader = $strHeader;
		
		return true;
	}
	
	// De functie die de foutafhandeling regelt
	private function errorHandler ($strErrBericht) {
		die ("<strong>httpRequest Error:</strong> ".$strErrBericht);
		return false;
	}
}
?>
[/code]


[b]Voorbeeld hoe te gebruiken:[/b]
[code]
<?php
// Je begint bij het begin: maak een object aan
$httpRequest = new httpRequest ("http://www.jouwdomein.nl/script.php", array("var1" => "waarde 1", "var2" => "waarde 2"), 80);
// Hierbij is het eerste argument de url waarnaar de request verstuurd moet worden.
// (het maakt niet uit of je er 'http://' voor gebruikt).
// Als tweede argument geef je een array met de variabelen die meegestuurd moeten worden. Je hoeft geen variabelen mee te geven.
// Als laatste kan je de poort instellen. Standaard is dit poort 80.

// Hierna verzend je de request:
$httpRequest->verzendRequest();

// Tot slot haal je de response op
$response = $httpRequest->response(true);
// Als argument geef je op of je de headers van de response wel (true) of niet (false) wilt ophalen.
// Standaard is dit false.
?>
[/code]