Język Fortran-77 Interfejs CGI

Original: http://www.nber.org/sys-admin/fortran-cgi/

Chcemy przekazać parametry wejściowe i przesłać plik z przeglądarki internetowej do programu f77 Fortran na serwerze WWW Apache, ale nie byli w stanie znaleźć wiele przydatne informacje na temat tego. Naszym celem jest, aby korzystać z żadnych bibliotek, nie Perl i nic ponad standardowe F77, tak jak to jest z FreeBSD. Istnieją pewne ograniczenia ze względu na brak ogólności w F77 I / O, ale to nie to, co trzeba całkiem wprost i tylko kilku linii kodu.

Przekazywanie parametrów

Oto przykład strony z prośbą o dwóch wartości, przekazując je do programu, który pisze Fortran odpowiedź HTML:

Please fill each box with 4 characters..

„POST“ metoda przekazywaniu parametrów jest wybrany, ponieważ przesyła dane do pliku wykonywalnego za pomocą standardowego wejścia. Alternatywa „GET“ metoda wykorzystuje zmienne środowiskowe, które nie są dostępne z normą Fortran-77. Tekst przekazany do test1.cgi jest w zdecydowanie Fortran nie przyjazny ciąg, takich jak:

&val1=abcd&val2=1234
To nie jest łatwe do analizowania w fortran od lokalizacje kolumn wartości będzie dryfować przez ciąg według długości nazw i wartości – ale skoro kontrolować długość nazw zmiennych na stronie HTML, można kontrolować kolumnę lokalizacje danych w szczególnym przypadku, że zmienne treści są stałej długości, która jest w przypadku wyboru, pola wyboru i przyciski opcji. W tych przypadkach, proste stałe Format odczytu można wyodrębnić zmienne dane. Na moim przykładzie trzeba wpisać 4 znaki w każdym polu, aby uzyskać poprawny wynik, ale nie uważam tego jako rozwiązanie ogólne. To jest opisane później.
Oto test1.for która zakłada spółdzielni użytkownika :.

      character*19 a
