[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が表示されるはずだ。
今回のポイントは・・・
結論。
やればやるほど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言語。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 | |
} |
コメント
コメントを投稿