HTTP/1.1-сервер «з нуля» поверх TCP — без фреймворків і без модулів http/https.
Сирі байти приймаються з сокета, request-line та заголовки розбираються вручну,
відповідь формується як валідний HTTP/1.1-текст. HTTPS-варіант робить те саме
поверх TLS і переюзає той самий обробник запиту.
- Node.js (LTS)
openssl(для генерації self-signed сертифіката)
Плейн HTTP-сервер (порт 3000):
node src/server.jsПеревірка:
curl -sv http://localhost:3000/ # HTTP/1.1 200 OK, Content-Type: text/plain
curl -s http://localhost:3000/headers -H "X-Demo: abc" # розпарсені заголовки
curl -s -o /dev/null -w "%{http_code}\n" http://localhost:3000/nope # 404HTTPS-сервер (порт 3443):
node src/https-server.jsПеревірка (-k — бо сертифікат самопідписаний):
curl -sk -o /dev/null -w "%{http_code}\n" https://localhost:3443/ # 200Файли cert.pem та key.pem не закомічені (див. .gitignore) — згенеруй їх локально:
openssl req -x509 -newkey rsa:2048 -nodes \
-keyout key.pem -out cert.pem \
-days 365 -subj "/CN=localhost"src/https-server.js читає ці два файли через fs під час старту.
Команда для перевірки TLS-рукостискання й ланцюжка сертифікатів:
openssl s_client -connect localhost:3443CONNECTED(00000003)
Can't use SSL_get_servername
depth=0 CN = localhost
verify error:num=18:self-signed certificate
verify return:1
depth=0 CN = localhost
verify return:1
---
Certificate chain
0 s:CN = localhost
i:CN = localhost
---
subject=CN = localhost
issuer=CN = localhost
---
SSL handshake has read 1359 bytes and written 373 bytes
Verification error: self-signed certificate
---
New, TLSv1.3, Cipher is TLS_AES_256_GCM_SHA384
Verify return code: 18 (self-signed certificate)
Пояснення. Рядок verify error:num=18:self-signed certificate означає код 18 —
сертифікат підписав сам себе, тобто у ланцюжку немає довіреного центру сертифікації (CA),
який би його засвідчив; для самопідписаного серта це очікувано, і саме тому curl
запускаємо з прапорцем -k (не перевіряти сертифікат).