Erlang і http сервер
Останнім часом я став досить активно займатися вивченням Erlang і в міру можливостей буду ділитися своїми відкриттями і в цій області. Зазвичай, коли мова заходить про HTTP сервері написаному на Erlang, згадують MochiWeb. або Yaws. Але в стандартних модулях Erlang вже є HTTP сервер як один із сервісів додатки Inets. Розглянемо докладніше як з ним працювати.
HTTP сервер можна запускати різними способами, але тут я розгляну, на мій погляд, найбільш гнучкий. Нам знадобиться наступна структура:
В каталог log / записуватимуться лог файли. В каталозі www / зберігаються статичні файли, в даному випадку index.html:
test.config - це основний файл конфігурації для додатка Inets, через який ми будемо запускати HTTP сервер:
Тут httpd доданий як сервіс inets з конфігурацією в файлі httpd.conf:
Розглянемо коротко опції:
Файл конфігурації може бути також і в форматі схожому на конфігурацію Apache. але мені більше подобається формат Erlang. Додаткові опції конфігурації можна подивитися в документації httpd.
В опції erl_script_alias як доступних модулів була вказана тільки модуль scripts. Вихідний файл scripts.erl:
Функція test / 3 описує нашу тестову точку входу:
- SessionID - це ідентифікатор запиту, який використовується в наступних викликах mod_esi: deliver / 2. Рекомендується не робити ніяких припущень про тип ідентифікатора, але, по секрету, в поточній реалізації - це pid процесу.
- Env - список змінних середовища у вигляді [].
- Input - дані POST запиту. В даному випадку ми їх не використовуємо.
Функція mod_esi: deliver / 2 служить для посилки даних клієнта. Першим параметром повинен передаватися отриманий на вході ідентифікатор запиту і потім список рядків для передачі. Функція може викликатися кілька разів, але якщо потрібно передати заголовки, то вони повинні бути повернуті в першому виклику deliver, як в нашому прикладі.
У прикладі так само використовується допоміжна функція format / 1 для форматування змінних середовища.
Перед запуском нам потрібно відкомпілювати наш модуль:
І потім ми можемо запустити файл start наступного змісту:
Зупинити тестовий сервер можна стандартним Ctrl + C і a.