Izvorno sučelje Fortran-77 CGI
- By : Admin
- Category : Computer science
Source: http://www.nber.org/sys-admin/fortran-cgi/
Želimo proslijediti ulazne parametre i učitati datoteku iz web preglednika u f77 fortran program na Apache web poslužitelju, ali nismo uspjeli pronaći mnogo korisnih informacija o tome. Naš je cilj koristiti knjižnice, Perl i ništa osim standardnog f77 kao što dolazi s FreeBSD-om. Postoje neka ograničenja zbog nedostatka općenitosti u f77 Ulaz/izlaz, ali on radi ono što nam je potrebno prilično jednostavno iu samo nekoliko redaka koda.
Prijelaz parametara
Ovdje je primjer jedne stranice traži dvije vrijednosti, da ih se pusti na fortran programa koji piše HTML odgovor:
<html>
Please fill each box with 4 characters..
<Form method=”POST” action=”./test1.cgi”>
<Input name=”val1″ type=”text” maxlength=20>
<Input name=”val2″ type=”text” maxlength=20>
<Input Type=”submit” value=” Submit”>
</html>
Metoda “POST” prijelaza parametara je odabrana jer prenosi podatke u izvršnu datoteku preko standardnog ulaza. Alternativna metoda “GET” koristi varijable okruženja koje nisu dostupne iz standardnog Fortran-77. Tekst koji je proslijeđen test1.cgi nalazi se u izrazito neprikladnom nizu, kao što su:
&val1=abcd&val2=1234
To nije lako analizirati u Fortranu jer će se lokacije stupaca vrijednosti prenijeti nizom prema duljini imena i vrijednosti – ali budući da kontrolirate duljinu imena varijabli na HTML stranici, možete kontrolirati stupac mjesta podataka u posebnom slučaju da su varijabilni sadržaji fiksne duljine, što je slučaj kod odabira, potvrdnih okvira i radio gumba. U tim slučajevima jednostavni format za čitanje može izvući varijabilne podatke. Za moj primjer morate unijeti 4 znaka u svaki okvir kako biste dobili ispravan izlaz, ali to ne predlažem kao opće rješenje. To je opisano kasnije.
Ovdje je test1.for koji pretpostavlja kooperativni korisniku:
character*19 a
write(*,100)
100 format(‘Content-type: text/html’//)
read(*,*) a
write(*,*) ‘<html>’
write(*,*) ‘Here is what test1.cgi sees:<br>’
write(*,'(a72)’) a
write(*,*) ‘<p>’
write(*,*) ‘First box:’,a(6:9),'<br>’
write(*,*) ‘Second box:’,a(16:19),'</html>’
stop
end
Treba ga sastaviti:
f77 test1.for -o test1.cgi
u test1.cgi (.cgi vrsta datoteke je potrebno Apache), ali ne treba nikakve posebne knjižnice: Vi ne možete koristiti besplatni-format piše za vrstu sadržaja, jer to treba početi u stupcu 1. dvostruka kosa crta je potreban, inače ćete samo dobiti na pogrešku poslužitelja ( „Prijevremeni kraj zaglavlja” u zapisniku), kao što će, ako ne daju zaglavlje na sve. Nezgodno, poruke o pogreškama ići error_log.
Budući da smo u primjeru koristili okvire za tekst, program je specijaliziran! Raspravljat ću o boljoj metodi za prolazak varijabilnih duljina ispod. Postoji mogućnost da će preglednik prikazati vrijednosti u nekom drugom redu – postoji mogućnost “tabindex” kako bi se to spriječilo, ali nisam ga još trebala najnovije verzije Safari, MSIE i Firefox, jedini preglednici koje sam testirao.
Prijenos datoteka
Također moramo dopustiti korisnicima da prenesu ASCII tekstualnu datoteku. Datoteke se prosljeđuju kao MIME privitci na standardni ulaz, ali su još uvijek vrlo jednostavne. Ovo je html za primjer:
<html>
<Form method=”POST” action=”./test2.cgi” ENCTYPE=”multipart/form-data”>
<input name=”userfile” type=”file” value=””><br>
<Input Type=”submit” value=” Submit”>
</html>
Preglednik opskrbljuje datoteku na poslužitelj kao prilog MIME. Ovdje je Fortran broj za primjer, ona kopira zaglavlja i datoteku natrag na pregledniku za prikaz.
character*72 a
write(*,100)
100 format(“Content-type: text/html”//)
write(*,*)'<html>’
do 10 i=1,20
read (*,'(a72)’,end=99) a
write(*,'(i2,1x,a72,a4)’) i,a,”<br>”
10 continue
99 continue
write(*,*) “</html>”
stop
end
Pripremio sam probnu datoteku za učitavanje koja se sastoji od tri retka “linija 1”, “linija 2” i “linija 3”. Ovdje je prikazan rezultat koji je preglednik pripremio za CGI program
1 —————————–6535751115256
2 Content-Disposition: form-data; name=”userfile”; filename=”New Text Docu
3 Content-Type: text/plain
4
5 line 1
6 line 2
7 line 3
8 —————————–6535751115256–
Prvi redak uspostavlja niz znakova za razdvajanje datoteka, zatim nekoliko redaka zaglavlja opisuje što se prenosi, zatim prazan redak koji signalizira kraj zaglavlja, zatim samu datoteku, a zatim opet separator datoteke (plus još 2 crtice). Ulazni bafer od 72 znaka nije bio dovoljno dugačak da zadrži drugi red zaglavlja s imenom datoteke, tako da je bio skraćen i čitanje je nastavljeno nakon novog reda.
Tu je problem nusisance ovdje da nije očito iz pokretanja test program iznad. Preglednik šalje datoteku s konvencijom crlf ili (hex) 0d0a, dok je naš poslužitelj Unix, koji koristi jedan znak (0a). f77 ne odbacuje 0d pri čitanju, tako da će svaka linija završiti sa 0d. Čitanje nulte linije u varijablu znakova daje vam desno desno ispunjeno razmacima. U praksi sam otkrio da isječak koda:
5 read(*,*) a
if(a(1:1).ge.’!’) goto 5
će preskočiti prazne retke jer je ASCII bang veći od bilo kojeg razmaka i manji od bilo kojeg drugog znaka za ispis. Sa standardnim f77 neće biti moguće čitati binarne datoteke – što nam trenutno ne smeta.
To sam testirao na našim FreeBSD sustavima s MSIE i Firefox, s f77 i g95. Dopisnik ističe da će se gfortran ugušiti kada ga zamole da pročita “a” stavku formata koja se proteže iza kraja linije. Umjesto kopiranja dostupnih znakova do kraja retka nastavlja se čitati na sljedeći redak. To bi taj kompajler učinilo neprikladnim za tu svrhu.
Tekstualna polja promjenjive duljine
Moramo pročitati polja parametra promjenjive duljine. Trik je u korištenju MIME tipa “višedjelni/oblik-podataka”, kako bi se odvojila tekstualna i numerička polja na zasebne linije, a zatim upotrijebiti fortran free-format read na podatkovnim linijama (preskakanje zaglavlja). Ovaj oblik obrasca također omogućuje prijenos datoteka. Primjer:
<html> Please fill in the blanks.
<Form method=”POST” action=”./test2.cgi” ENCTYPE=”multipart/form-data”>
<Input name=”val1″ type=”text” maxlength=40>
<Input name=”val2″ type=”text” maxlength=40> <br>
<input name=”userfile”
type=”file” value=””><br>
<Input Type=”submit” value=” Submit”>
</html>
S ovom metodom svaki se parametar prosljeđuje kao zasebni MIME dio standardnom ulazu, kao i datoteka za prijenos. Ovo je ono što se prosljeđuje fortranu (s predefiniranim brojevima linija):
character*72 a
data x/-9999./,nrec/0/
write(*,100)
100 format(“Content-type: text/html”//)
write(*,*) “<html>Here are the values seen by fortran:<br>”
5 read(*,'(a72)’) a
if(a(1:1).gt.’!’) goto 5
read(*,*,err=6) x
6 read(*,*) a
if(a(1:1).gt.’!’) goto 6
read(*,'(a20)’) a
write(*,*) ‘x=’,x,'<br>’
write(*,*) ‘a=’,a,'<br>’
write(*,*) ‘Here is the file with line numbers added:<br>’
7 read(*,*) a
if(a(1:1).gt.’!’) goto 7
8 continue
read(*,'(a72)’,end=99) a
nrec= nrec+1
if(a(1:10).ne.’———-‘) goto 8
write(*,'(i4,1x,a72,a4)’) nrec,a,'<br>’
99 continue
write(*,*) ‘</html>’
stop
end
Do sada su sva moja polja bila numerička, a f77 format slobodnog čitanja ne smatra 0d kao valjani separator između numeričkih polja. Čitanje znakova zahtijevat će brisanje posljednjeg praznog, jer će uvijek biti 0d.
Komentari, prijedlozi i linkovi su dobrodošli, molimo Vas da mi pišete na dolje navedenu adresu. Posebno me zanima u kojoj su mjeri ove tehnike specifične za preglednik, poslužitelj ili kompajler, ili su na neki drugi način ograničene. Isto tako, očekujem da postoji neki način da se izbjegnu problemi s krajnjim crtama koje nisam svjestan – ako znate, nadam se da ćete me obavijestiti.
Russell Hyer je poslao primjer varijabli čitanja iz Linux okruženja koje ipak ne zahtijevaju nestandardne (ali zajedničko) „getenv” funkcija sustava.
Čuo sam od Clive stranice da u njegovom sustavu web-stranica nije poslana pregledniku dok se Fortran program ne završi:
Pokušao sam sve te stvari – zatvaranje izlaz, to ispiranje, itd. Pokušao sam 3 kompilatora (g95, gfortran, i Nag) i sve može zatvoriti standardni izlaz koliko ja mogu reći. Prilično sam siguran da CGI izlaz nije deklariran kao potpun dok proces ne izađe. Dakle, čak i ako šaljete i očekujete da će stranica biti dovršena, korisnik vidi preglednik koji prikazuje stanje u kojem je zauzet, sve dok CGI proces (i bilo koji potprocesi) konačno ne izađu. To može biti funkcija našeg web poslužitelja (Apache).
To nije bilo moje iskustvo, niti itko od nas može razumjeti kakva je razlika u sustavima.
Drugi izvjestitelj izvještava da njegova izjava o čitanju kompajlera Intel ne može pročitati standardni ulaz s Microsoftovog web poslužitelja. Međutim, getc funkcija radi za njega.
Nedavno sam radio na tome i našao sam redak sadržaja koji više ne prikazuje naziv polja. Nisam siguran zašto je to tako. Također, primjećujem da se neoznačeni potvrdni okviri uopće ne pojavljuju u standardnom ulazu – čineći okvire neupotrebljivima. Radioboxes rade.
Online verzija echo.for je dostupna na http://www.nber.org/sys-admin/fortran-cgi/echo.cgi (ne vruću vezu) gdje možete ga koristiti za svrhe testiranja. Samo promijeniti href u vaše web stranice ukazati na tu stranicu i, a naš poslužitelj će odjek natrag na vas bez obzira na preglednik šalje. Nešto kao obrnuto „show izvora”.
Daniel Feenberg
Nacionalni zavod za ekonomska istraživanja
617-588-0343
feenberg isat nber dotte org
Izvori i više informacija:
- rfc3875 je službena dokumentacija CGI sučelja
- Dokumentacija tipa podataka tipa MIME
- Formatirajte Internetske poruke
- Suvremeni Fortran primjer
- Fortran 90 sučelje za CGI
- CGI s varijablama okruženja
- Još jedan primjer
- Sučelje na jeziku C iz Fortrana 77
- Fortran s AJAX-om
- Korištenje gfortran ekstenzija
Posljednja izmjena 30. kolovoza 2018. godine od strane DRF