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 4 dana, 5 sati
  • VanjusOS: neki mi javi se privatno, barem ako može kratko posuditi na probu
  • VanjusOS: ljudi, ima li možda netko viška Thunderbolt 2 to Thunderbolt 2 Cable
  • drpongrac23: Davno sam vozio "kockicu"
  • drpongrac23: @Yonkis - Kakav BMW - Uskoro kupujem za sebe Citrć Berlingo, jbg, godine...
  • drpongrac23: A zamjena ekrana preko 500 EUR!
  • drpongrac23: WTF?!? Ušle mi neke "bubice" u ekran na MBA M1. Totalni hit!!! 3 kom. BUBA ŠVABE!!!
  • Yonkis: Drpongrac23: a M5? Ne mislim na BMW.
  • drpongrac23: Preko 30 god. vjerni Apple korisnik - sada je vrijeme da zahvalim svima, ali Apple u mojim očima više nije što je nekad bio.
  • drpongrac23: Ovaj novi MacOS - bye, bye Apple!!! Ćesme od svega!
  • drpongrac23: PC za 400 EUR iz Pevexa žvače taj prastari MacPro za gablec :)
  • drpongrac23: U PC svijetu je DDR5 RAM polako standard - o čemu vi pričate?!?
  • BigMac: i ja kažem, prvo bolja pasta, nego zadnji put, i nižaa temperatura, očito prvi put nisam dobro stegao hladnjake, pa su procesori radili na nižem taktu :(
  • dpasaric: Odlično! :)
  • BigMac: Promjenio pastu na starom mac pro, osvježenje ....
  • smayoo: plus je sigurno problematičan, ali nije jedini
  • dpasaric: Više sam zaboravio koji su sve znakovi u pitanju, ali u tome je stvar.
  • dpasaric: I meni se često dogodi na nešto napišem i samo PUF!
  • dpasaric: Jura, na Vikalici se "progutaju" neki komentari jer postoje neki karakteri koje modul Vikalice ne podnosi i onda to sve samo ode u crnu rupu!
  • jura22: Mozda nezasitan?
  • VanjusOS: evo ja sam isprobao i radi! na A1 je moguće sa fizičke SIM prebaciti se na e-SIM na samom telefonu..
  • Borisone: Jer je gladan!
  • jura22: Zasto Jabucnjak guta komentare?
  • smayoo: :D
  • Borisone: Kako prebacuješ eSIM između moba za koji žena smije i za koji ne smije znat?
  • VanjusOS: ali bravo drlovric, nekad su najjednostavnija rješenje i najbolja!
  • VanjusOS: hahaha, problem je što imam službenu SIM karticu, pa ako mi se sjebe moram tražiti od firme da mi šalju novu...
  • drlovric: Pa probas i samo ce ti se kazati jbt. Sta je najgore sto se moze dogoditi? :)
  • VanjusOS: pitam da li je to itko isprobao?
  • VanjusOS: u iphoneu sa fizičkom sim karticom se pojavila opcija da se prebaci ta fizička sim u e-sim
  • VanjusOS: niste me shvatili, očito
  • miomika: na A1 ti samo pošalju na mail/sms ili putem aplikacije Moj A1 i to je to
  • rusty: Prije jedno 3 godine na Tmobile. u 22h navečer putem supporta jer se u protivnom trebalo ići u poslovnicu
  • VanjusOS: da li je netko isprobao funkciju konvertiranja SIM u e-SIM, i na kojoj mreži?
  • ZoPaj: ha ha, nisu li usbC isforsirali upravo radi štednji na punjačima:)
  • dpasaric: I bez punjača... :(
  • Borisone: Danas najavljeni novi iPad Pro, Vision Pro i MacBook Pro 14-inch. Sve s M5 procesorima (bez Pro i Max varijanti).
  • Air: Veliko priznanje Fedora našem Filipoviću - pozvao ga je na boksački meč.
  • Air: Taj pc laptop je imao cijenu cca 800 eura što nije malo
  • Air: Mislio sam da su se malo pomakli u tom smjeru, ali jok
  • Air: trackpad je... hm...
  • Bertone: Rekao sam ti da je kvaliteta izrade loša, ali sam CPU je brži od CPU-a iz MBP 2014/2015,... stavi na njega LinuxMint pa ćeš vidjeti da nije spor ;)
  • Air: Moj MBP 2014 je ferari / Bentley za usporedbu...
  • Air: Moj utisaK da sam ga platio 100-150 eura plakao bi što nisam dao još 150 za MBP 2014 - 2016 godište.
  • Air: Samo da javim, na kraju sam dobio laptop od frenda. Nije htio čuti za nikakve pare. Skro smo se posvađali ali eto pametniji popušta ;)
  • hal9000: Steve Jobs, vrati se! Sve ti je oprošteno! [link]
  • hal9000: Kakva pizdarija: [link]
  • drpongrac23: Meni onaj sa uzorkom krzna leoparda
  • hal9000: @Bertone: Da, jedan od najdražih Wallpapera ikad.
  • Bertone: 5k [link] i 6k [link]
  • Bertone: ... kojeg rado koristim

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Komentari

Anketa

Koji Mac koristite?

Page Speed 0.93 Seconds

Provided by iJoomla SEO