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.