JEWeell Home | About Project

Інтерфейс Fortran-77 CGI

Ми хочемо передати вхідні параметри і завантажити файл з веб-браузером для програми f77 Fortran на веб-сервер Apache, але не змогли знайти багато корисної інформації про це. Наша мета полягає у використанні немає бібліотек, не Perl, і нічого, крім стандартного f77 так само, як це відбувається з FreeBSD. Існують деякі обмеження у зв'язку з відсутністю спільності f77 I / O, але це не робити те, що нам потрібно досить прямо і лише в декількох рядках коду. Передача параметрів Ось приклад сторінки просять два значення, передаючи їх у програму Fortran, який записує HTML відповідь: <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> "POST" метод передачі параметрів обраний тому, що він передає дані в виконуваний файл через стандартний ввід. В якості альтернативи "GET" метод використовує змінні оточення, які не доступні зі стандартного Fortran-77. Текст передається test1.cgi в рішучий Fortran недружню рядки, такі як: &val1=abcd&val2=1234 Це не легко розібрати на Фортрані, так як колонки місць значень буде дрейфувати через рядок у відповідності з довжиною імен і значень - але так як ви контролюєте довжину імен змінних на HTML сторінці, ви можете управляти колонки розташування даних у спеціальному випадку, коли змінна зміст фіксованої довжини, яка в разі вибору, прапорці та перемикачі. У тих випадках, просте читання фіксованого формату можна витягти змінних даних. У моєму прикладі ви повинні ввести 4-х символів в кожному вікні, щоб отримати правильний результат, але я не пропоную це в якості загального рішення. Це буде описано пізніше. Ось test1.for, яка передбачає спільне користувачів. 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 Він повинен бути складений: f77 test1.for -o test1.cgi в test1.cgi (CGI тип файлу потрібно Apache.), але не потрібно ніяких спеціальних бібліотек: Ви не можете використовувати вільний формат пише для Content-Type, тому що повинна починатися в колонці 1. Подвійний слеш не потрібно, в іншому випадку ви отримаєте тільки помилка сервера ("Передчасний кінець заголовків" в журналі), а ви, якщо ви не вкажете заголовок на всіх. Незручно, повідомлення про помилки піти в error_log. Оскільки ми використовували текстові поля, наприклад, програма досить спеціалізується! Я "буду обговорювати кращий спосіб для передачі змінної довжини жала нижче Існує можливість того, що браузер буде представляти значення в іншому порядку -. Є опція" TabIndex ", щоб запобігти цьому, але я не потребував в ньому ще з останніх версіях Safari, MSIE і Firefox, браузери тільки я випробував. Завантаження файлів Ми також повинні дозволити користувачам завантажувати текстовий файл. Файли передаються як MIME вкладень в стандартний ввід, але все ще досить просто. Ось HTML для прикладу: <html> <Form method="POST" action="./test2.cgi" ENCTYPE="multipart/form-data"> <input name="userfile" type="file" value=""><br> <Input Type="submit" value=" Submit"> </html> Браузер надає файл на сервер в якості MIME вкладень. Ось код Fortran для прикладу, він копіює заголовки і файл назад в браузер для відображення. 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 Я підготував тестовий файл для завантаження, що складається з трьох ліній "Лінія 1", "Лінія 2", і "лінія 3". Ось результат, що повертається, підготовлений браузер для CGI програми: 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-- Перший рядок встановлює рядок файлу сепаратор, потім кілька рядків заголовка descrbe те, що передається, то порожній рядок, щоб сигналізувати кінець заголовків, то сам файл, а потім файл сепаратор знову (плюс ще 2 тире). 72 буфера введення символів не було досить довго, щоб провести 2-й рядку заголовка з ім'ям файлу, так що був усічений і читання поновилися після рядка. Існує nusisance проблема тут, що не є очевидним запуск програми випробувань вище. Браузер посилає файл з кінця рядка CRLF конвенції або (шестигранну) 0d0a, а наш сервер Unix, в яких використовується один символ (0A). f77 не відкидає 0d при читанні, так що кожен рядок буде закінчуватися 0d. Читання нульову лінію в символьної змінної дає вам право 0d заповнюються пробілами. На практиці я виявив, що фрагмент коду: 5 read(*,*) a if(a(1:1).ge.'!') goto 5 буде пропускати без порожніх рядків, тому що ASCII вибуху більше, ніж будь-які прогалини і менше, ніж будь-який інший друкований символ. Зі стандартним f77 це не буде можливо читати бінарні файли - це не турбувало нас на даний момент. Я відчув це на нашій FreeBSD системи з MSIE і Firefox, с F77 і G95. Корреспондент зазначає, що gfortran буде душити, коли їх просять читати "а" Формат елемента, який тягнеться за межі кінця рядка. Замість того щоб копіювати наявні символи до кінця рядка вона продовжує читати на наступному рядку. Це зробило б, що компілятор не підходять для цієї мети. Змінні текстові поля довжини Ми повинні читати змінних полів параметрів довжини. Хитрість полягає в тому, щоб використовувати "multi-part/form-data" MIME-тип, для поділу тексту і числових полів на окремих лініях, а потім використовувати Fortran вільний формат прочитати на лінії передачі даних (пропуск заголовки). Цей тип форми дозволяє також для завантаження файлів. Наприклад: <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> За допомогою цього методу кожен параметр передається як окрема частина MIME для стандартного вводу, як файл для завантаження. Ось те, що передається в Fortran (з додається номер рядка): 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-- Ось fortran реагувати на цю веб-сторінку: 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 До цих пір всі мої поля були числовими, і f77 вільному форматі читав робить 0d відношенні як дійсний роздільник між числових полів. Персонаж читає зажадає видалення останньої непорожній, так як вона завжди буде 0d. Коментарі, пропозиції та посилання будемо дуже раді, будь ласка, напишіть мені за вказаною нижче адресою. Я особливо зацікавлений в якій мірі ці методи браузера, сервера або компілятора або іншим чином обмежена. Крім того, я очікую, що там може бути якийсь спосіб, щоб уникнути лінії закінчення проблеми, які я не в курсі - якщо ви знаєте, я сподіваюся, що ви повідомте мені. Я чув від Clive Page, що його система веб-сторінка не передається в браузер за програмою Fortran закінчується: Я пробував всі ці речі - закриття виробництва, промивка його, і т.д. Я спробував 3 компіляторів ( g95, gfortran, і Наг), і все може закрити стандартний висновок, наскільки я можу судити. Я впевнений, що CGI виходу не оголошена завершеною, поки процес завершується. Таким чином, навіть якщо ви надішлете і слід було очікувати сторінка повинна бути завершена, користувач бачить браузер показує стан зайнятості, аж до CGI процес (і будь підпроцесів), нарешті, вийти. Це може бути функція нашого веб-сервер (Apache). Це не було моїм досвідом, і не може будь-який з нас розуміє, що різниця в системах могла б бути. Інший кореспондент повідомляє, що його компілятор Intel читання заява не може читати стандартний ввід з веб-сервера Microsoft. Тим не менш, функція ЕОКП працює для нього. Нещодавно я працював з цим і знайшов Content-Type лінія більше не показувати ім'я поля. Я не знаю, чому це так. Крім того, я помітив, що неконтрольована прапорці не відображаються в стандартному вводі взагалі - робити прапорці непридатним для використання. Radioboxes працюють. Онлайн-версії echo.for доступна на http://www.nber.org/sys-admin/fortran-cgi/echo.cgi (не гарячою посилання), де ви можете використовувати його для тестування. Просто змінити HREF в веб-сторінки, щоб вказати на цій сторінці та й нашого сервера буде виведена з вами все, що браузер посилає його. Ніби як зворотний "шоу джерела". Даніель Фінберга Національне бюро економічних досліджень 617-588-0343 Фінберга ISAT NBER dotte орг Переведено з http://www.nber.org/sys-admin/fortran-cgi/ На головну
JEWeell

Technical support by @ReuN