[Go] static fileを返すだけのweb serverを作ってみた

静的なファイルを返すだけのSimpleなWeb Serverを、Go言語で作ってみた。

テスト用のHTMLとして、
c:/webroot/webフォルダにhoge.htmlを適当に作ってくれ。

go run webserver.go
で実行。

ブラウザを立ち上げて、下記のURLを表示してみてくれ!
http://localhost:8085/web/hoge.html

hoge.htmlが表示されるはずだ。

今回のポイントは・・・

  • http.HandleFuncってpathの最後に"/"つけると、ディレクトリ指定になるんだね
  • Goでファイルを読み込む方法
  • WriteでbufをSliceして渡すのがGoっぽくてイイネ!Javaだとlength指定が必要だもんね
  • defer、ちょっ、コレ、ラクちんだわ~。もうtry..finallyとかタイプしたくない。
  • ラベル付きbreakも地味にいいわ~。これがあってswitchが生きる。

結論。
やればやるほどGo言語。

package main
import (
"bufio"
"io"
"log"
"net/http"
"os"
)
func main() {
http.HandleFunc("/web/", staticFileHandler)
http.ListenAndServe(":8085", nil)
}
// staticファイルを転送するハンドラ
func staticFileHandler(w http.ResponseWriter, r *http.Request) {
fname := "c:/webroot" + r.RequestURI
file, ferr := os.OpenFile(fname, os.O_RDONLY, 0600)
defer file.Close()
if ferr != nil {
log.Println("not found file:" + fname)
w.WriteHeader(http.StatusNotFound)
return
}
reader := bufio.NewReader(file)
buf := make([]byte, 1024, 1024)
LOOP:
for {
n, err := reader.Read(buf)
switch {
case err == nil:
w.Write(buf[:n])
case err == io.EOF:
log.Println("static file=" + fname)
break LOOP
case err != nil:
log.Printf("file error occured. err=%s\n", err)
break LOOP
}
}
return
}
view raw webserver.go hosted with ❤ by GitHub

コメント

このブログの人気の投稿

Android・・・テキスト描画あれこれ, ascent(), descent()等

nginxでlocalhostとしてアクセスをサーバーに転送する方法

Android:stateに応じてTextの色を変更する・・・ColorStateList