SMART PHP Proxy 0.4 - popis
Úvodem: PHP Proxy server, je
jednoduchý forwarder ("předávač") HTTP požadavků.
Jelikož posíláme požadavek metodou POST (metoda GET není díky
limitu maximální velikosti přenášených dat příliš vhodná -
s určitými omezeními by se ale dala použít), můžeme hlavičku
požadavku modifikovat různými algoritmy, ať už šifrovacími
nebo kompresními (stejně tak můžeme kompresní algoritmy použít
na data odesílaná zpět prohlížeči, čímž můžeme do značné
míry zvýšit rychlost a propustnost serveru). Této vlastnosti využijeme
například, potřebujeme-li odeslat požadavek přes námi
neadministrovaný proxy server, který díky svým limitům neumožňuje
standardní průchodnost našich HTTP požadavků (např. různé
blacklisty na serverech SQUID atp.). PHP proxy pracuje velice jednoduše,
činnost skriptu si popíšeme v následujícím textu.
Metodou POST jsou skriptu poslány následující parametry:
|
|
header |
|
|
kompletní hlavička HTTP požadavku (včetně cookies a případných POSTdat; řádky
jsou odděleny #13#10) zakódovaná algoritmem Base64. Je důležité, aby za poslední
parametrem požadavku následovaly 2 prázdné řádky \n\r (#13#10). Více ve specifikaci
RFC1945 (HTTP/1.0) nebo
RFC2068 (HTTP/1.1).
|
|
$timeout |
|
|
maximální čas na zpracování požadavku v sekundách. Pokud dotazovaný server
nevrátí odpověď v tomto limitu, je vypsána chyba Request
Timeout. Parametr je nepovinný, pokud není nastaven, výchozí
hodnota je 30 sekund.
|
Jak skript funguje ?
Abychom získali požadavek v rozkódovaném stavu, použijeme
funkci base64_decode. Pokud POSTdata neobsahují proměnnou timeout,
nastavíme ji na 30 sekund. Pro otevření spojení se serverem potřebujeme znát jeho adresu a
port, na kterém server očekává požadavky. Tyto údaje obsahuje
hlavička požadavku - konkrétně řádek začínající
"Host:".
- nejprve si tedy zjistíme pozici slova
"Host:" v řetězci (proměnná $startpos).
- do proměnné $fragment si uložíme
celý řetězec, který následuje za pozicí, kterou nám udává
$startpos+velikost slova "Host:".
- nyní si zjistíme výskyt prvního
ukončení řádky ("\n") a tuto pozici si opět uložíme
do $endpos.
- aby výsledný řetězec zcela odpovídal
našim představám, použijeme funkci trim, která oddělí přebytečné
mezery.
- pokud adresa obsahuje i ":čísloportu",
uložíme si každou část do jedné proměnné ($host a $port).
Pokud není port specifikován, nastavíme sdandardní - 80.
Bez problému již můžeme otevřít spojení se serverem, pomocí
fsockopen. Pokud při spojení dojde k chybě, vypíše se chybové
hlášení - můžeme použít například funkci include a vložit
kompletní html chybovou zprávu, obdobnou například hlášení
serveru APACHE s emailovou adresou administrátora.
-
funkcí fwrite odešleme rozkódovaný požadavek.
-
serverem vrácená data (odpověď na požadavek) načítáme po segmentech, a odesíláme je zpět.
Nedostatek: skript je teprve ve verzi 0.4, všechny odpovědi
přes něj zaslané jsou zatím ve formátu text/html tzn., že všechny
multimediální soubory (GIF,MP3,ZIP...) se stahují jako text popř.
HTML dokument. Řešením bude patrně funkce header, pomocí níž
by se dal nastavit typ odchozích dat (accept). Tento nedostatek se
pokusím odstranit v některé z dalších verzí - i vy můžete
pomoci.
Poznámka: pokud ladíte PHP proxy server, který je umístěn
na localhostě a pokoušíte-li se otevřít spojení přes další
proxy server, ketrý vám zprostředkovává připojení do sítě
internet - spojení se nepodaří a proxy zahlásí chybovou zprávu
s error-code 0.
Download zdrojového kódu je k dispozici zde.
Skript si můžete vyzkoušet na adrese http://milanc.host.sk/smartproxy/smartproxy.php.
|