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 1 dan, 17 sati
  • mbp2009: Reduce transparency zapravo ukloni veliku vecinu tog. Jos ima taj stakleni dio na npr semaforu, ali ukloni se transparentnost opcenito
  • mbp2009: lijepo to sve izgleda, ali generalno mi se cini da trosi bateriju ipak vise
  • mbp2009: instalirao sam ja, iskreno, malo je dosadno pa sam skratio i stavio ono reduce transparency
  • Yonkis: Mislim da stakleni efekt ostaje do sljedećeg desetljeća. Onda možda pređu na kromi ili polirani čelik look. :)
  • smayoo: Što se mene tiče, za taj "fićr" imam zero tolerance. "Podnošljivo" nije dovoljno dobro. :/
  • dpasaric: Ublažili su ga dosta, pa je navodno podnošljivo.
  • smayoo: Ako jesu, možda bih se za odvažio instalirati ga pa testirati
  • smayoo: Jesu li odustali od onog horror liquid shit UI-ja?
  • dpasaric: Za Golden Gate je potreban Appleov M hardver, a ja sam još na Intelu, tako da nemam načina to osobno testirati.
  • dpasaric: Nismo imali recenziju nekog MacOS-a jako jako dugo, valjda je zadnji koji je to zaista zaslužio bio 10.6 Snow Leopard! :)
  • IkoIko: Hoćemo li dobiti osvrt na macos golden gate?
  • dpasaric: Eto osvrt na naslovnici, pa komentirajte, baš me zanima tko će ga prvi kupiti na Jabučnjaku! :)
  • dpasaric: Ma ok, to nije ništa novo, i prije su imali to tako, ali da, slažem se da je to pretjerano i jako "američki"... :)
  • m@xym: Ovaj keynote, k'ooo da ga je pisao Trump... svaka druga riječ im je: "amazing".
  • drlovric: I ja isto. Bas se radujem :)
  • IkoIko: Gledat ću, a i popratiti obvezni članak ovdje ;)
  • dpasaric: Ali ovaj bi konačno mogao biti zanimljiv! :) Mene zanima HomePad kao novi hardver za domomatiku!
  • smayoo: Jedva čekam da ga propustim, kao i sve prethodne. :)
  • dpasaric: Večeras u 19h Apple Keynote! :)
  • smayoo: Heto. Mikrofon ocvikan. Precizno. Elektroničarskim cvikama... :)
  • smayoo: Hvala ti, istražit ću.
  • Yonkis: Hocu reći zvuk dopire do mikrofona i preko vibracija drugih površina, plastika, ne samo preko rupice od mikrofona. Vidi na 52 minuti [link]
  • Yonkis: Mislim da ti to neće biti dovoljno. To kao kad začepiš uho prstom, ti svejedno možeš prepoznati riječi a taj mikrofon je jaaaako osjetljiv, prepozna govor iz druge sobe.
  • smayoo: Imam ja, hvala ti na infomaciji. Korištenje mikrofona sam isključio u postavkama odmah out of the box, a za svaki slučaj mikrofon pokrio UHU patafixom. :)
  • Yonkis: Ima li netko doma LG-ev smart TV? [link]
  • IkoIko: Za powermacove, idem ih danas pogledati pa vam javim!
  • Borisone: Na hrvatskom jeziku: [link]
  • Borisone: About Spotlight indexing and search results on Apple devices [link]
  • Miki9890: Poz! ima li smisla skinuti 26.6.1 na iPhoneu 13 mini radi spotlight indexinga? Da li je to samo za siri Ai kojeg ionako neću imati i hoće li indexirati opet kad prijeđem na 27? trenutno sam na 18-ici
  • Piko: ja bi drugi .... da li rade ?
  • Riba: Pogotovo ako je zracno hladjen.
  • Riba: Mene zanima jedan!
  • IkoIko: Pozdrav zanima li ikog dva powermaca g5?
  • Yonkis: Nisam ovo znao, Apple koristi Google za svoj iCloud [link]
  • marioart: ko zeli iz njemacke uzimati, preporucujem alternate.de - pocetni model je 976€
  • ZoPaj: iducan.hr ima sve konfiguracije, mini i studio, nije preogromna razlika u odnosu na nedavno poskupljeno
  • jura22: Točno, ispravak 1.049eur. Onda i nije neka velika razlika.
  • Yonkis: Nema đabe ni u starog Applea
  • Pongy75: Evo, osnovni model Minija u iStyle je 1.159€ - skoro pa duplo nego nekada osnovni model minija. Tu se gubi svaki smisao povoljnog Mac računala.
  • Pongy75: i u švabiji, koliko je kod nas?!!
  • marioart: @jura to je sa edu popustom, cijena bez popusta je 1049€
  • jura22: Osnovni Mini M6 je 929€. [link]‑core-cpu-12‑core-gpu-16-gb-arbeitsspeicher-256gb-speicher
  • matijazx: - nadživio je svog oca za 10 godina.
  • dpasaric: Jazz legenda!
  • smayoo: RIP Stjepan Jimmy Stanić
  • Pongy75: Ma nek si znaš kaj…
  • matijazx: -- u ovlaštenom Apple storeu, vidio cijene za preoreder.....M6 mini 16GB-cca 1200 eura, 24GB-cca 1700 eura
  • Pongy75: Obično bude koliko dolara toliko u eurima nekih 10%
  • dpasaric: Javim kada dobijemo cijene za Hrvatsku...
  • dpasaric: Sitgli novi M5 Mac mini i M5 Ultra Mac Studio!

Za vikanje moraš biti prijavljen.

Prijava

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Komentari

Anketa

Koji Mac koristite?

Page Speed 0.47 Seconds

Provided by iJoomla SEO