Komunikace se serverem pomocí HTTP

Tak jsem tady s tím http ještě jednou.
Trošilinku jsem stdoval a už alespoň tuším jak na to "pumpování dat do serveru" přes socket.

Z manuálu a od Koska jsem získal tyto zdrojáky, schválně jestli ja to tak:

$fp = fsockopen ("server", 80); // navaze spojeni se serverem
if (!$fp):
echo "chyba"; // chyba
else:
fputs ($fp, "http pozadavek"); // posle pozadavek, ale nevim kam (do indexu nebo "jen tak" serveru:-)
while (!feof($fp)): // ted ctu odpoved dokud neni na konci souboru (ale opet jakeho?)
echo fgets ($fp,128);
endwhile;
fclose ($fp); // konec
endif;

Je mi jasné, že tohle mi bylo načrtnuto minule, ale jaksi jsem z toho předtím nebyl moc moudrý. Teď mi zbývá aplikovat toto na mou sms bránu.

- HTTP požadavky nastuduju od Koska (např. "GET /neco.html HTTP/1.1\r\nHost: www.baf.cz\r\n\r\n"), alespoň budu chytřejší.

- Tu odpověď, co čtu, tak to je obyčejná stránka nebo něco speciálního?

Zdravím,

Pavel

p.s.: Co znamená to $fp? file ... (file post - posílaný soubor) nebo něco jiného
$fp je rukojet spojeni. To je proste soubor, ktery ve skutecnosti je spojenim mezi klientem (scriptem) a serverem.

Hlavicka http pozadavku vypada takto:

GET /cesta/soubor.html HTTP/1.1
Host: www.server.cz

Kazdy na novem radku. Za GET je jmeno dokumentu, ktery chces ziskat, Host je adresa - cili: chces-li ziskat stranku z adresy http://www.server.cz/cesta/soubor.html, bude hlavicka presne odpovidat te co jsem nacrtnul. DULEZITE UPOZORNENI. Za poslednim radkem hlavicky MUSI byt jeden radek prazdny.

Odpovedi, na prvnim miste bude ciselny kod, ktery rika, ze 200 - OK, jinak chyba. Pote muze nasledovat spoustu informaci (doporucuji si je nechat zobrazit), potom JEDNA PRAZDNA RADKA a za touto radkou nasleduje ihned HTML stranka (nebo obrazek, pokud si zadal o obrazek).

Takova drovnost. SPOJENI oteviras na adresu www.server.cz a stejnou adresu davas do polozky HOST: Je to nutne.

Tady je priklad slozitejsiho pozadavku (tohle posles do soketu):

GET /follow/rabbit.php?he=is&the=one HTTP/1.1
Host: www.matrix.org
User-Agent: Mozilla/5.0 (compatible; Konqueror/2.2; FreeBSD)
Accept: text/*, image/jpeg, image/png, image/*, */*
Accept-Encoding: x-gzip, gzip, identity
Accept-Charset: Any, utf-8, *
Accept-Language: en, cs_CZ, cs_CZ.ISO_8859-2
Connection: Keep-Alive

(^^^^ zde jedna prazdna radka)

a tady je priklad odpovedi na ten pozadavek (to pak prectes ze souboru).

HTTP/1.1 200 OK
Date: Wed, 10 Apr 2002 17:10:20 GMT
Server: Apache/1.3.19 (Unix) PHP/4.0.4pl1
Keep-Alive: timeout=15, max=100
Connection: Keep-Alive
Transfer-Encoding: chunked
Content-Type: text/html; charset=iso-8859-1


<head>
...
..

EOF (konec souboru);
Jo díky,
takže je to skoro tak, jak jsem myslel. Tu strukturu HTTP požadavku a odpovědi už znám ("Host: server" je kvůli virtuálním serverům a o prázdné řádce taky vím :-)

