這是 ymawky(發音:yuh maw kee),一個完全以 ARM64 組合語言手動編寫的網頁伺服器。
ymawky 是一個僅使用系統呼叫(syscall-only)、不依賴 libc(no libc)、採用每連線一個程序(fork-per-connection)的網頁伺服器,由人工手寫而成。
雖然它是為 macOS 開發的,但我已盡力使其盡可能具備可移植性——然而,你可能仍需要進行一些(希望是微小的)重大修改才能在 Linux/其他 Unix 系統上運行它。請參閱「實作筆記」(Implementation Notes)以了解更多細節。
需要 Xcode Command Line Tools。請使用 `xcode-select --install` 安裝。
ymawky 僅在 Apple Silicon (arm64) 上運行。
請確保 ymawky 可執行檔旁有一個 `www/` 目錄。這是 ymawky 搜尋檔案的根目錄。使用 `GET` 請求空檔名(`GET /`)時,它會搜尋 `www/index.html`,因此你可能需要確保也存在一個 `index.html`。
ymawky 會嘗試在用戶端請求發生錯誤時提供靜態錯誤頁面,例如 404。它會在 `err/(code).html` 中搜尋這些頁面,因此請確保 `err/` 與 `ymawky` 和 `www/` 同級存在。請參閱「設定」(Configuration)以修改預設檔案和文件根目錄。
可惜的是,雖然支援自訂連接埠,但目前不支援自訂位址。目前,ymawky 只能運行在 `127.0.0.1`。這僅僅是因為我尚未實作它——但如果你想將此視為一項安全功能,那麼我猜它可能是故意的。
要查看 ymawky 的實際運作,請執行 `./ymawky [port]` 來啟動它。然後打開你選擇的網頁瀏覽器(或使用 curl),訪問 `127.0.0.1:8080/` 或 `127.0.0.1:8080/pretty/index.html`。沉浸在組合語言的溫暖中。
ymawky 是一個靜態檔案網頁伺服器。它不支援伺服器端程式碼來即時生成內容,也不支援更進階的 URL 解析,例如 `/search?query=term`。不過,這並不意味著它沒有功能。
這是一個完全以 ARM64 組合語言手動編寫的網頁伺服器,作為一個有趣的專案。它可能存在許多我尚未意識到的漏洞。然而,我已盡力使其更安全。以下是 ymawky 所採取的一些安全預防措施。
ymawky 目前支援並能回應以下狀態碼:
自訂 HTML 頁面將與錯誤碼(400+)一同提供。這些 HTML 檔案位於 `err/(code).html`。你可以使用 `build_err_pages.sh` 為每個錯誤碼建立一個頁面,並隨意加入不同的文字。編輯 `build_err_pages.sh` 的原始碼來修改每頁的文字,並編輯 `err/template.html` 來修改基礎範本。在 `err/template.html` 中:
MIME 類型是透過分析檔案副檔名來偵測的。以下 MIME 類型是被辨識的。
你可以透過 `config.S` 檔案來設定 ymawky。選項在此處記錄。
ymawky 是為 macOS 編寫的(抱歉...)。此程式碼中有一些(嗯,不只幾個)特定於 macOS 的部分將無法移植。