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 2 dana, 12 sati
  • Yonkis: Sretan Božić svima!
  • vjeko1: Sretan Božić svima!
  • jura22: Sretan Božić i blagoslovljeni mi bili svi bez obzira na sve!
  • Gjuroo: Sretan Božić, ekipa!
  • zoranowsky: Sretan Božić svima! :)
  • Djuro genijalac: Sretan Žićbo!
  • Bertone: Sretan Božić!
  • dpasaric: Sretan Božić! :)
  • smayoo: Sretan Božić! :)
  • drpongrac23: Svima koji slave, čestit i blagoslovljen Božić!!!
  • drpongrac23: U peći na drva, naravno, legendarnom Smederevcu!
  • drpongrac23: Da li su svi pripremili purice, janjetinu, odojke, mlince za sutra?!?! Moja je purica nasoljena i čeka jutarnje pečenje!!!
  • imenso: Evo molio bih ako imate 2-3 minute vremena i volju proslijediti dalje za riješiti jednu anketu: [link] Potpuno je anonimno
  • Bertone: Aaaa tooo,... baš sam tutlek :) ... vidi se OK, evo pikčr: [link] ... i sorry na lošoj kvaliteti slike, jbg, nemam sad pri ruci bolju :)
  • smayoo: Mislim da je @iAntu zanimalo kako se vide gravirana slova kad je isključeno osvijetljenje od ispod, dok je dnevno svjetlo
  • Bertone: Nema razlike u količini/vidljivosti svijetla koje dolazi ispod/kroz tipke u odnosu na originalna slova, jedina razlika je mrvicu manji font uz napomenu da sam do sada radio samo lasersko graviranje na ThinkPadima T serije. Planirao sam jednom odnijeti i jedan MBP ali nisam nikad stigao.
  • iAnte: @bertone jesu li gravirana znakovi vidljivi i u dobro osvijetljenim prostorima?
  • dpasaric: Legenda.
  • smayoo: RIP Chris Rea... :(
  • VanjusOS: ovo lasersko graviranje izgleda odlično, nikakve naljepnice!
  • Bertone: ... i da, mislim da je sad graviranje oko 20€
  • Bertone: Lasersko graviranje, baci oko na [link] , ovako izgleda na T14s koji sam nosio kod njih s time da nisam htio baš sve znakove nego samo par osnovnih, tipkovnica je isto bila DE [link]
  • jura22: Radije kupi naljepnice. Ima ih na oglasniku: [link]
  • Riba: Puno, jer ako se ne varam mora se mijenjati kuciste.
  • CoffeePod: Kupio MBP16" M4, al tipkovnica je njemacka. Zna li se koliko bubvrega dode zamjena tipki da mi bude HR?
  • Soffoklo: Misliš bravo retardirana EU birokracija
  • drpongrac23: Bravooo Apple, super!!!
  • m@xym: a evo i pojašnjenja: [link]
  • Yonkis: In iOS 26.2, Wi-Fi network synchronization between iPhone and Apple Watch will no longer be available in the EU.
  • hal9000: HAHAHAHAHAHA: [link]
  • dpasaric: Iskreno, i meni Liquid Glass ide na živce i nije im to trebalo. Srećom barem se na iPhoneu lako ugasi u onim opcijama za invalidne osobe.
  • Borisone: Ne znam što su se svi uspuhali oko Liquid Glass, a tragediju od prikaza UI-a na ne-retina ekranima se tolerira više od desetljeća.
  • CoffeePod: Dyeovog odlazak je mozda najbolja stvar. Racunam da ce implementirat malo nazad Mavericks draži i da će utišat Liquid Glass gimmick. Apple se stvarno mora sjetiti da ljudi vole Apple upravo radi blenda vrhunskog hardware i software koji je funkcionalna koliko i lijepo izgleda. Liquid Glass je form over function 101.
  • Yonkis: Sa novim WApp updateom funkcionalan WhatsApp app na Apple Watchu.
  • IgorD: Zašto ne bi bilo istina? O tom se govori danima, neki ljudi slave što je Dye otišao. Trebao si otvoriti temu
  • Djuro genijalac: Sve mi se čini da je ovo istina..?
  • Djuro genijalac: [link]
  • IgorD: ovo je bilo na 17
  • IgorD: [link]
  • IgorD: Meni radi paste, iPhone Max 15, nije zadnji ios
  • smayoo: Ne možeš s iphonea
  • Djuro genijalac: Jbm, kak se pastea link u vikalicu?
  • Djuro genijalac: Ne znam jel ovo istina, ali....
  • Air: Ja sam u Zg, reci što i kada trebaš?
  • drlovric: Ima li neka dobra dusa iz Zagreba da mi preuzme hedan mali paket i preusmjeri ga na paketomat ili kakogod u Zupanju? :)
  • smayoo: [link]
  • ydrea: @Vanjuška - imamo! Poslao sam ti pp ;)
  • drlovric: Akom znate nekoga da prodaje SteamDeck, ja bih to kupio...
  • Piko: Zašto WP ? .... ima .... samo ja radim u Laravelu, no WP mi nije stran.. što konkretno treba ?
  • dpasaric: Svi otišli u keramičare. Naš ex-voditelj weba radi s mramorom sada. :)

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Air, Ender, Riba, Anonimci (455)

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Anketa

Koji Mac koristite?

Page Speed 0.67 Seconds

Provided by iJoomla SEO