- takže můj dotaz: jestli odpověď je soubor - je a hlavičky s http výsledkem jsou v něm umístěny na začátku. Z tohoto souboru si teda můžu vybrat, co potřebuji.

- ohledně zaslání toho požadavku: nechat si pomocí GET poslat stránku... je jednoduché, ale jak na server "napumpovat data"? Poslat mu je nějak přes POST? (asi jo, že) Data se pošlou za prázdnou rádkou, jak jsem se dočetl.

Takže na SMS bránu takto:
- pošlu požadavek metodou POST s daty z vyplněného formuláře na operátorův skript
- přijmu jeho odpověď a vyčtu si z ní, jak to dopadlo
ANO?

Díky,
Pavel
Takhle vypada komunikace s branou oskara:

Pozadavek:

GET http://sms.oskarmobil.cz/s_main.php3?locale=cz HTTP/1.0
Accept: text/*, text/html, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; MSN 2.5; Windows NT)
Host: sms.oskarmobil.cz
Pragma: no-cache

Odpoved:

HTTP/1.0 200 OK
Date: Sun, 01 Sep 2002 17:16:30 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.2
X-Powered-By: PHP/4.2.2
Content-Type: text/html
X-Cache: MISS from mistralproxy2.dkm.cz
Proxy-Connection: close

//musis najit tento radek...
<input type="hidden" name="ppp" value="103090059098205:61436b656084f7955510ec5928990b49">
a obsat si tu hodnotu.

Pak nasleduje dalsi pozadavek:

POST http://sms.oskarmobil.cz/send.php3?locale=cz HTTP/1.0
Referer: http://sms.oskarmobil.cz/s_main.php3
Accept: text/*, text/html, */*
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; MSN 2.5; Windows NT)
Host: sms.oskarmobil.cz
Content-Length: 217
Pragma: no-cache

predcisli=0608&number=123456&ppp=103090059098205%3A61436b656084f7955510ec5928990b49&locale=cz&mypred1=%2B42&mypred2=0608&mynumber=123456&sender=&message=Test+zpravy&char_in=11&char_le=749&parts=1&sb=Odeslat+zpr%E1vu

Odpoved serveru ale prekvapiva:

HTTP/1.0 302 Moved Temporarily
Date: Sun, 01 Sep 2002 17:16:33 GMT
Server: Apache/1.3.26 (Unix) PHP/4.2.2
X-Powered-By: PHP/4.2.2
Location: error_successfull_cz.htm
Content-Type: text/html
X-Cache: MISS from mistralproxy2.dkm.cz
Proxy-Connection: close

Musis poslat dalsi pozadavek na adresu z pole "Location:"

GET http://sms.oskarmobil.cz/error_successfull_cz.htm HTTP/1.0
Referer: http://sms.oskarmobil.cz/s_main.php3
Accept: text/*, text/html, */*
User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; MSN 2.5; Windows NT)
Host: sms.oskarmobil.cz
Pragma: no-cache

A vysledkem je uz stranka potvrzujici odeslani SMS.

(vytazeno progamem TCP Snoop)
wow:o).
To není špatný špatný, asi si ten program taky downu
Ondrej to vysvetlil podrobne a pekne - to uz musi byt snad kazdemu jasne... na teto urovni pracujes vlastne uplne stejne, jako prohlizec. vyplati se kouknout do popisu normy alespon na vsechny mozne hlavicky, at vis co muze pri spojeni nastat. kosek urcite nestaci! - to je jen takova berlicka, ukazka pro pochopeni (podrobneji to tam rozebrane neni).

mozna jen jeste upresnim (abych neztratil dobrou povest slovickareni:-)

> jestli odpověď je soubor - je...
...spis bych rekl, ze je to proud dat. pracuje se s tim podobne, ale je to trochu neco jine.

m.s.
Lukasik: To si asi nestahnes, protoze jsem ho psal ja, a funguje na baterky. Je to vlastne proxy, ktera to co prijme ukazuje na obrazovce a odesila to dal.