A collection of HTTP middlewares.
package main
import (
"compress/gzip"
"fmt"
"log"
"net/http"
"os"
"github.com/clevergo/clevergo"
"github.com/clevergo/middleware"
"github.com/gorilla/handlers"
)
var users = map[string]string{
"foo": "bar",
}
var basicAuthValidate = func(username, password string) bool {
if passwd, exists := users[username]; exists && passwd == password {
return true
}
return false
}
var basicAuthErrorHandler http.Handler = http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
http.Error(w, "invalid credential", http.StatusUnauthorized)
})
func main() {
app := clevergo.New(":1234")
app.Use(
handlers.RecoveryHandler(),
middleware.Compress(gzip.DefaultCompression),
middleware.Logging(os.Stdout),
)
app.Get("/", func(w http.ResponseWriter, r *http.Request) {
fmt.Fprint(w, "hello world")
})
// basic auth
basicAuth := middleware.BasicAuth(
basicAuthValidate,
middleware.BasicAuthRealm("Restricted"), // optional.
middleware.BasicAuthErrorHandler(basicAuthErrorHandler), // optional.
)
auth := app.Group("/auth", clevergo.RouteGroupMiddleware(basicAuth))
auth.Get("/", func(w http.ResponseWriter, r *http.Request) {
user := middleware.GetBasicAuthUser(r)
fmt.Fprintf(w, "hello %s", user)
})
log.Fatal(app.ListenAndServe())
}
$ curl -v http://localhost:1234/auth/
...
< HTTP/1.1 401 Unauthorized
< Www-Authenticate: Basic realm="Restricted"
invalid credential
$ curl -v -u foo:bar http://localhost:1234/auth/
...
> Authorization: Basic Zm9vOmJhcg==
...
< Www-Authenticate: Basic realm="Restricted"
hello foo