LINUX.ORG.RU

Минималистичная библиотека для http-сервера

 ,


1

2

Привет, ЛОР.
Возникла потребность в минималистичной библиотечке, с которой можно удобно разворачивать мини-веб-сервисы «на ходу», беглым поиском найдено не было.

Поэтому был наваян следущий говнокод: httрs://pastebin.com/CRFz3n2a https://pastebin.com/WN0Adqyc

Конечно же, в качестве недоязычка был выбран горячо любимый Lua (5.2+ либо luajit)
Из зависимостей — только cqueues.

apt install luajit lua-cqueues

Я понимаю, что ЛОР это не говнокод.ру и не моя личная армия, но надеюсь на приход царя то, что адекватные ЛОРовцы, которые поумнее меня, укажут на явные ошибки и косяки, прежде чем я выложу это поделие версии 0.01 в опенсорс.

пример использования:

local server = require 'http-server'

server:router{ 
    {
        ['/'] = function(req)
            return 'it works.' 
        end
    }, 

    {
        'GET',  ['/hello'] = function(req) 
            return 'hello, elon musk.' 
         end
    },  

    {
        'POST', ['/post']  = function(req) 
            return 'oh, you posted ' .. (req.body or '') 
         end
    },
}

server:listen{host='0.0.0.0', port=8000}
server:start()


тестирование производительности (10000 клиентов, loader.io): https://imgur.com/vjxZMBl.png (потребление памяти ~7MB)

★★★★☆

Последнее исправление: annerleen (всего исправлений: 8)

Когда вы закончите постить картинки на имгур, который не дает смотреть по прямым ссылкам?

deep-purple ★★★★★
()

https://docs.mojolicious.org/Mojolicious/Lite

use Mojolicious::Lite -signatures;

get '/' => sub($c) {
  $c->render(text => 'it works');
};

get '/hello' => sub($c) {
  $c->render(text => 'Hello elon musk');
};

post '/post' => sub($c) {
  $c->render(text => 'oh, you posted ' . ($c->params || '' ));
}

app->start;

Хост и порт удобнее при запуске через аргументы командной строки задать.

MOPKOBKA ★★★
()
Последнее исправление: MOPKOBKA (всего исправлений: 1)
Ответ на: комментарий от Harald

абсолютно ничем, более того — подразумевается, что при более-менее серьёзной нагрузке оно будет сидеть за nginx'ом

annerleen ★★★★☆
() автор топика
if key and value then request.headers[key:lower()] = value end -- append header to headers table

тут зальешь, как минимум, куки.

drsm ★★
()
Ответ на: комментарий от SZT

увы, не обеспечивает даже 10% производительности решения из ОП

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от ox55ff

nodejs это, конечно, замечательно, если бы не хтонический ужос под названием npm с одной стороны, и постоянно ломающаяся обратная совместимость с другой (хотя, может проекты такие попадались)

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от menangen

ВНЕЗАПНО

но самый дельный комментарий.
симпатизирую этому проекту, тыкался в него, годнота.

однако, ребята явно перемудрили с установкой и системой пакетов/модулей.
то есть, это не просто lua'шный модуль, это целая экосистема, которая имеет мало чего общего с lua, кроме синтаксиса.

форкнуть и допилить (и даже запилить с нуля, используя их lua-uv) пробовал, однако, либо ниасилил, либо там что-то не так внутри — при простейших нагрузочных тестах оно в рандомные моменты может сегфолтнуться.

annerleen ★★★★☆
() автор топика
Ответ на: комментарий от Jopich1

openresty хорошо (как и nginx+ngx_lua), но это уже тяжёлая артиллерия, а не простенький скриптец.

annerleen ★★★★☆
() автор топика

libevent с изкоробочным evhttp

liksys ★★★★
()

Выброси это говно, поставь python (через pyenv/asdf-vm), потом поставь poetry, затем:

 cd /tmp                

/tmp
❯ poetry new -n dummy                       
Created package dummy in dummy

/tmp
❯ cd dummy

/tmp/dummy
❯ poetry add flask
Creating virtualenv dummy-JoHse5mx-py3.9 in /home/sergey/.cache/pypoetry/virtualenvs
Using version ^1.1.2 for flask

Updating dependencies
Resolving dependencies... (1.6s)

Writing lock file


Package operations: 14 installs, 0 updates, 0 removals

  - Installing markupsafe (1.1.1)
  - Installing pyparsing (2.4.7)
  - Installing attrs (20.3.0)
  - Installing click (7.1.2)
  - Installing itsdangerous (1.1.0)
  - Installing jinja2 (2.11.3)
  - Installing more-itertools (8.6.0)
  - Installing packaging (20.9)
  - Installing pluggy (0.13.1)
  - Installing py (1.10.0)
  - Installing wcwidth (0.2.5)
  - Installing werkzeug (1.0.1)
  - Installing flask (1.1.2)
  - Installing pytest (5.4.3)

/tmp/dummy 13s

❯ ll                        
total 20K
drwxr-xr-x 2 sergey users  60 Feb  3 01:23 dummy
-rw-r--r-- 1 sergey users 14K Feb  3 01:23 poetry.lock
-rw-r--r-- 1 sergey users 296 Feb  3 01:23 pyproject.toml
-rw-r--r-- 1 sergey users   0 Feb  3 01:23 README.rst
drwxr-xr-x 2 sergey users  80 Feb  3 01:23 tests

❯ vim dummy/__init__.py
from flask import Flask

__version__ = '0.1.0'


def create_app() -> Flask:
    app = Flask(__name__)

    @app.route('/')
    def greeting():
        return 'Hello World!'

    return app

❯ vim dummy/__main__.py                   
from . import create_app

if __name__ == '__main__':
    app = create_app()
    app.run()


❯ export FLASK_APP=dummy; poetry run flask run -h 0.0.0.0 -p 8001
 * Serving Flask app "dummy"
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://0.0.0.0:8001/ (Press CTRL+C to quit)
tz4678 ★★
()

Я примерно также на жс код и пишу. Делаю сначала конфиг с колбеками, а потом вокруг него приложение.

crutch_master ★★★★★
()
Ответ на: комментарий от annerleen

nodejs это, конечно, замечательно, если бы не хтонический ужос под названием npm с одной стороны

Тут проблема не в npm (пм, как пм), а в хипсторах, которые заполнили его дерьмом. Хайп сделали, но качество просрали. Недавно авторы moment сказали, что он всё, потому что он стал жирный и им сложна, юзайте ванильную Date. Если начинаешь проект не надо тащить из npm всё подряд, хотя, если проект не твой, то да, там все печально.

crutch_master ★★★★★
()
Ответ на: ВНЕЗАПНО от annerleen

либо там что-то не так внутри — при простейших нагрузочных тестах оно в рандомные моменты может сегфолтнуться.

Ну вот. А что ты против тогда имеешь npm? Тут все тоже самое, просто в npm это централизированно и поставлено на поток.

crutch_master ★★★★★
()
Ответ на: комментарий от anonymous

на питоне даже строчек кода меньше писать, идиот. я не говорю уже про отладку, которую проблематично делать для кода, написанного на lua. ни одна ide его нормально не поддерживает.

tz4678 ★★
()
Ответ на: комментарий от crutch_master

сейчас и питон превратится в парашу, в которую любят нырять петухи на самокатах благодаря говнокурсам от скиллбокса и безмозглым датассасаентистам

tz4678 ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.