qdy пре 1 месец
родитељ
комит
05666bbcca
7 измењених фајлова са 59 додато и 20 уклоњено
  1. BIN
      .DS_Store
  2. 0
    0
      ctx/request_context.go
  3. 4
    3
      go.mod
  4. 10
    10
      go.sum
  5. 2
    2
      logger/runtime_logger.go
  6. 0
    0
      test/test.go
  7. 43
    5
      webx/router/router_service.go

ctx/RequestContext.go → ctx/request_context.go Прегледај датотеку


+ 4
- 3
go.mod Прегледај датотеку

35
 	go.opentelemetry.io/otel/metric v1.28.0 // indirect
35
 	go.opentelemetry.io/otel/metric v1.28.0 // indirect
36
 	go.opentelemetry.io/otel/trace v1.28.0 // indirect
36
 	go.opentelemetry.io/otel/trace v1.28.0 // indirect
37
 	go.uber.org/multierr v1.10.0 // indirect
37
 	go.uber.org/multierr v1.10.0 // indirect
38
+	golang.org/x/mod v0.32.0 // indirect
38
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
39
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
39
 )
40
 )
40
 
41
 
45
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
46
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
46
 	github.com/pkg/errors v0.9.1 // indirect
47
 	github.com/pkg/errors v0.9.1 // indirect
47
 	go.uber.org/zap v1.27.1
48
 	go.uber.org/zap v1.27.1
48
-	golang.org/x/net v0.47.0 // indirect
49
-	golang.org/x/sys v0.38.0 // indirect
50
-	golang.org/x/tools v0.39.0 // indirect
49
+	golang.org/x/net v0.48.0 // indirect
50
+	golang.org/x/sys v0.39.0 // indirect
51
+	golang.org/x/tools v0.40.0 // indirect
51
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
52
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
52
 )
53
 )

+ 10
- 10
go.sum Прегледај датотеку

139
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
139
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
140
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
140
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
141
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
141
 golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY=
142
-golang.org/x/mod v0.30.0 h1:fDEXFVZ/fmCKProc/yAXXUijritrDzahmwwefnjoPFk=
143
-golang.org/x/mod v0.30.0/go.mod h1:lAsf5O2EvJeSFMiBxXDki7sCgAxEUcZHXoXMKT4GJKc=
142
+golang.org/x/mod v0.32.0 h1:9F4d3PHLljb6x//jOyokMv3eX+YDeepZSEo3mFJy93c=
143
+golang.org/x/mod v0.32.0/go.mod h1:SgipZ/3h2Ci89DlEtEXWUk/HteuRin+HHhN+WbNhguU=
144
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
144
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
145
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
145
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
146
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
146
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
147
 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
147
 golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
148
-golang.org/x/net v0.47.0 h1:Mx+4dIFzqraBXUugkia1OOvlD6LemFo1ALMHjrXDOhY=
149
-golang.org/x/net v0.47.0/go.mod h1:/jNxtkgq5yWUGYkaZGqo27cfGZ1c5Nen03aYrrKpVRU=
148
+golang.org/x/net v0.48.0 h1:zyQRTTrjc33Lhh0fBgT/H3oZq9WuvRR5gPC70xpDiQU=
149
+golang.org/x/net v0.48.0/go.mod h1:+ndRgGjkh8FGtu1w1FGbEC31if4VrNVMuKTgcAAnQRY=
150
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
150
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
151
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
151
 golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
152
-golang.org/x/sync v0.18.0 h1:kr88TuHDroi+UVf+0hZnirlk8o8T+4MrK6mr60WkH/I=
153
-golang.org/x/sync v0.18.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
152
+golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
153
+golang.org/x/sync v0.19.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
154
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
154
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
155
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
155
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
156
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
156
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
163
 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
163
 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
164
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
164
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
165
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
165
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
166
-golang.org/x/sys v0.38.0 h1:3yZWxaJjBmCWXqhN1qh02AkOnCQ1poK6oF+a7xWL6Gc=
167
-golang.org/x/sys v0.38.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
166
+golang.org/x/sys v0.39.0 h1:CvCKL8MeisomCi6qNZ+wbb0DN9E5AATixKsvNtMoMFk=
167
+golang.org/x/sys v0.39.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
168
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
168
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
169
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
169
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
170
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
170
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
171
 golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
171
 golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
172
-golang.org/x/tools v0.39.0 h1:ik4ho21kwuQln40uelmciQPp9SipgNDdrafrYA4TmQQ=
173
-golang.org/x/tools v0.39.0/go.mod h1:JnefbkDPyD8UU2kI5fuf8ZX4/yUeh9W877ZeBONxUqQ=
172
+golang.org/x/tools v0.40.0 h1:yLkxfA+Qnul4cs9QA3KnlFu0lVmd8JJfoq+E41uSutA=
173
+golang.org/x/tools v0.40.0/go.mod h1:Ik/tzLRlbscWpqqMRjyWYDisX8bG13FrdXp3o4Sr9lc=
174
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
174
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
175
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
175
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
176
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
176
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

