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 20 sati, 58 minuta
  • Junuz: Yonkis, riješeno.Ubio sam icloud/face time na svim uređajima.Iako se problem manifestovao na 16e.Svakako nekoristim face/imesage.Hvala
  • Yonkis: @Junuz - ti si u USA? Na čijoj si mreži? Vidiš li ti te poruke koje su poslane? Da nemaš USA Apple account? Ne znam, puno informacija nedostaje za ikakvo pojašnjenje. Ili otvori remu/post.
  • cariblanco: Kakav dobar finale tenisa, inače navijam za Noleta, ali on je svoje dao...danas se "griješnik" nije dao u Alcatraz ;9
  • Junuz: Nije baš tako, za par sati su mi naplatili oko 1euro na pozadinsko slanje sms ova u ameriku sa ciljem aktiviranja face time.Iphone koristim od 6 naovamo
  • drpongrac23: @Junuz - pa aktiviraj Facetime i iMessage, ništa te ne košta.
  • Junuz: A naravno nisam siguran kako
  • Junuz: trebao bih pomoć oko pozadinskog slanja sms ova u usa na iphonu.16e model sa novom pretplatom i esim karticom.Trošak raste svako malo a od telekom operatora sam dobio odgovor:U slučaju ako koristite iPhone, Vaš uređaj u pozadini šalje SMS prema svom uslužnom servisu u SAD-u s ciljem aktivacije usluge Facetime i iMessage. Molimo deaktivirajte u postavkama mobilnog uređaja navedene usluge k
  • ping: naravno nije bitno koji smartphone dok god je iphone :)
  • ping: @drlovric koliko se sjećam nije radila ako se spajaš na wifi ali ako koristiš iphone sa hr linijom onda je radilo.
  • drlovric: Koristi li netko MaxTV aplikaciju van HR?
  • Ender: verovatno je to, jer je on sa ekranom od 12", mada je bilo i MB Air-ova 11" pa su imali 2 standarnda USB porta. dobro mozda je on bio malo veci od tog MacBook-a jer je imao onaj siri screen bezel.
  • smayoo: Imao je samo jedan port jer je cijela matična ploča bila toliko malena da nije bilo mjesta za dva. To je bitna ušteda (veličina matične ploče), a ne broj portova
  • Ender: verovatno ce cena biti povoljna uz kompromis da se ukine neke stvari koje postoje kod MB Air-a. recimo MacBook model iz 2015-2016 je cak imao samo jedan USB-C port. neka usteda od par $, al dovoljno da se ustedi taman za bonus nekog menadzera.
  • Ender: Slazem se, masa korisnika nema neke prevelike zahteve, niti koristi zahtevne programe, ali sam sistem postaje s vremenom gladan resursa, i to bude cesto ogranicavajuci faktor. Ali u upravi drage nam firme sede neki ljudi koji vrlo precizno odmere svaki korak, tako da s druge strane mislim da ima smisla, koliko god meni logika govori drukcije.
  • Bertone: Sve ovisi koliko €/$ će tražiti,... masa ljudi još koristi Intel MBA/MBP i ne daje im se 1k€ za osnovni MBA, a potrebe im nisu veće od tu i tamo kojeg dopisa, e-maila ili pogledati kakav video.
  • Ender: malo je bzvz imati MacBook sa procesorom od iPhone-a, a imas iPad sa M1 procesorom. ne vidim segment trzista za taj MacBook.
  • Ender: izgleda ce tako i ovog puta biti. ti MacBook-ovi su imali core-M seriju procesora (M, M3, M5 i M7), a poslednja serija je imala core-i procesore 2017. god.
  • smayoo: Imali su već i prije takav neki proizvod. Onaj "zlatni" macbook 12", zar ne. Pa se nije baš "primio".
  • drpongrac23: [link]
  • drpongrac23: Izgledno je da izlazi low-end MacBook, tj. povratak stare MacBook serije, oviga puta sa iPhone čipom unutra. Ako se ostvari, biti će zanimljivo
  • drpongrac23: @cariblanco - slažem se, no zbog zdravstvenih razloga se bisam usudio ići. Produkcija na svjetskom nivou.
  • cariblanco: Koncert na hipodromu, je neponovljiv po mnogim stvarima...dok sam živ neće ga nitko prestići po mnogim detaljima....ma što god mislili o Marku
  • smayoo: RIP Renato Baretić :(
  • dpasaric: Cijene su ti iste kao u Švicarskoj, kada to prihvatiš, sve bude jednostavnije! :)
  • ping: @drlovric Geneva?
  • ping: A
  • drlovric: Jucer sam stigao a vec sam blago sokiran hrvatskim cijenama. Neke stvari vrijedjaju inteligenciju, ali valjda se brzo naviknem :)
  • smayoo: O, brate, kakav pacijent.. :)
  • dpasaric: Joj on je inače lud tip, ali ovo je skroz fora! :)
  • drlovric: Kakva bolest od videa :) [link]
  • dpasaric: Novi mega-članak na naslovnici! Nije za svakoga, ali za one koji to vole bit će poslastica! :)
  • zoranowsky: Također!
  • vicko: Pridružujem se čestitkama!
  • smayoo: Čestitam svima Dan antifašističke borbe!
  • roPeD: Pokrenuo temu u Softver forumu
  • smayoo: Piši u forum i probaj biti jasniji
  • roPeD: Lijepo molim
  • roPeD: Jel bi netko znao prebaciti onaj nas stari Mini Rijecnik da ga mozemo koristiti sa novim operativnim sustavima i M chipovima
  • roPeD: Pozdrav svima
  • drlovric: Zasto instalirate bete na aktivne uredjaje koje koristite svaki dan :/ Mozda je bolje da ti je bankarstvo prestalo raditi, nego da radi nesto sto ne znas :)
  • ZeljkoB: iOS18 dev beta kad je izasao nije polomio nista, ali 17ica je ubila ZABA app...
  • 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! :)

Za vikanje moraš biti prijavljen.

Prijava

Prisutni jabučari

Novo na Jabučnjaku

Teme

Poruke

Oglasi

Anketa

Koji Mac koristite?

Page Speed 0.80 Seconds

Provided by iJoomla SEO