gpt4 book ai didi

Gorilla mux,静态文件服务器的中间件

转载 作者:数据小太阳 更新时间:2023-10-29 03:22:39 28 4
gpt4 key购买 nike

请看下面我的代码。如您所见,这是一个具有两个端点的简单服务:

  1. /test <-- 使用中间件保护的基本身份验证
  2. /static <-- 提供 ./static 目录中的所有文件

现在我也在尝试将基本身份验证中间件模式添加到/static 端点​​,但出于某种原因我不知道如何做。我在将 *route(r.PathPrefix 的结果)转换为 middleware() 函数可以理解的内容时遇到问题。 (我还创建了一个 playground ,但由于外部导入,这将不起作用)

package main

import (
"encoding/base64"
"log"
"net/http"
"strings"

"github.com/gorilla/mux"
)

const (
username = "test"
password = "test"
)

func main() {
r := mux.NewRouter()

// add normal endpoint
r.HandleFunc("/test", middleWare(myHandler, basicAuth))

// add static
r.PathPrefix("/static/").Handler(http.StripPrefix("/static/", http.FileServer(http.Dir("./static"))))

srv := &http.Server{
Handler: r,
Addr: "0.0.0.0:8080",
}

log.Print("listening on 0.0.0.0:8080")
log.Fatal(srv.ListenAndServe())
}

func myHandler(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("yes!"))
return
}

func middleWare(h http.HandlerFunc, middleware ...func(http.HandlerFunc) http.HandlerFunc) http.HandlerFunc {
for _, m := range middleware {
h = m(h)
}

return h
}

func basicAuth(h http.HandlerFunc) http.HandlerFunc {
return func(w http.ResponseWriter, r *http.Request) {

w.Header().Set("WWW-Authenticate", `Basic realm="Restricted"`)

s := strings.SplitN(r.Header.Get("Authorization"), " ", 2)
if len(s) != 2 {
http.Error(w, "Not authorized", 401)
return
}

b, err := base64.StdEncoding.DecodeString(s[1])
if err != nil {
http.Error(w, err.Error(), 401)
return
}

pair := strings.SplitN(string(b), ":", 2)
if len(pair) != 2 {
http.Error(w, "Not authorized", 401)
return
}

if pair[0] != username || pair[1] != password {
http.Error(w, "Not authorized", 401)
return
}

h.ServeHTTP(w, r)
}
}

最佳答案

好吧,结果我使用了一个古老版本的 mux,它缺少 use() 函数:)。

关于Gorilla mux,静态文件服务器的中间件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50863974/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com