- *addr*: string 监听端口 例:`0.0.0.0:8081`
- *matchRule*: string 匹配规则,默认`prefix`。 `prefix`:当未匹配到时,返回最近的/匹配, `all`:当未匹配到时,返回404
-- reqIdLoop: int 请求id环大小,用于日志识别请求,默认`1000`
+- reqIdLoop: uint 请求id环大小,用于日志识别请求,默认`1000`
- *copyBlocks*: int 转发的块数量,默认`1000`
- *retryBlocks*: {} 重试, 当停用时,分配仅进行一次。当所有块都在使用中时,跳过。当请求没有`Content-Length`时,跳过。
- *size*: string 重试的块大小,默认`1M`
"errors"
"fmt"
"io"
+ "math"
"net"
"net/http"
"os"
routeMap sync.Map `json:"-"`
Routes []Route `json:"routes"`
- ReqIdLoop int `json:"reqIdLoop"`
- reqId atomic.Int64 `json:"-"`
+ ReqIdLoop int `json:"reqIdLoop"`
+ reqId atomic.Uint32 `json:"-"`
}
func (t *Config) Run(ctx context.Context, logger Logger) {
}
}
}
- if t.ReqIdLoop == 0 {
+ if t.ReqIdLoop <= 0 {
t.ReqIdLoop = 1000
+ } else if t.ReqIdLoop > math.MaxUint32 {
+ t.ReqIdLoop = math.MaxUint32
}
+
if t.BlocksI == nil {
if t.CopyBlocks == 0 {
t.CopyBlocks = 1000
t.routeP.Store(routePath, func(w http.ResponseWriter, r *http.Request) {
reqId := t.reqId.Add(1)
- if reqId >= int64(t.ReqIdLoop) {
+ if reqId >= uint32(t.ReqIdLoop) {
t.reqId.Store(0)
}
var e error = ErrAllBacksFail
type reqDealer interface {
- Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
+ Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
}
// repack
func init() {
type I interface {
- Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
+ Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
}
if e := component2.Register[I]("http", httpDealer{}); e != nil {
panic(e)
type httpDealer struct{}
-func (httpDealer) Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error {
+func (httpDealer) Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error {
var (
opT = time.Now()
resp *http.Response
func init() {
type I interface {
- Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
+ Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
}
if e := component2.Register[I]("local", localDealer{}); e != nil {
panic(e)
type localDealer struct{}
-func (localDealer) Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error {
+func (localDealer) Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error {
var (
opT = time.Now()
logFormat = "%v %v%v > %v local %v %v %v"
ErrCopy = errors.New("ErrCopy")
ErrReqReBodyFail = errors.New("ErrReqReBodyFail")
ErrReqReBodyOverflow = errors.New("ErrReqReBodyOverflow")
- ErrReqRetry = errors.New("ErrReqRetry")
+ ErrReqRetry = errors.New("ErrReqRetry")
ErrReqCreFail = errors.New("ErrReqCreFail")
ErrReqDoFail = errors.New("ErrReqDoFail")
ErrResDoFail = errors.New("ErrResDoFail")
func init() {
type I interface {
- Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
+ Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error
}
if e := component2.Register[I]("ws", wsDealer{}); e != nil {
panic(e)
type wsDealer struct{}
-func (wsDealer) Deal(ctx context.Context, reqId int64, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error {
+func (wsDealer) Deal(ctx context.Context, reqId uint32, w http.ResponseWriter, r *http.Request, routePath string, chosenBack *Back, logger Logger, blocksi pslice.BlocksI[byte]) error {
var (
opT = time.Now()
resp *http.Response