Gorilla Mux Regex для URL не соответствует полному URL - PullRequest
2 голосов
/ 22 февраля 2020

Какое регулярное выражение я должен использовать, чтобы соответствовать следующему URL как full_path?

https://edition.cnn.com/search \? Q \ = test \ & size \ = 10 \ & category \ = нас, политика, мир, мнение, здоровье

(?:www.|http\:\/\/|https\:\/\/).*} не работает, он соответствует только www. и выше до поиска

    sm := mux.NewRouter()
    sm.HandleFunc("/", getIndex).Methods("GET")
    sm.HandleFunc(`/api/v1/hostname/{full_path:(?:www.|http\:\/\/|https\:\/\/).*}`, URLHandler)

Обновление обработчика:

func URLHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    url := vars["full_path"]

    fmt.Fprintf(w, "Full path is: ", url)
}

EDIT2:

This у меня сработало

sm := mux.NewRouter().SkipClean(true).UseEncodedPath()
sm.HandleFunc("/", getIndex).Methods("GET")
sm.HandleFunc(`/api/v1/hostname/{full_path:.+`, URLHandler)

и на обработчике я использовал url.PathUnescape(r.URL.RequestURI()) и xurls для извлечения url

func URLHandler(w http.ResponseWriter, r *http.Request) {
    URL, _ := url.PathUnescape(r.URL.RequestURI())
    ext := xurls.Strict().FindAllString(URL, -1)
    fmt.Fprintf(w, "Full path is: ", ext)
}

1 Ответ

2 голосов
/ 22 февраля 2020

Я думаю, что Gorilla Mux будет использовать только часть пути, а не строку запроса URL. Попробуйте добавить RawQuery.

Примерно так:

func URLHandler(w http.ResponseWriter, r *http.Request) {
    vars := mux.Vars(r)
    url := vars["full_path"] + "?" 
    if r.URL.RawQuery != "" {
        url += "?" + r.URL.RawQuery
    }
    fmt.Fprintf(w, "Full url is: ", url)
}
...