Files
EdgeNode/internal/nodes/http_request_limit.go

43 lines
1.2 KiB
Go
Raw Normal View History

2024-05-17 18:30:33 +08:00
// Copyright 2021 GoEdge goedge.cdn@gmail.com. All rights reserved.
2021-12-12 11:48:01 +08:00
package nodes
import (
"net/http"
2024-07-27 15:42:50 +08:00
"github.com/TeaOSLab/EdgeNode/internal/iplibrary"
)
2021-12-12 11:48:01 +08:00
func (this *HTTPRequest) doRequestLimit() (shouldStop bool) {
// 是否在全局名单中
2023-03-31 21:37:15 +08:00
_, isInAllowedList, _ := iplibrary.AllowIP(this.RemoteAddr(), this.ReqServer.Id)
if isInAllowedList {
return false
}
2021-12-12 11:48:01 +08:00
// 检查请求Body尺寸
// TODO 处理分片提交的内容
if this.web.RequestLimit.MaxBodyBytes() > 0 &&
this.RawReq.ContentLength > this.web.RequestLimit.MaxBodyBytes() {
this.writeCode(http.StatusRequestEntityTooLarge, "", "")
2021-12-12 11:48:01 +08:00
return true
}
// 设置连接相关参数
if this.web.RequestLimit.MaxConns > 0 || this.web.RequestLimit.MaxConnsPerIP > 0 {
2022-07-05 20:37:00 +08:00
var requestConn = this.RawReq.Context().Value(HTTPConnContextKey)
2021-12-12 11:48:01 +08:00
if requestConn != nil {
clientConn, ok := requestConn.(ClientConnInterface)
if ok && !clientConn.IsBound() {
2022-01-01 20:15:39 +08:00
if !clientConn.Bind(this.ReqServer.Id, this.requestRemoteAddr(true), this.web.RequestLimit.MaxConns, this.web.RequestLimit.MaxConnsPerIP) {
this.writeCode(http.StatusTooManyRequests, "", "")
2022-01-01 20:15:39 +08:00
this.Close()
2021-12-12 11:48:01 +08:00
return true
}
}
}
}
return false
}