Kako formirati HTTP request?
(1 korsinik/a gleda/ju temu) (1) Gost

Kako formirati HTTP request?


26.08.2011 | 20:15
Ovo je tema možda više za forum Programiranje, ali nisam siguran koliko bi je tamo ljudi vidjelo, a pomišljam da bi možda netko od web developera ovo mogao znati, iako ne prati forum Programiranje...

Dakle, imam jedan embedded uređaj na TCP/IP koji radi to što treba raditi i to nema direktne veze s ovom pričom. Međutim, u uređaj je ugrađen HTTP server i neke CGI skripte putem kojih je moguće programatski mijenjati neke parametre i utjecati na rad uređaja. Konkretno, meni treba jedna specifična komanda. Kad u address bar bilo koje surfalice ja upišem:

http://admin:1234@192.168.1.216/cgi-bin/admin/setparam.cgi?roi=123,456


Uređaj primi taj HTTP request, napravi točno to što želim i vrati jedan redak teksta surfalici:

roi='123,456'


E, sad, moje pitanje je - kako uputiti taj isti HTTP request programatski, iz nekog komada softvera koji pišemo sami, koji nije web preglednik, niti su mi na raspolaganju neke funkcije neke vanjske surfalice, niti mi je praktično pozivati surfalicu i koristiti nju da mi to radi?

Problem pri tom nije situacija kad ne bi bila potrebna autentifikacija. Dakle, kad ne bi bilo usernamea i passworda, otvori se TCP session prema adresi 192.168.1.216 na portu 80 i pošalje se string

GET /cgi-bin/admin/setparam.cgi?roi=123,456


Međutim, naravno, na taj request dobijem grešku 401 Unauthorized

Gledam po netu, da bi trebalo poslati

GET /cgi-bin/admin/setparam.cgi?roi=123,456
Host: localhost
Authorization Basic QWxhZGRpbjpvcGVuIHNlc2FtZQ==


(ova brljotina na kraju je base64 encoded string admin:1234)

Međutim, dva problema me muče:

1. kako odvajam ta tri retka međusobno? Ako ih odvajam sa CRLF, onda server odmah na prvi redak reagira s 401 Unauthorized.

2. ako pokušam najprije poslati Authorization... redak, dobijem poruku od uređaja "501 Not Implemented
POST to non-script is not supported in Boa."
26.08.2011 | 22:33
Mislim da je curl ono sto trazis.
27.08.2011 | 03:42
Meni se čini da si to trebao u programiranje, ak niš drugo, barem bih ranije primjetio.

Meni to sve izgleda kao jedan red, ali sa odvojenim grupama koje čine request. Ovo localhost je adresa, dakle 127.0.0.1 ili ako ide, baš text localhost. Ona utorizacija sigurno ima negdje još neki dodatni opis, recimo da na kraj adrese dodaš nešto kao &auth=QWxhZGRpbjpvcGVuIHNlc2FtZQ== pa bi onda sve izgledalo kao:

127.0.0.1//cgi-bin/admin/setparam.cgi?ro...bjpvcGVuIHNlc2FtZQ==

pošto je GET default. E sad, nije mi jasno kako to da imaš ovaj redak odmah na početku tvog posta:

admin: 1234@192.168.1.216/cgi-bin/admin/setparam.cgi?roi=123,456

Jel to adresa tvog kompa? Zašto sad možeš slati autentikaciju kao plaintext umjesto onog base64 kupusa? Zašto ne koristiš https:// pa onda to nije ni problem? Ova rečenica mi je malo nerazumljiva:

"Problem pri tom nije situacija kad ne bi bila potrebna autentifikacija."

Usput, Autentikacija vs Autentifikacija, tko zna što je ispravno?

hr.wikipedia.org/wiki/Autentikacija
hr.wikipedia.org/wiki/Računalna_sigurnost#Autentifikacija
27.08.2011 | 06:15
Prvi red je ono što se unosi u address bar od surfalice (HTTP clienta). Sintaksa je takva da se username i password (admin:1234) unose prije same adrese servera i od nje odvajaju monkeyem.

