我正在使用https://github.com/elimity-com/scim,这给了我一个http。我使用app.Mount("/api/v1/scim", scimHandler)
装载的处理程序。请求路由到scim处理程序,但后面附加了一个/
,这会混淆处理程序。例如,如果我请求/api/v1/scim/Users
(一个列表请求(,处理程序就会看到/api/v1/scim/Users/
(一个没有id的按id获取的请求(。类似地,如果我请求/api/v1/scim/Users/${id}
,处理程序会看到/api/v1/scim/Users/${id}/
,并且无法正确解析到id。
我看到类似的斜杠附加到其他不使用Mount
的路径上,但Buffalo似乎可以处理这些路径的路由。我的/elb_health_check
路由以/elb_health_check/
的形式到达处理程序,但它仍然可以正确路由,健康检查也不在乎,因为它不检查路径。
是否有禁用此行为的选项?这是一个我应该作为问题报告的错误吗?
我对这个解决方法并不满意,但现在我添加了一个去掉尾部斜杠的包装器。
app.Mount("/api/v1/scim", stripTrailingSlash(scimHandler))
...
func stripTrailingSlash(h http.Handler) http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
path := r.URL.Path
path = strings.TrimSuffix(path, "/")
url, err := url.Parse(path)
if err != nil {
// Fall back to serving unmodified URL
h.ServeHTTP(w, r)
return
}
r.URL = url
h.ServeHTTP(w, r)
})
}