英文:
Overriding Go's default HTTP Sever redirect behaviour
问题
Go的默认HTTP服务器实现会合并HTTP请求中的斜杠,并返回一个HTTP重定向响应到“清理”后的路径:
https://code.google.com/p/go/source/browse/src/pkg/net/http/server.go#1420
所以,如果你发送一个HTTP请求 GET /http://foo.com/
,服务器会响应 301 Moved Permanently ... Location: /http:/foo.com/
。
我想禁用这种行为并自己处理所有路径。
我是一个Go的新手,似乎我可以创建自己的Server
实例并覆盖Handler
属性,但我不确定如何做到?
英文:
Go's default HTTP server implementation merges slashes in HTTP requests, returning an HTTP redirect response to the "cleaned" path:
https://code.google.com/p/go/source/browse/src/pkg/net/http/server.go#1420
So if you make a HTTP request GET /http://foo.com/
, the server responds with 301 Moved Permanently ... Location: /http:/foo.com/
.
I'd like to disable this behaviour and handle all paths myself.
I'm a Go newbie, and it seems as if I could create my own Server
instance and override the Handler
attribute, but I'm not sure how to?
答案1
得分: 10
我想禁用这个行为并自己处理所有路径。
我是一个Go的新手,似乎我可以创建自己的Server实例并覆盖Handler属性,但我不确定如何做?
而不是通过http.Handle或http.HandleFunc方法在http.DefaultServeMux中注册处理程序,只需调用:
http.ListenAndServe(":8080", MyHandler)
其中MyHandler是一个实现了http.Handler接口的类型的实例。
http.ListenAndServe实际上只是一个简写方法,它执行以下操作:
func ListenAndServe(addr string, handler http.Handler) error {
server := &http.Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
所以你也可以直接这样做。
在你的处理程序中,你可以按照你希望的方式解析/路由URI,像这样:
func (h *MyHandlerType) ServeHTTP(w http.ResponseWriter, r *http.Request) {
uri := r.URL.Path
// ...使用uri...
}
英文:
> I'd like to disable this behaviour and handle all paths myself.
>
> I'm a Go newbie, and it seems as if I could create my own Server instance and override the Handler attribute, but I'm not sure how to?
Instead of registering handlers with the http.DefaultServeMux
through the http.Handle
or http.HandleFunc
methods just call:
http.ListenAndServe(":8080", MyHandler)
where MyHandler
is an instance of a type that implements the http.Handler
interface.
http.ListenAndServe
in turn is just a short-hand method that does the following:
func ListenAndServe(addr string, handler http.Handler) error {
server := &http.Server{Addr: addr, Handler: handler}
return server.ListenAndServe()
}
so you could do that directly instead as well.
Inside your handler you can then parse/route the URI however you wish like this:
func (h *MyHandlerType) ServeHTTP(w http.ResponseWriter, r *http.Request) {
uri := r.URL.Path
// ...use uri...
}
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论