Međutim, ako *nemam* surfalicu, odnosno ako želim programatski poslati ovakav HTTP request, onda moram "ručno" reproducirati sadržaj kakav bi poslala surfalica kad joj netko to utipka u address bar (sukladno RFC2616 http://www.w3.org/Protocols/rfc2616/rfc2616.html). A to je onda ovo zadnje. Ali ne kužim čime se odvajaju reci. Jer se sa CRLF šalje request serveru i on odmah odgovara greškom 401 prije nego sam stigao poslati autentifikaciju.

Ili nešto drugo krivo radim?

Riba, problem je u tome što mi stroj s kojeg šaljem HTTP request isto nije normalno računalo s normalnim OS-om, tako da mi cURL ne pomaže. Ali hvala za ideju, pogledat ću u source, možda mi pomogne.
27.08.2011 | 19:29
Nisam siguran da kužim s kojim dijelom zapravo imaš problem (enkodiranje requesta, kod za komunikaciju sa serverom... nešto deseto?), ali zaviri malo u ovaj topic: www.jabucnjak.hr/forum/programiranje/66681-nsurlconnection.html .

U njemu je primjer POST autorizacije, a u tom scenariju ono što šalješ serveru ide kroz setHTTPBody metodu. Ako kod ne pišeš za OS X nego za neku drugu platoformu, to ti vjerojatno neće puno pomoći, ali koncept i činjenica da mora biti uredno enkodirano, možda i hoće.
28.08.2011 | 11:33
Sorry, zapravo mi nije pomoglo uopće. Koliko kužim, ovo je challenge-response autentifikacija. Meni treba obična, glupa, non-secure, basic autentifikacija, gdje klijent treba poslati

username : password

base64 enkodirano, serveru kao običan tekst.

Kôd neće biti za OS X, nego za neku egzotičnu embedded platformu.

Imam problem s razumijevanjem protokola, a moram ga implementirati od nule jer nemam nikakve funkcije na raspolaganju.

HTTP server (taj embedded uređaj) koristi verziju 1.0. Dakle, protokol je opisan u tools.ietf.org/html/rfc1945

Ono što mene konkretno zanima je request, dakle poglavlje 5. Tu piše:

there are two valid formats for an HTTP request:

Request = Simple-Request | Full-Request

Simple-Request = "GET" SP Request-URI CRLF

Full-Request = Request-Line ; Section 5.1
*( General-Header ; Section 4.3
| Request-Header ; Section 5.2
| Entity-Header ) ; Section 7.1
CRLF
[ Entity-Body ] ; Section 7.2


Dakle, simple request je jednostavan za riješiti. Čisto ovako, za probu, otvoriš Terminal i tipkaš

telnet www.jabucnjak.hr 80


dobiješ klasični Telnet odgovor koji nema veze s HTTP protokolom

Trying 62.212.66.212...
Connected to www.jabucnjak.hr.
Escape character is '^]'.


pošalješ simple request

GET http://www.jabucnjak.hr/


(Jabučnjak sjedi na serveru koji nije samo njegov pa onda treba u GET-u poslati apsolutni URI. U mom slučaju bi trebalo unijeti relativni URI, dakle nešto kao "/index.html")

Uglavnom, na ovo dobiješ od servera odgovor u vidu cijele HTML stranice koju bi onda web browser dekodirao i prikazao:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

<link rel="shortcut icon" href="images/favicon.ico" />

<link type="text/css" rel="stylesheet" href="/min/f=templates/jabucnjak/css/template_css.css,components/com_kunena/template/jabucnjak/forum.css,modules/mod_d4j_transmenu.css,modules/mod_modragulizer/mod_modragulizer.css,modules/mod_ninjarss/mod_ninjarss.css" />

<script type="text/javascript" src="/min/?g=js"></script>

<title>Jabučnjak - Novosti</title>
<meta name="description" content="Jabučnjak - Hrvatska zajednica Apple korisnika" />
<meta name="keywords" content="Jabucnjak, apple forum, iphone, mac forum" />
<meta name="Generator" content="Joomla! - Copyright (C) 2005 - 2006 Open Source Matters. All rights reserved." />
<meta name="robots" content="index, follow" />
<link rel="stylesheet" type="text/css" href="http://www.jabucnjak.hr/components/com_jomcomment/style.css"/>
<link rel="stylesheet" type="text/css" href="http://www.jabucnjak.hr/components/com_jomcomment/templates/jabucnjak/comment_style.css"/>


i tako dalje, da sad ovdje ne quotam cijelu naslovnu stranicu jabučnjaka. Uglavnom, nakon što server isporuči stranicu, prekida TCP session (Telnet veza se zatvara)

</body>

</html>
<!-- 1314519197 -->Connection closed by foreign host.


Međutim, kad treba poslati full request, treba poslati više linija, najprije GET, a onda za njom Authorization: header. Međutim, meni server već na prvu liniju reagira i odbije me sa 401 Unauthorized prije nego uopće prihvati i pročita Authorization header koji slijedi.

Dakle, očito sam nešto krivo skužio i nešto krivo radim, a ne kužim što.

Nešto o autorizaciji sam našao i ovdje, ali nije mi ništa jasnije:

en.wikipedia.org/wiki/Basic_access_authentication
28.08.2011 | 23:58
BTW, Riba, molim te prebaci u forum Programiranje. Hvala.

U međuvremenu sam sam sebi odgovorio na pitanje, ali problem još nisam riješio.

Dakle, nasurfao sam i malo modificirao ovu python skriptu:

# Echo server program
import socket

HOST = ''                 # Symbolic name meaning all available interfaces
PORT = 50007              # Arbitrary non-privileged port
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(1)
conn, addr = s.accept()
print 'Connected by', addr
while 1:
    data = conn.recv(1024)
    if not data: break
    print data
conn.close()


Skripta osluškuje na proizvoljnom portu i ispiše na stdout točno ono što primi preko TCP veze. Onda sam sa

python skripta > HTTPREQ


pokrenuo osluškivanje (rezultat osluškivanja će se snimiti u HTTPREQ datoteku koju onda mogu pogledati HEX editorom)

Onda sam u Operu utipkao url

http://admin:1234@127.0.0.1:50007


tako da mi generira ispravni HTTP request.

I konačni zaključak je da su reci razdvojeni sa CRLF.

A zašto mi onda to ne funkcionira kad ja šaljem request? Zar je moguće da je tako kratak timeout (manje od sekunde) nakon kojeg server zaključi da iza prvog retka više ne slijede headeri?
29.08.2011 | 00:55
A da probaš CR i LF poslati encodirano:

LF %0A
CR %0D
29.08.2011 | 07:47
Nema toga u RFC-u. Ta notacija non-printable znakova vrijedi za address bar, ali web klijent prema serveru šalje sirove bajtove.

Čini mi se da je fora u tome da cijeli request mora otići u jednom TCP paketu.
29.08.2011 | 15:00
Imaš negdje dummy repliku sustava na koji se spajaš pa da možemo pogađati rješenje "uživo"? U tom slučaju pomoglo bi znati i koji su limiti, da ne tražimo rješenje u Objective-C ako se unaprijed zna da to nije opcija.
29.08.2011 | 22:30
Morao bi složiti neki dynds da bude dostupno s interneta. Ako ne riješim problem dotle, moći ću to napraviti u četvrtak. Limit je taj da se moraju koristiti funkcije isključivo najniže razine (sirovi TCP socket handling), kao ovo u python primjeru koji sam postao gore. Jezik nije toliko bitan.
30.08.2011 | 00:46
Morao bi složiti neki dynds da bude dostupno s interneta. Ako ne riješim problem dotle, moći ću to napraviti u četvrtak. Limit je taj da se moraju koristiti funkcije isključivo najniže razine (sirovi TCP socket handling), kao ovo u python primjeru koji sam postao gore. Jezik nije toliko bitan.

Ako složiš možemo igrati "tko prvi uspješno pošalje request, pobjednik".
30.08.2011 | 01:14
01.09.2011 | 13:14
Elem, skužio sam u čemu je bio problem. U prvoj liniji (koja počinje s "GET") mora iza URI-ja slijediti razmak pa specifikacija verzije HTTP protokola. Dakle:

GET / HTTP/1.0


Ako toga nema, podrazumijeva se ne HTTP 1.0, nego HTTP 0.9, koji je uvijek single-line request.

Kad server dobije u prvom retku informaciju da se koristi HTTP 1.0 ili 1.1, onda čita i iduće retke koji slijede, sve dok ne naiđe na sekvencu CR LF CR LF LF koja označava kraj requesta. Unutar requesta, svaki je redak zaključen s CR LF.
Moderatori: Bertone
  • Stranica:
  • 1

Vikalica™

Zadnja poruka: pred 3 sati, 37 minuta
  • dpasaric: Meni to zvuči kao logična prva stvar koja će se polomiti.
  • ZeljkoB: Je li tko probao iOS26, a da mu ZABA app i dalje radi OK?
  • hal9000: Sretan rođendan i dobrodošao u klub!
  • drpongrac23: Hvala svima!
  • ping: Sretan rođendan
  • dpasaric: Sretan ti! :)
  • zoranowsky: Sretan ročkas!
  • Yonkis: Sretno ti rođendanovo!
  • smayoo: Sretan ti rođendan! :)
  • drpongrac23: Danas sam ušao u 5-u DEKADU ŽIVOTA!!! Živjeli svi!!!
  • hal9000: [link]
  • Riba: Odnio vrag prisu!
  • hal9000: Za 30-ak godina većina nas ni neće više biti živo pa koga briga za responsive site! :D
  • Borisone: Ma nije to, nego se sada početna stranica učita u tren oka. Treba bar 3-4 sekunde da bi bilo moderno.
  • Riba: Uostalom, nije Jabucnjak neresponsivan nego je vama ekran premalen! :-D
  • dpasaric: I nisi boomer, ti si gen X! :)
  • dpasaric: Zašto bi itko išao na ovaj tip weba s mobitela? :)
  • Riba: Hoce, vec je u pripremi godinama ali je implementacija malo zapela...plus sto ne pomaze sto ja boomer nikada ne idem na jabucnjak sa mobilnog uredjaja. :)
  • CoffeePod: Jabucnjak*
  • CoffeePod: Hoce li Jabuvnjak ikad dobit reponsive sajt?
  • cariblanco: Danas smo u Osijeku, možda shebali turističku sezonu :D
  • dpasaric: Slijedi uskoro osvrt na naslovnici...
  • Air: ...a Applevom slučaju iako te fore drugi telefoni imaju već godinama, ali kad to Apple napravi mi bi se trebali diviti tome kao toploj vodi.
  • Air: Meni Keynote izgleda kao kad Trum hvali samo sebe i svoje odluke kao ono baš najbolje, iako ga je cijeli Svijet popljuvao...
  • drlovric: Na Mac, Spotlight je odlican, kao i boja foldera (konacno) :)
  • drlovric: iPad je odlicno profitirao. Ako sve ovo ne zakljucaju za najnovije modele only :)
  • Riba: Keynote mi je kao neka epizoda Teletubbiesa.
  • Riba: Gledam taj WWDC i razmisljam kako su teme o umiranju mozda privlacnije. :-D
  • dpasaric: Idemo mi na ljepše teme, WWDC je za sat vremena! :)
  • dpasaric: Sve pet, ali nije li zanimljiva statsitika da je od zadnjih 30-ak (toliko pratimo na jednoj internoj grupi objave u medijima) sportaša, umjetnika i ostalih poznaith osoba koje su iznenada umrle, uzorak cijepljenih 100%. A znamo da je kod nas situacija bila cca 50:50, znači nešto lomi statistiku. Evo, samo to primjećujem.
  • smayoo: To što nije u javnosti poznato što je prethodilo njegovoj smrti, ne znači da nije prethodilo ništa čega bi ta smrt bila logičan i sasvim vjerojatan ishod. Moj pokojni stari je umro u 59. godini i svima koji ga nisu jako dobro znali je to bilo "iznenada". Nas koji smo mu bili bliski nije baš *iznenadilo*, iako nam je bilo teško i bolno.
  • Riba: Obrati paznju na nepoznate osobe poput mog oca koji ne uzima lijekove kako je propisano, odbija ici na kontrole, jedva je izvukao zivu glavu nakon srcanog udara pred par godina i jos hoda naokoo unatoc tome sto se cak i cijepio. Znanost bi se trebala na takve slucajeve usredotociti. :)
  • dpasaric: Samo primjećujem uzorak. Do sada je 100% kod domaćih i stranih poznatih osoba koje su iznenada umrle. Ponavljam, možda je zaista slučajnost, ali sada već postaje statistički zanimljivo.
  • Riba: Covjek je vjerojatno pocinio suicid ili izravno ili neizravno alkoholom, nije tu potrebna velika znanost.
  • dpasaric: Sjajan umjetnik je to bio. Velika šteta.:( I gle, opet moramo primjetiti slučajnost koja povezuje sve "prerano" umrle. :( Nadam se da će znanost potražiti uzroke takvoj statistici.
  • smayoo: RIP, Matija :(. Stvarno prerano.
  • dpasaric: Večeras u 19 sati po našem vremenu Appleov #WWDC25 keynote!
  • Maxxy: RIP Matija Dedić :(
  • smayoo: RIP :(
  • dpasaric: Umro Bill Atkinson! :(
  • drpongrac23: @Zdravac - Nemoj ići lijevo ako semafor je desno :) :)
  • Zdravac: hahahah
  • Zdravac: A da se, umjesto palac dolje/gore, uvede palac lijevo/desno?!
  • tino1: Gjuro, bola, Mazlum i to s veliko "M".
  • Gjuroo: Možda "mamlaz"?
  • tino1: Mazlum- na Herceg- Bolansanski- Budala.
  • Yonkis: Mazlum - Mazlum (maẓlūm) is an Arabic term for "oppressed, ill-treated, injured, sinned-against" (the antonym being ẓālim "oppressor"; root ẓlm "to oppress";).
  • tino1: Riba! Vraćaj karmu! Ej ne ćeš se imat kamo vratit.
  • tino1: Ej ukinuo Mazlum Karmu!! Šta vam je odmah vraćaj karmu Riba!!
  • smayoo: :(

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

drlovric, hal9000, Nikx, Riba, robee, Anonimci (481)

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Komentari

Anketa

Koji Mac koristite?

Page Speed 0.86 Seconds

Provided by iJoomla SEO