write(*,100)
100 format(‚Content-type: text/html’//)
read(*,*) a
write(*,*) “
write(*,*) ‚Here is what test1.cgi sees:

write(*,'(a72)‘) a
write(*,*) ‚


write(*,*) ‚First box:‘,a(6:9),‘

write(*,*) ‚Second box:‘,a(16:19),“
stop
end
To musi być skompilowany:

f77 test1.for -o test1.cgi
w test1.cgi (filetype .cgi jest wymagane przez serwer Apache), ale nie wymaga żadnych specjalnych bibliotek: Nie można używać w dowolnym formacie pisze do Content-Type z powodu, że musi zacząć w kolumnie 1. podwójny ukośnik jest wymagane, w przeciwnym razie będzie można dostać tylko błąd serwera („Przedwczesny koniec nagłówków“ w dzienniku), jak będzie, jeśli nie zapewniają nagłówek w ogóle. Niewygodnie, komunikaty o błędach przejść do error_log.
Ponieważ stosowane pola tekstowe w przykładzie, program jest raczej specjalizuje się! I „ll omówienia lepszego sposobu przekazywania zmiennych użądlenia długości poniżej Istnieje możliwość, że przeglądarka będzie przedstawienie wartości w innej kolejności. – Nie ma opcji“ tabindex „, aby temu zapobiec, ale nie potrzebowałem jeszcze z Nowsze wersje Safari i Firefox, Internet Explorerze, niewielu przeglądarek Mam badanych.

Przesyłanie plików

Musimy również pozwolić użytkownikom przesłać plik tekstowy ASCII. Pliki są przesyłane jako załączniki MIME do standardowego wejścia, ale nadal jest dość prosta. Oto html dla przykładu:


Przeglądarka dostarcza plik do serwera jako załącznik MIME. Oto kod Fortran na przykład, że kopiuje nagłówki i pliku z powrotem do przeglądarki do wyświetlania.

character*72 a
write(*,100)
100 format(„Content-type: text/html“//)
write(*,*)“
do 10 i=1,20
read (*,'(a72)‘,end=99) a
write(*,'(i2,1x,a72,a4)‘) i,a,“

10 continue
99 continue
write(*,*) „“
stop
end
Przygotowałem plik testowy do przesłania składający się z trzech linii „Line 1“, „Linia 2“ i „linii 3“. Oto wynik zwracany, a przygotowane przez przeglądarkę dla programu CGI:

1 —————————– 6535751115256
2 Content-Disposition: form-data; name = „userfile“; filename = „Nowy Docu Tekst
3 Content-Type: text / plain
4
5 linii 1
6 Linia 2
7 linia 3
8 —————————– 6535751115256–
Pierwsza linia określa ciąg separatora pliku, a następnie kilka linii nagłówka descrbe co jest przekazywane, to pusta linia sygnalizować koniec nagłówki, a potem sam plik, a następnie ponownie separator plików (plus 2 więcej myślników). Bufor wejściowy 72 znaków nie było wystarczająco długo trzymać 2nd wiersz nagłówka z nazwą pliku, tak aby był ścięty i czytania wznowione po nowej linii.

Nie jest problemem nusisance, że nie jest oczywiste z uruchomieniem programu testowego powyżej. Przeglądarka wysyła plik z linii kończącym CRLF konwencji lub (Hex) 0d0a, podczas gdy nasz serwer jest Unix, który wykorzystuje pojedynczy znak (0A). f77 nie odrzuca 0d podczas czytania, więc każda linia zakończy 0d. Czytanie linii null do zmiennej znaków daje 0d prawo wypełnione spacjami. W praktyce okazało się, że mam fragment kodu:

5 read(*,*) a
if(a(1:1).ge.‘!‘) goto 5
pominie nie puste wiersze, ponieważ ASCII huk jest większy niż białe znaki i mniej niż w jakimkolwiek innym charakterze wydruku. Ze standardowym F77 nie będzie możliwe do odczytu plików binarnych – to nie przeszkadzało nam w tej chwili.
Przetestowałem to na naszych systemów FreeBSD z MSIE i Firefox, z F77 i G95. Korespondent zauważa, że ​​gfortran będzie dusić pytany czytać „A“ formatu, które streches poza linię wycofanego z. Zamiast kopiować dostępne znaki, aż do końca linii nadal czytać do następnej linii. To sprawi, że kompilator nie nadają się do tego celu.

Zmienna długość pola tekstowe

Mamy musisz czytać zmiennych pól parametrów długości. Sztuką jest, aby użyć „wieloczęściowy / form-data“ typu MIME, aby oddzielić tekst i pól numerycznych na oddzielnych liniach, a następnie użyć Fortran wolnego formatu przeczytać na linii danych (pomijając nagłówki). Tego typu forma pozwala również na przesyłanie plików. Przykład:

 

Please fill in the blanks.

W ten sposób każdy z parametrów, który jest jako odrębna część MIME standardowe wejście, jak do wysyłania plików. O to, co jest przekazywane do fortran (z poprzedzany numerów linii):

 
1 ————0xKhTmLbOuNdArY
2 Content-Disposition: form-data; name=“val1″
3
4 123.999
5 ————0xKhTmLbOuNdArY
6 Content-Disposition: form-data; name=“val2″
7
8 abcd
9 ————0xKhTmLbOuNdArY
10 Content-Disposition: form-data; name=“userfile“; filename=“test.txt“
11 Content-Type: text/plain
12
13 line 1
14 line 2
15 line 3
16
17 ————0xKhTmLbOuNdArY–
Oto fortran odpowiadały na stronie internetowej:

    character*72 a
data x/-9999./,nrec/0/
write(*,100)
100 format(„Content-type: text/html“//)
write(*,*) „Here are the values seen by fortran:

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,‘

write(*,*) ‚a=‘,a,‘

write(*,*) ‚Here is the file with line numbers added:

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,‘

99 continue
write(*,*) “
stop
end

Do tej pory wszystkie moje pola zostały numeryczny i f77 darmo Format czytać nie uważa 0d jako ważny separator pomiędzy pól numerycznych. Charakter czyta wymaga usuwania ostatni niepusty, jak to zawsze 0d.
Komentarze, sugestie i linki są bardzo mile widziane, proszę napisz do mnie na adres podany poniżej. Jestem szczególnie zainteresowany w jakim stopniu te techniki są przeglądarka, serwer lub specyficzne kompilator lub w inny sposób ograniczone. Ponadto, spodziewam się, że może być jakiś sposób, aby uniknąć linię końcową problemów, które nie jestem świadomy – jeśli wiesz, mam nadzieję, że poinformowanie mnie.

Słyszałem od Clive Page, że w jego systemie strony nie jest wysyłany do przeglądarki do programu Fortran kończy: Próbowałem wszystkie te rzeczy – zamknięcie wyjścia, płukanie go itp Próbowałem 3 kompilatory ( G95, gfortran i Nag) i wszystko można zamknąć standardowe wyjście o ile mogę powiedzieć. Jestem pewien, że wyjście CGI nie jest uznany za zakończony, dopóki wyjść procesowych. Więc nawet jeśli wysyłanie i może spodziewać strona do wykończenia, użytkownik widzi przeglądarkę pokazujący stan zajęty, w prawo, aż proces CGI (i wszelkich podprocesów) wreszcie wyjścia. To może być funkcją naszego serwera WWW (Apache). To nie było moje doświadczenie, ani żadnego z nas rozumie, co może być różnica w systemach.

Innym korespondent informuje, że jego kompilator przeczytać oświadczenie Intel jest w stanie odczytać standardowe wejście z serwera Microsoft. Jednak funkcja getc ma dla niego pracować.

Ostatnio pracuję z tym i znaleźć linii typu zawartości nie pokazując nazwę pola. Nie wiem, dlaczego tak jest. Również zauważyłem, że niesprawdzone pola wyboru nie pojawi się w ogóle wejścia standardowego – co pola wyboru bezużyteczny. Radioboxes wykonać pracę.

Wersja online echo.for dostępna jest http://www.nber.org/sys-admin/fortran-cgi/echo.cgi (nie gorącej link), gdzie można go używać do celów testowych. Wystarczy zmienić href na swojej stronie internetowej, aby wskazać na tej stronie, a nasz serwer i będzie echo z powrotem do Ciebie, co przeglądarka wysyła go. Coś jak odwyrtkę „pokaż źródło“.

Daniel Feenberg
National Bureau of Economic Research
617-588-0343
Feenberg ISAT NBER dotte org

Comments are closed.