něco o mně | fotogalerie | guestbook | download |

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.