È stato presentato il rilascio del progetto Redbean 2.0, che offre un web server in grado di fornire applicazioni web sotto forma di file eseguibile universale, che può essere eseguito su Linux, Windows, MacOS, FreeBSD, NetBSD e OpenBSD. Tutte le risorse associate all'applicazione web e al server sono compresse in un unico file eseguibile, compatibile con il formato degli archivi ZIP, consentendo l'utilizzo dell'utilità zip per aggiungere file aggiuntivi. La possibilità di eseguire un singolo file su diversi sistemi operativi e la sua riconoscibilità come archivio ZIP sono realizzate grazie alla manipolazione degli header dei file eseguibili e al binding con la libreria standard C multipiattaforma Cosmopolitan. Il codice del progetto è distribuito sotto licenza ISC.
L'idea del progetto è fornire un unico file eseguibile «redbean.com» con un server web integrato. Lo sviluppatore dell'applicazione web può utilizzare l'utilità zip per aggiungere in questo file file HTML e Lua, ottenendo un'applicazione web autosufficiente eseguibile su tutti i principali sistemi operativi e che non richiede l'avvio di un server web separato per funzionare.
Dopo aver avviato il file eseguibile appena ricevuto, per accedere all'applicazione web memorizzata nel file si utilizza un server web integrato. Per impostazione predefinita, il gestore è collegato a localhost, ma il server può essere utilizzato anche come un normale server web pubblico (ad esempio, questo server gestisce il sito del progetto). Il server web integrato supporta l'accesso tramite HTTPS e può essere eseguito utilizzando l'isolamento sandbox, che consente di controllare a quali interfacce di sistema viene effettuato l'accesso. Per gestire il funzionamento del server durante la sua esecuzione, è fornita un'interfaccia interattiva REPL (basata su Lua REPL e sulla libreria bestline, equivalente a GNU Readline), che consente di modificare lo stato del processo in modo interattivo.
Si afferma che il server web sia in grado di gestire oltre un milione di richieste al secondo su un comune PC, servendo contenuti compressi con il metodo gzip. L'alta prestazione è favorita dal fatto che zip e gzip utilizzano un formato comune, quindi i dati vengono restituiti senza la necessità di ripacchettizzare dalle aree già compresse nel file zip. Inoltre, poiché l'eseguibile è stato creato utilizzando il collegamento statico e ha una dimensione ridotta, la chiamata alla funzione fork non comporta praticamente costi aggiuntivi quando è in memoria.
Oltre a gestire contenuti web statici ed eseguire JavaScript nel browser, la logica delle applicazioni web può essere ampliata tramite script in linguaggio Lua, il framework web Fullmoon e il database SQLite. Tra le funzionalità aggiuntive si segnala il supporto per lo schema di hashing delle password argon2, la possibilità di determinare la regione IP tramite il database MaxMind e l'accesso alle API Unix della libreria Cosmopolitan. La dimensione dello stack di base, che include il server web, MbedTLS, Cosmopolitan, Lua e SQLite, è di soli 1.9 MB.
Un file eseguibile universale è formato unendo segmenti e intestazioni specifici per vari sistemi operativi (PE, ELF, MACHO, OPENBSD, ZIP) in un unico file. Per garantire l'esecuzione di un file eseguibile sia su Windows che su sistemi Unix, si utilizza un trucco che consiste nella codifica dei file Windows PE come shell script, sfruttando il fatto che il Thompson Shell non utilizza il marker per script «#!». Alla fine si crea un file eseguibile che combina diversi formati utilizzati in Linux, BSD, Windows e macOS. $ curl https://redbean.dev/redbean-demo-2.0.7.com >redbean.com $ chmod +x redbean.com $ zip redbean.com hello.html $ zip redbean.com hello.lua $ ./redbean.com -vv I2022-06-23T08:27:14+000767:redbean] (srvr) ascolta http://127.0.0.1:8080 >: in attesa di comandi… $ curl https://127.0.0.1:8080/hello.html hello $ printf 'GET /hello.lua\n\n' | nc 127.0.0.1 8080 hello
Fonte: opennet.ru
