Как использовать Gorilla Mux для сопоставления всего пути с регулярным выражением

Я хотел бы иметь возможность использовать регулярное выражение для сопоставления всего пути, а не только его части.

Например:

/users.*

будет соответствовать

/users
/users/bob
/users/bob/repos

В настоящее время с Mux HandleFunc вам нужно будет сопоставить несколько путей

/users
/users/{.*}
/users/{.*}/{.*}
...

person jlonganecker    schedule 28.09.2016    source источник


Ответы (1)


В итоге я написал свою собственную функцию сопоставления и использовал пакет регулярных выражений go. Это было очень легко сделать, и вот пример:

import (
  ...
    "net/http"
    "net/url"
    "regexp"
    "github.com/gorilla/mux"
  ...
)

...

muxRouter := mux.NewRouter()

muxRouter.
  Methods("GET", "POST").
  Schemes("https").
  MatcherFunc(func(r *http.Request, rm *mux.RouteMatch) bool {
    match, _ := regexp.MatchString("/users.*", r.URL.Path)
    // TODO handle error from regex
    return match
  }).
  HandlerFunc(m.ServeHTTP)

Ключ к использованию:
HandlerFunc(f func(http.ResponseWriter, *http.Request))

а не:
HandleFunc(path string, f func(http.ResponseWriter, *http.Request)).

HandlerFunc должен прийти после ваших совпадений. Это позволит вам написать свою собственную функцию сопоставления.

Производительность
В моем случае это работает хорошо, но если вам нужна более высокая производительность, вы можете попробовать использовать предварительно скомпилированный r, _ := regexp.Compile("p([a-z]+)ch").

Возможно, вам потребуется использовать структуру с f func(http.ResponseWriter, *http.Request), в которой уже есть шаблон регулярного выражения перед компиляцией, сохраненный в структуре.

Примеры регулярных выражений Go:
https://gobyexample.com/regular-expressions

Иди в город! Надеюсь, вы сочтете это полезным.

person jlonganecker    schedule 28.09.2016
comment
Существует множество HTTP-маршрутизаторов, которые более безопасны и эффективны. Вы можете найти небольшой список в разделе awesome-go.com/#middlewares. Проблема с вашей реализацией: возможность отображать произвольные файлы (/users/../../../../etc/passwd) - person T. Claverie; 28.09.2016
comment
Спасибо за ресурс, я проверю это. Для моего случая использования это внутренний инструмент, и он не обслуживает статические файлы, он просто сопоставляет входящий путь и вызывает предоставленный ResponseWriter. Вы можете пояснить, почему этот ответ небезопасен? Я также упомянул производительность в своем ответе. - person jlonganecker; 28.09.2016