+ 2
- 2
logger/runtime_logger.go Прегледај датотеку

12
 	"git.x2erp.com/qdy/go-base/config"
12
 	"git.x2erp.com/qdy/go-base/config"
13
 	"git.x2erp.com/qdy/go-base/config/subconfigs"
13
 	"git.x2erp.com/qdy/go-base/config/subconfigs"
14
 	"git.x2erp.com/qdy/go-base/ctx"
14
 	"git.x2erp.com/qdy/go-base/ctx"
15
-	"git.x2erp.com/qdy/go-base/logger/http"
16
-
17
 	"go.uber.org/zap"
15
 	"go.uber.org/zap"
18
 	"go.uber.org/zap/zapcore"
16
 	"go.uber.org/zap/zapcore"
19
 	"gopkg.in/natefinch/lumberjack.v2"
17
 	"gopkg.in/natefinch/lumberjack.v2"
18
+
19
+	"git.x2erp.com/qdy/go-base/logger/http"
20
 )
20
 )
21
 
21
 
22
 type RunTimeLoggerFactory struct {
22
 type RunTimeLoggerFactory struct {

test.go → test/test.go Прегледај датотеку


+ 43
- 5
webx/router/router_service.go Прегледај датотеку

6
 	"reflect"
6
 	"reflect"
7
 	"strconv"
7
 	"strconv"
8
 	"strings"
8
 	"strings"
9
+	"sync"
9
 
10
 
10
 	"git.x2erp.com/qdy/go-base/ctx"
11
 	"git.x2erp.com/qdy/go-base/ctx"
11
 )
12
 )
12
 
13
 
13
 // WebService 路由服务
14
 // WebService 路由服务
14
 type RouterService struct {
15
 type RouterService struct {
15
-	router      *http.ServeMux
16
-	middlewares []func(http.Handler) http.Handler
16
+	router          *http.ServeMux
17
+	middlewares     []func(http.Handler) http.Handler
18
+	handlers        map[string]http.Handler // key: method + " " + path
19
+	registeredPaths map[string]bool         // 路径是否已注册通用处理器
20
+	mu              sync.RWMutex
17
 }
21
 }
18
 
22
 
19
 // NewWebService 创建WebService
23
 // NewWebService 创建WebService
20
 func NewWebService(router *http.ServeMux) *RouterService {
24
 func NewWebService(router *http.ServeMux) *RouterService {
21
 	ws := &RouterService{
25
 	ws := &RouterService{
22
-		router: router,
26
+		router:          router,
27
+		handlers:        make(map[string]http.Handler),
28
+		registeredPaths: make(map[string]bool),
23
 	}
29
 	}
24
 
30
 
25
 	return ws
31
 	return ws
102
 	return rb
108
 	return rb
103
 }
109
 }
104
 
110
 
111
+// registerPathIfNeeded 注册路径通用处理器(如果尚未注册)
112
+func (ws *RouterService) registerPathIfNeeded(path string) {
113
+	ws.mu.Lock()
114
+	defer ws.mu.Unlock()
115
+
116
+	if ws.registeredPaths[path] {
117
+		return
118
+	}
119
+
120
+	// 创建通用处理器,根据方法分发
121
+	genericHandler := http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
122
+		key := r.Method + " " + path
123
+		ws.mu.RLock()
124
+		handler, ok := ws.handlers[key]
125
+		ws.mu.RUnlock()
126
+		if !ok {
127
+			http.Error(w, "Method not allowed", http.StatusMethodNotAllowed)
128
+			return
129
+		}
130
+		handler.ServeHTTP(w, r)
131
+	})
132
+
133
+	ws.router.Handle(path, genericHandler)
134
+	ws.registeredPaths[path] = true
135
+}
136
+
105
 // Register 注册路由
137
 // Register 注册路由
106
 func (rb *RouteBuilder) Register() {
138
 func (rb *RouteBuilder) Register() {
107
 	// 创建适配器
139
 	// 创建适配器
126
 		handler = rb.ws.middlewares[i](handler)
158
 		handler = rb.ws.middlewares[i](handler)
127
 	}
159
 	}
128
 
160
 
129
-	// 注册到路由器
130
-	rb.ws.router.Handle(rb.path, handler)
161
+	// 存储处理器到映射
162
+	key := rb.method + " " + rb.path
163
+	rb.ws.mu.Lock()
164
+	rb.ws.handlers[key] = handler
165
+	rb.ws.mu.Unlock()
166
+
167
+	// 确保路径已注册通用处理器
168
+	rb.ws.registerPathIfNeeded(rb.path)
131
 }
169
 }
132
 
170
 
133
 // handlerAdapter 处理器适配器
171
 // handlerAdapter 处理器适配器

Loading…
Откажи
Сачувај