Преглед на файлове

多数据库测试通过

qdy преди 1 месец
родител
ревизия
05666bbcca
променени са 7 файла, в които са добавени 59 реда и са изтрити 20 реда
  1. Двоични данни
      .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

Двоични данни
.DS_Store Целия файл


ctx/RequestContext.go → ctx/request_context.go Целия файл


+ 4
- 3
go.mod Целия файл

@@ -35,6 +35,7 @@ require (
35 35
 	go.opentelemetry.io/otel/metric v1.28.0 // indirect
36 36
 	go.opentelemetry.io/otel/trace v1.28.0 // indirect
37 37
 	go.uber.org/multierr v1.10.0 // indirect
38
+	golang.org/x/mod v0.32.0 // indirect
38 39
 	gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect
39 40
 )
40 41
 
@@ -45,8 +46,8 @@ require (
45 46
 	github.com/mitchellh/go-homedir v1.1.0 // indirect
46 47
 	github.com/pkg/errors v0.9.1 // indirect
47 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 52
 	gopkg.in/natefinch/lumberjack.v2 v2.2.1
52 53
 )

+ 10
- 10
go.sum Целия файл

@@ -139,18 +139,18 @@ go.uber.org/zap v1.27.1/go.mod h1:GB2qFLM7cTU87MWRP2mPIjqfIDnGu+VIO4V/SdhGo2E=
139 139
 golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4=
140 140
 golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
141 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 144
 golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4=
145 145
 golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg=
146 146
 golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
147 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 150
 golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
151 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 154
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
155 155
 golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
156 156
 golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -163,14 +163,14 @@ golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7w
163 163
 golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
164 164
 golang.org/x/sys v0.0.0-20200223170610-d5e6a3e2c0ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
165 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 168
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
169 169
 golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk=
170 170
 golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
171 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 174
 golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=
175 175
 gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
176 176
 gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=

+ 2
- 2
logger/runtime_logger.go Целия файл

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

test.go → test/test.go Целия файл


+ 43
- 5
webx/router/router_service.go Целия файл

@@ -6,20 +6,26 @@ import (
6 6
 	"reflect"
7 7
 	"strconv"
8 8
 	"strings"
9
+	"sync"
9 10
 
10 11
 	"git.x2erp.com/qdy/go-base/ctx"
11 12
 )
12 13
 
13 14
 // WebService 路由服务
14 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 23
 // NewWebService 创建WebService
20 24
 func NewWebService(router *http.ServeMux) *RouterService {
21 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 31
 	return ws
@@ -102,6 +108,32 @@ func (rb *RouteBuilder) Desc(description string) *RouteBuilder {
102 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 137
 // Register 注册路由
106 138
 func (rb *RouteBuilder) Register() {
107 139
 	// 创建适配器
@@ -126,8 +158,14 @@ func (rb *RouteBuilder) Register() {
126 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 171
 // handlerAdapter 处理器适配器

Loading…
Отказ
Запис