2022年11月23日 星期三

20 幾行的 http 伺服器(node js)

// http.js
const http = require('http');
const fs   = require('fs');
const objHtml = {'Content-Type' : 'text/html;charset=utf-8'};
const uService = (req, reply) => {
    const filename = (req.url == '/') ? './index.html' : `.${req.url}`;
    if (! fs.existsSync(filename)) {// console.log(filename);
        reply.writeHead(404, objHtml);
        reply.write('<!DOCTYPE html><html><body>Not Found<body></html>');
        reply.end();
        return;
    }
    const mimeType = filename.endsWith('.html') ? objHtml :
          filename.endsWith('.css') ? {'Content-Type' : 'text/css'} :
          filename.endsWith('.js')  ? {'Content-Type' : 'application/javascript'} :
          {'Content-Type' : 'application/octet-stream'};
    reply.writeHead(200, mimeType);
    fs.createReadStream(filename).pipe(reply);
}
const port = 8080;
console.log(`http://0.0.0.0:${port}/`);
http.createServer(uService).listen(port);
使用 nodejs 來跑:  node  http.js, 並用瀏覽器瀏覽網址  http://127.0.0.1:8080/index.html
改用 dart 語言來寫:
// http.dart
import 'dart:io';
final objHtml = ContentType('text', 'html', charset: 'UTF-8');
final uService = (HttpRequest req) {
    final reply = req.response;
    final filename = (req.uri.path == '/') ? './index.html' : '.${req.uri.path}';
    final file = File(filename);
    if (! file.existsSync()) {
        reply .. statusCode = 404 ..
            headers.contentType = objHtml ..
            write('<!DOCTYPE html><html><body>Not Found<body></html>') ..
            close();
        return;
    }
    reply .. statusCode = 200 ..
        headers.contentType = RegExp(r'(\.htm|\.html)$').hasMatch(filename) ? objHtml :
            RegExp(r'\.css$').hasMatch(filename) ? ContentType('text', 'css') :
            RegExp(r'\.js$').hasMatch(filename) ? ContentType('application', 'javascript') :
            ContentType('application', 'octet-stream') ..
        headers.contentLength = file.lengthSync();
    file.openRead().pipe(reply);
};
main() {
    final port = 8080;
    print("http://0.0.0.0:${port}/");
    HttpServer.bind(InternetAddress.anyIPv4, port).then((http)=>http.listen(uService));
}
使用 dart 來跑:  dart  http.dart, 並用瀏覽器瀏覽網址  http://127.0.0.1:8080/index.html

沒有留言:

張貼留言

使用 pcie 轉接器連接 nvme SSD

之前 AM4 主機板使用 pcie ssd, 但主機板故障了沒辦法上網, 只好翻出以前買的 FM2 舊主機板, 想辦法讓老主機復活, 但舊主機板沒有 nvme 的界面, 因此上網買了 pcie 轉接器用來連接 nvme ssd, 遺憾的是 grub2 bootloader 無法識...