Golang net/http 后端阻塞请求
Golang net/http Backend blocking requests
有没有办法 reject/block 在 go net/http “listenandserver” 中发出请求?
在我的例子中,我希望只允许带有用户代理“test 1.0”的请求。其他一切都将被阻止。
“我还想限制速率。例如:(如果每秒来自同一 IP 的请求在第二个块上超过 50 R/S 1 小时......)”我可以做到这一点,但正如我所说,我不知道如何阻止请求。
package main
import (
"net/http"
)
func handle(w http.ResponseWriter, r *http.Request) {
if r.UserAgent() == "test/1.0" {
//Allow
} else {
//Block request
}
}
func main() {
http.HandleFunc("/", handle)
http.ListenAndServe(":8080", nil)
}
有几个选项。第一个是 return 一个 error 响应:
func handle(w http.ResponseWriter, r *http.Request) {
if r.UserAgent() == "test/1.0" {
//Allow
} else {
http.Error(w, "forbidden", http.StatusForbidden)
return
}
}
第二种是hijack来自服务器的连接并粗鲁地关闭连接:
func handle(w http.ResponseWriter, r *http.Request) {
if r.UserAgent() == "test/1.0" {
//Allow
} else {
if h, ok := w.(http.Hijacker); ok {
c, _, err := h.Hijack()
if err != nil {
c.Close()
return
}
}
// fallback to error response
http.Error(w, "forbidden", http.StatusForbidden)
return
}
}
有没有办法 reject/block 在 go net/http “listenandserver” 中发出请求?
在我的例子中,我希望只允许带有用户代理“test 1.0”的请求。其他一切都将被阻止。
“我还想限制速率。例如:(如果每秒来自同一 IP 的请求在第二个块上超过 50 R/S 1 小时......)”我可以做到这一点,但正如我所说,我不知道如何阻止请求。
package main
import (
"net/http"
)
func handle(w http.ResponseWriter, r *http.Request) {
if r.UserAgent() == "test/1.0" {
//Allow
} else {
//Block request
}
}
func main() {
http.HandleFunc("/", handle)
http.ListenAndServe(":8080", nil)
}
有几个选项。第一个是 return 一个 error 响应:
func handle(w http.ResponseWriter, r *http.Request) {
if r.UserAgent() == "test/1.0" {
//Allow
} else {
http.Error(w, "forbidden", http.StatusForbidden)
return
}
}
第二种是hijack来自服务器的连接并粗鲁地关闭连接:
func handle(w http.ResponseWriter, r *http.Request) {
if r.UserAgent() == "test/1.0" {
//Allow
} else {
if h, ok := w.(http.Hijacker); ok {
c, _, err := h.Hijack()
if err != nil {
c.Close()
return
}
}
// fallback to error response
http.Error(w, "forbidden", http.StatusForbidden)
return
}
}