Go

Goのnet/http互換WEBサーバやミドルウェアのメモ

WEBサーバやミドルウェア

とあるソースコードを見ていて知らないものがあるので、どういったものかメモしていく

go-chi/chi

go-chi/chi

webサーバでルーティング機能がある。デフォルトの net/http互換。

lightweight, idiomatic and composable router for building Go HTTP services

  • 外部ライブラリ依存なし
  • 軽量、速い

unrolled/secure

unrolled/secure

HTTP middleware for Go that facilitates some quick security wins.

net/http のHandlerに被せる形で利用できるミドルウェア

アクセス元ホストの制限やプロキシヘッダ、SSLの制限などをミドルウェアで行うことができる。

rs/cors

Go net/http configurable handler to handle CORS requests

CORSを利用したリクエストを制御するライブラリ 許可するメソッドやヘッダなどを定義して利用する。net/httpのHandlerとして登録可能。

上記3つを組み合わせてサーバとして動かす

package main

import (
    "github.com/go-chi/chi"
    "github.com/rs/cors"
    "github.com/unrolled/secure"
    "net/http"
    "fmt"
)

func main() {
    r := chi.NewRouter()
    // Handlers which are set with Use will proceed requests before processing of Handler functions are sets HandleFunc, Handle, Route.
    // In short, these are middlewares.
    r.Use(newCors().Handler)
    r.Use(newSecure().Handler)

    r.HandleFunc("/test", test_handle)
    r.Route("/route", func(r chi.Router) {
        r.Get("/test", test_route)
    })
    http.ListenAndServe(":8080", r)
}

func test_handle(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello from test_handle.")
    return
}

func test_route(w http.ResponseWriter, r *http.Request) {
    fmt.Fprint(w, "Hello from test_route.")
    return
}

func newCors() *cors.Cors {
    return cors.New(cors.Options{
            AllowCredentials: true,
            // ... And more options you want
    })
}

func newSecure() *secure.Secure {
    return secure.New(secure.Options{
            BrowserXssFilter: true,
            // ... And more options you want
    })
}