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

Posted

技术标签:

【中文标题】Gorilla mux,静态文件服务器的中间件【英文标题】:Gorilla mux, middleware for static fileserver 【发布时间】:2018-06-14 18:43:27 【问题描述】:

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

    /test /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)
    

【问题讨论】:

引用的代码似乎没有尝试将中间件应用于基本身份验证 - 您能显示您尝试使用的代码吗? 嗯,这正是我的问题:我不知道如何以使用中间件模式的方式重构静态处理程序。 与动态处理程序完全一样。 http.FileServer 返回一个http.Handler,它的工作方式与任何其他处理程序相同。 我要求提供不起作用的代码的原因是因为您的问题表明您尝试了一些不起作用的东西 - 看看什么不起作用,而不是没有尝试您的代码目标,更有助于解决问题。 我试过这个:r.HandleFunc("/static", middleWare(r.PathPrefix("/static/").Handler(staticHandler), basicAuth)) 但它抱怨 *mux.Route 不是 http.HandleFunc 的事实。那么如何转换/包装它呢?我真的不知道。 【参考方案1】:

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

【讨论】:

解决方案在哪里? 升级多路复用器版本后,我可以使用use()-function。这正是我所需要的。

以上是关于Gorilla mux,静态文件服务器的中间件的主要内容,如果未能解决你的问题,请参考以下文章

中间件中的 gorilla/mux 下一个处理程序是 nil

Gorilla mux 自定义中间件

使用 Gorilla MUX 和 Negroni 子路由中间件

Go:使用 gorilla mux 提供 CSS 文件

如何组织 gorilla mux 路线?

如何在 Gorilla mux 路由中获取 OR 模式