紙芝居用の簡易 Web サーバを Go 言語で書く
3年ほど前に紙芝居(静的な HTML ファイルを表示するだけの簡単なお仕事)用の簡易 Web サーバを node.js で組んだのだが
今は Go 言語が書けるし,今回は Go 言語で組むことにした。 こんな感じ。
package main
import (
"flag"
"fmt"
"net/http"
"os"
)
func main() {
port := flag.Int("p", 3000, "port number")
host := flag.String("host", "", "hostname")
path := "./html"
flag.Parse()
if flag.NArg() > 0 {
path = flag.Arg(0)
}
addr := fmt.Sprintf("%s:%d", *host, *port)
if len(*host) == 0 {
fmt.Printf("Open http://localhost%s/\n", addr)
} else {
fmt.Printf("Open http://%s/\n", addr)
}
fmt.Println("Press ctrl+c to stop")
http.Handle("/", http.FileServer(http.Dir(path)))
if err := http.ListenAndServe(addr, nil); err != nil {
fmt.Fprintln(os.Stderr, err)
}
}
これを適当なファイル(たとえば mock-up.go
)に保存して
$ go build mock-up.go
とすればよい。 標準パッケージのみ使ってるので他所からパッケージを取ってくる必要はない。 めっさ簡単。 ブラボー!
起動するとカレントディレクトリ直下の html
フォルダ以下のファイルを表示できる。
$ mock-up
Open http://localhost:3000/
Press ctrl+c to stop
この状態で任意のブラウザから http://localhost:3000/
へアクセスすればよい。
停止する場合は Ctrl-C
押下でおk。
ポート番号を変える場合は -p
オプションでポート番号を指定する。
$ mock-up.exe -p 8080
Open http://localhost:8080/
Press ctrl+c to stop
バインドするホスト名を指定する場合は -host
オプションを使う。
$ mock-up.exe -p 8080 -host hostname
Open http://hostname:8080/
Press ctrl+c to stop
ルートフォルダを指定することも可能。
$ mock-up.exe -p 8080 -host hostname C:\path\to\htmlpub
Open http://hostname:8080/
Press ctrl+c to stop
存在しないフォルダを指定してもエラーにならず,アクセスしても 404 が返るだけ。 Directory traversal 脆弱性は問題ないと思う。 こっそり他人の PC に仕込んだりしないように(笑)
ブックマーク
参考図書
- プログラミング言語Go (ADDISON-WESLEY PROFESSIONAL COMPUTING SERIES)
- Alan A.A. Donovan (著), Brian W. Kernighan (著), 柴田 芳樹 (翻訳)
- 丸善出版 2016-06-20
- 単行本(ソフトカバー)
- 4621300253 (ASIN), 9784621300251 (EAN), 4621300253 (ISBN), 9784621300251 (ISBN)
- 評価
著者のひとりは(あの「バイブル」とも呼ばれる)通称 “K&R” の K のほうである。この本は Go 言語の教科書と言ってもいいだろう。
- Go言語によるWebアプリケーション開発
- Mat Ryer (著), 鵜飼 文敏 (監修), 牧野 聡 (翻訳)
- オライリージャパン 2016-01-22
- 大型本
- 4873117526 (ASIN), 9784873117522 (EAN), 4873117526 (ISBN)
- 評価
日本語監訳者による解説(付録 B)が意外に役に立つ感じ。 Web アプリケーションだけでなく,サーバサイドで動く CLI アプリへの言及もある。良書だが今となってはちょっと内容が古い。