Merge pull request 'move to micro v4' (#154) from v4 into master
Reviewed-on: #154
This commit was merged in pull request #154.
	This commit is contained in:
		
							
								
								
									
										2
									
								
								.github/workflows/autoapprove.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/autoapprove.yml
									
									
									
									
										vendored
									
									
								
							| @@ -13,7 +13,7 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|       - name: approve |       - name: approve | ||||||
|         uses: hmarr/auto-approve-action@v2 |         uses: hmarr/auto-approve-action@v3 | ||||||
|         if: github.actor == 'vtolstov' || github.actor == 'dependabot[bot]' |         if: github.actor == 'vtolstov' || github.actor == 'dependabot[bot]' | ||||||
|         id: approve |         id: approve | ||||||
|         with: |         with: | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/build.yml
									
									
									
									
										vendored
									
									
								
							| @@ -10,13 +10,13 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|     - name: setup |     - name: setup | ||||||
|       uses: actions/setup-go@v2 |       uses: actions/setup-go@v3 | ||||||
|       with: |       with: | ||||||
|         go-version: 1.16 |         go-version: 1.17 | ||||||
|     - name: checkout |     - name: checkout | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
|     - name: cache |     - name: cache | ||||||
|       uses: actions/cache@v2 |       uses: actions/cache@v3 | ||||||
|       with: |       with: | ||||||
|         path: ~/go/pkg/mod |         path: ~/go/pkg/mod | ||||||
|         key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} |         key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} | ||||||
| @@ -34,7 +34,7 @@ jobs: | |||||||
|       - name: checkout |       - name: checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v3 | ||||||
|       - name: lint |       - name: lint | ||||||
|         uses: golangci/golangci-lint-action@v3.1.0 |         uses: golangci/golangci-lint-action@v3.4.0 | ||||||
|         continue-on-error: true |         continue-on-error: true | ||||||
|         with: |         with: | ||||||
|           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. |           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										10
									
								
								.github/workflows/codeql-analysis.yml
									
									
									
									
										vendored
									
									
								
							| @@ -45,12 +45,12 @@ jobs: | |||||||
|     - name: checkout |     - name: checkout | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
|     - name: setup |     - name: setup | ||||||
|       uses: actions/setup-go@v2 |       uses: actions/setup-go@v3 | ||||||
|       with: |       with: | ||||||
|         go-version: 1.16 |         go-version: 1.17 | ||||||
|     # Initializes the CodeQL tools for scanning. |     # Initializes the CodeQL tools for scanning. | ||||||
|     - name: init |     - name: init | ||||||
|       uses: github/codeql-action/init@v1 |       uses: github/codeql-action/init@v2 | ||||||
|       with: |       with: | ||||||
|         languages: ${{ matrix.language }} |         languages: ${{ matrix.language }} | ||||||
|         # If you wish to specify custom queries, you can do so here or in a config file. |         # If you wish to specify custom queries, you can do so here or in a config file. | ||||||
| @@ -61,7 +61,7 @@ jobs: | |||||||
|     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java). |     # Autobuild attempts to build any compiled languages  (C/C++, C#, or Java). | ||||||
|     # If this step fails, then you should remove it and run the build manually (see below) |     # If this step fails, then you should remove it and run the build manually (see below) | ||||||
|     - name: autobuild |     - name: autobuild | ||||||
|       uses: github/codeql-action/autobuild@v1 |       uses: github/codeql-action/autobuild@v2 | ||||||
|  |  | ||||||
|     # ℹ️ Command-line programs to run using the OS shell. |     # ℹ️ Command-line programs to run using the OS shell. | ||||||
|     # 📚 https://git.io/JvXDl |     # 📚 https://git.io/JvXDl | ||||||
| @@ -75,4 +75,4 @@ jobs: | |||||||
|     #   make release |     #   make release | ||||||
|  |  | ||||||
|     - name: analyze |     - name: analyze | ||||||
|       uses: github/codeql-action/analyze@v1 |       uses: github/codeql-action/analyze@v2 | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								.github/workflows/dependabot-automerge.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								.github/workflows/dependabot-automerge.yml
									
									
									
									
										vendored
									
									
								
							| @@ -15,7 +15,7 @@ jobs: | |||||||
|     steps: |     steps: | ||||||
|       - name: metadata |       - name: metadata | ||||||
|         id: metadata |         id: metadata | ||||||
|         uses: dependabot/fetch-metadata@v1.3.0 |         uses: dependabot/fetch-metadata@v1.3.6 | ||||||
|         with: |         with: | ||||||
|           github-token: "${{ secrets.TOKEN }}" |           github-token: "${{ secrets.TOKEN }}" | ||||||
|       - name: merge |       - name: merge | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								.github/workflows/pr.yml
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										8
									
								
								.github/workflows/pr.yml
									
									
									
									
										vendored
									
									
								
							| @@ -10,13 +10,13 @@ jobs: | |||||||
|     runs-on: ubuntu-latest |     runs-on: ubuntu-latest | ||||||
|     steps: |     steps: | ||||||
|     - name: setup |     - name: setup | ||||||
|       uses: actions/setup-go@v2 |       uses: actions/setup-go@v3 | ||||||
|       with: |       with: | ||||||
|         go-version: 1.16 |         go-version: 1.17 | ||||||
|     - name: checkout |     - name: checkout | ||||||
|       uses: actions/checkout@v3 |       uses: actions/checkout@v3 | ||||||
|     - name: cache |     - name: cache | ||||||
|       uses: actions/cache@v2 |       uses: actions/cache@v3 | ||||||
|       with: |       with: | ||||||
|         path: ~/go/pkg/mod |         path: ~/go/pkg/mod | ||||||
|         key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} |         key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} | ||||||
| @@ -34,7 +34,7 @@ jobs: | |||||||
|       - name: checkout |       - name: checkout | ||||||
|         uses: actions/checkout@v3 |         uses: actions/checkout@v3 | ||||||
|       - name: lint |       - name: lint | ||||||
|         uses: golangci/golangci-lint-action@v3.1.0 |         uses: golangci/golangci-lint-action@v3.4.0 | ||||||
|         continue-on-error: true |         continue-on-error: true | ||||||
|         with: |         with: | ||||||
|           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. |           # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. | ||||||
|   | |||||||
							
								
								
									
										10
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										10
									
								
								README.md
									
									
									
									
									
								
							| @@ -9,8 +9,8 @@ to create a HTTP Server that could potentially be used for REST based API servic | |||||||
| import ( | import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
| 	"github.com/unistack-org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| 	httpServer "github.com/unistack-org/micro-server-http" | 	httpServer "go.unistack.org/micro-server-http/v4" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
| @@ -37,9 +37,9 @@ Or as part of a service | |||||||
| import ( | import ( | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
| 	"github.com/unistack-org/micro/v3" | 	"go.unistack.org/micro/v4" | ||||||
| 	"github.com/unistack-org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| 	httpServer "github.com/unistack-org/micro-server-http" | 	httpServer "go.unistack.org/micro-server-http/v4" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func main() { | func main() { | ||||||
|   | |||||||
							
								
								
									
										16
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										16
									
								
								go.mod
									
									
									
									
									
								
							| @@ -1,8 +1,16 @@ | |||||||
| module go.unistack.org/micro-server-http/v3 | module go.unistack.org/micro-server-http/v4 | ||||||
|  |  | ||||||
| go 1.16 | go 1.19 | ||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	go.unistack.org/micro/v3 v3.8.21 | 	go.unistack.org/micro-proto/v4 v4.0.0 | ||||||
| 	golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba | 	go.unistack.org/micro/v4 v4.0.1 | ||||||
|  | 	golang.org/x/net v0.7.0 | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | require ( | ||||||
|  | 	github.com/golang/protobuf v1.5.2 // indirect | ||||||
|  | 	github.com/google/gnostic v0.6.9 // indirect | ||||||
|  | 	google.golang.org/protobuf v1.28.1 // indirect | ||||||
|  | 	gopkg.in/yaml.v3 v3.0.1 // indirect | ||||||
| ) | ) | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										37
									
								
								go.sum
									
									
									
									
									
								
							| @@ -13,7 +13,6 @@ github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWH | |||||||
| github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= | ||||||
| github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= | github.com/docopt/docopt-go v0.0.0-20180111231733-ee0de3bc6815/go.mod h1:WwZ+bS3ebgob9U8Nd0kOddGdZWjyMGR8Wziv+TBNwSE= | ||||||
| github.com/ef-ds/deque v1.0.4/go.mod h1:gXDnTC3yqvBcHbq2lcExjtAcVrOnJCbMcZXmuj8Z4tg= |  | ||||||
| github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | github.com/envoyproxy/go-control-plane v0.9.0/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||||
| github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | github.com/envoyproxy/go-control-plane v0.9.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= | ||||||
| github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | github.com/envoyproxy/go-control-plane v0.9.4/go.mod h1:6rpuAdCZL397s3pYoYcLgu1mIlRU8Am5FuJP05cCM98= | ||||||
| @@ -22,7 +21,6 @@ github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.m | |||||||
| github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= | ||||||
| github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= | github.com/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= | ||||||
| github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= | ||||||
| github.com/golang-jwt/jwt/v4 v4.2.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= |  | ||||||
| github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | github.com/golang/glog v0.0.0-20160126235308-23def4e6c14b/go.mod h1:SBH7ygxi8pfUlaOkMMuAQtPIUF8ecWP5IEl/CR7VP2Q= | ||||||
| github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= | ||||||
| github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= | ||||||
| @@ -37,8 +35,10 @@ github.com/golang/protobuf v1.4.1/go.mod h1:U8fpvMrcmy5pZrNK1lt4xCsGvpyWQ/VVv6QD | |||||||
| github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||||
| github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= | ||||||
| github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= | ||||||
|  | github.com/golang/protobuf v1.5.2 h1:ROPKBNFfQgOUMifHyP+KYbvpjbdoFNs+aK7DXlji0Tw= | ||||||
| github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= | ||||||
| github.com/google/gnostic v0.6.6/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= | github.com/google/gnostic v0.6.9 h1:ZK/5VhkoX835RikCHpSUJV9a+S3e1zLh59YnyWeBW+0= | ||||||
|  | github.com/google/gnostic v0.6.9/go.mod h1:Nm8234We1lq6iB9OmlgNv3nH91XLLVZHCDayfA3xq+E= | ||||||
| github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= | ||||||
| github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
| github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= | ||||||
| @@ -48,16 +48,14 @@ github.com/google/go-cmp v0.5.5 h1:Khx7svrCpmxxtHBq5j2mp/xVjsi8hQMfNLvJFAlrGgU= | |||||||
| github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= | ||||||
| github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= | ||||||
| github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= | github.com/grpc-ecosystem/grpc-gateway v1.16.0/go.mod h1:BDjrQk3hbvj6Nolgz8mAMFbcEtjT1g+wF4CSlocrBnw= | ||||||
| github.com/imdario/mergo v0.3.12/go.mod h1:jmQim1M+e3UYxmgPu/WyfjB3N3VflVyUjjjwH0dnCYA= | github.com/kr/pretty v0.2.0 h1:s5hAObm+yFO5uHYt5dYjxi2rXrsnmRpJx4OYvIWUaQs= | ||||||
| github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= | ||||||
| github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= | ||||||
|  | github.com/kr/text v0.1.0 h1:45sCR5RtlFHMR4UwH9sdQ5TC8v0qDQCHnXt+kaKSTVE= | ||||||
| github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= | ||||||
| github.com/patrickmn/go-cache v2.1.0+incompatible h1:HRMgzkcYKYpi3C8ajMPV8OFXaaRUnok+kx1WdO15EQc= |  | ||||||
| github.com/patrickmn/go-cache v2.1.0+incompatible/go.mod h1:3Qf8kWWT7OJRJbdiICTKqZju1ZixQ/KpMGzzAfe6+WQ= |  | ||||||
| github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= | ||||||
| github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= | ||||||
| github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= | ||||||
| github.com/silas/dag v0.0.0-20211117232152-9d50aa809f35/go.mod h1:7RTUFBdIRC9nZ7/3RyRNH1bdqIShrDejd1YbLwgPS+I= |  | ||||||
| github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= | ||||||
| github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= | github.com/stoewer/go-strcase v1.2.0/go.mod h1:IBiWB2sKIp3wVVQ3Y035++gc+knqhUQag1KpM8ahLw8= | ||||||
| github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= | ||||||
| @@ -67,10 +65,10 @@ github.com/xeipuuv/gojsonpointer v0.0.0-20180127040702-4e3ac2762d5f/go.mod h1:N2 | |||||||
| github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= | github.com/xeipuuv/gojsonreference v0.0.0-20180127040603-bd5ef7bd5415/go.mod h1:GwrjFmJcFw6At/Gs6z4yjiIwzuJ1/+UwLxMQDVQXShQ= | ||||||
| github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= | github.com/xeipuuv/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= | ||||||
| go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | go.opentelemetry.io/proto/otlp v0.7.0/go.mod h1:PqfVotwruBrMGOCsRd/89rSnXhoiJIqeYNgFYFoEGnI= | ||||||
| go.unistack.org/micro-proto/v3 v3.2.1 h1:z7+V97LcAwMbBiYStmf8b6fFk2UPJTzni+rxNqk4NrI= | go.unistack.org/micro-proto/v4 v4.0.0 h1:+TAwKSlx48eLsNO2E2cO0JLE8we1KU2AuWe9Q310FuU= | ||||||
| go.unistack.org/micro-proto/v3 v3.2.1/go.mod h1:ZltVWNECD5yK+40+OCONzGw4OtmSdTpVi8/KFgo9dqM= | go.unistack.org/micro-proto/v4 v4.0.0/go.mod h1:ArmK7o+uFvxSY3dbJhKBBX4Pm1rhWdLEFf3LxBrMtec= | ||||||
| go.unistack.org/micro/v3 v3.8.21 h1:8vYxtIlPnCBZ888BrQSP6+b0CFQcn5FiaqDpI5XqorQ= | go.unistack.org/micro/v4 v4.0.1 h1:xo1IxbVfgh8i0eY0VeYa3cbb13u5n/Mxnp3FOgWD4Jo= | ||||||
| go.unistack.org/micro/v3 v3.8.21/go.mod h1:aBOCQ6SkAwKMRI7Q1CIsQA2S88ibyJfweJZlT1M2qpE= | go.unistack.org/micro/v4 v4.0.1/go.mod h1:p/J5UcSJjfHsWGT31uKoghQ5rUQZzQJBAFy+Z4+ZVMs= | ||||||
| golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= | ||||||
| golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= | ||||||
| golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= | ||||||
| @@ -86,9 +84,8 @@ golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn | |||||||
| golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | golang.org/x/net v0.0.0-20200822124328-c89045814202/go.mod h1:/O7V0waA8r7cgGh81Ro3o1hOxt32SMVPicZroKQ2sZA= | ||||||
| golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= | ||||||
| golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | golang.org/x/net v0.0.0-20210805182204-aaa1db679c0d/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | ||||||
| golang.org/x/net v0.0.0-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= | golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= | ||||||
| golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba h1:6u6sik+bn/y7vILcYkK3iwTBWN7WtBvB0+SZswQnbf8= | golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= | ||||||
| golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= |  | ||||||
| golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U= | ||||||
| golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | golang.org/x/oauth2 v0.0.0-20200107190931-bf48bf16ab8d/go.mod h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw= | ||||||
| golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= | ||||||
| @@ -103,15 +100,11 @@ golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7w | |||||||
| golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= | ||||||
| golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= | ||||||
| golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |  | ||||||
| golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= |  | ||||||
| golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= | ||||||
| golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= |  | ||||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= |  | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | golang.org/x/tools v0.0.0-20190226205152-f727befe758c/go.mod h1:9Yl7xja0Znq3iFh3HoIrodX9oNMXvdceNzlUR8zjMvY= | ||||||
| @@ -145,14 +138,16 @@ google.golang.org/protobuf v1.23.1-0.20200526195155-81db48ad09cc/go.mod h1:EGpAD | |||||||
| google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | google.golang.org/protobuf v1.25.0/go.mod h1:9JNX74DMeImyA3h4bdi1ymwjUzf21/xIlbajtzgsN7c= | ||||||
| google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= | ||||||
| google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||||
| google.golang.org/protobuf v1.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= |  | ||||||
| google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= | ||||||
|  | google.golang.org/protobuf v1.28.1 h1:d0NfwRgPtno5B1Wa6L2DAG+KivqkdutMf1UhdNx175w= | ||||||
|  | google.golang.org/protobuf v1.28.1/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= | ||||||
| gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
|  | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15 h1:YR8cESwS4TdDjEe65xsg0ogRM/Nc3DYOhEAlW+xobZo= | ||||||
| gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | gopkg.in/check.v1 v1.0.0-20190902080502-41f04d3bba15/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= | ||||||
| gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | gopkg.in/yaml.v2 v2.2.3/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= | ||||||
| gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= |  | ||||||
| gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.0-20200615113413-eeeca48fe776/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= | ||||||
|  | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= | ||||||
| honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
| honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= | ||||||
|   | |||||||
							
								
								
									
										57
									
								
								handler.go
									
									
									
									
									
								
							
							
						
						
									
										57
									
								
								handler.go
									
									
									
									
									
								
							| @@ -9,13 +9,13 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 	"sync" | 	"sync" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/errors" | 	"go.unistack.org/micro/v4/errors" | ||||||
| 	"go.unistack.org/micro/v3/logger" | 	"go.unistack.org/micro/v4/logger" | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v4/metadata" | ||||||
| 	"go.unistack.org/micro/v3/register" | 	"go.unistack.org/micro/v4/register" | ||||||
| 	"go.unistack.org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| 	rhttp "go.unistack.org/micro/v3/util/http" | 	rhttp "go.unistack.org/micro/v4/util/http" | ||||||
| 	rflutil "go.unistack.org/micro/v3/util/reflect" | 	rflutil "go.unistack.org/micro/v4/util/reflect" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -62,7 +62,7 @@ func (h *httpHandler) Options() server.HandlerOptions { | |||||||
|  |  | ||||||
| func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | ||||||
| 	// check for http.HandlerFunc handlers | 	// check for http.HandlerFunc handlers | ||||||
| 	if ph, _, ok := h.pathHandlers.Search(r.Method, r.URL.Path); ok { | 	if ph, _, err := h.pathHandlers.Search(r.Method, r.URL.Path); err == nil { | ||||||
| 		ph.(http.HandlerFunc)(w, r) | 		ph.(http.HandlerFunc)(w, r) | ||||||
| 		return | 		return | ||||||
| 	} | 	} | ||||||
| @@ -73,21 +73,22 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	ctx := context.WithValue(r.Context(), rspCodeKey{}, &rspCodeVal{}) | 	ctx := context.WithValue(r.Context(), rspCodeKey{}, &rspCodeVal{}) | ||||||
|  | 	ctx = context.WithValue(ctx, rspHeaderKey{}, &rspHeaderVal{}) | ||||||
| 	md, ok := metadata.FromIncomingContext(ctx) | 	md, ok := metadata.FromIncomingContext(ctx) | ||||||
| 	if !ok { | 	if !ok { | ||||||
| 		md = metadata.New(len(r.Header) + 8) | 		md = metadata.New(len(r.Header) + 8) | ||||||
| 	} | 	} | ||||||
| 	for k, v := range r.Header { | 	for k, v := range r.Header { | ||||||
| 		md.Set(k, strings.Join(v, ", ")) | 		md[k] = strings.Join(v, ", ") | ||||||
| 	} | 	} | ||||||
| 	md.Set("RemoteAddr", r.RemoteAddr) | 	md["RemoteAddr"] = r.RemoteAddr | ||||||
| 	md.Set("Method", r.Method) | 	md["Method"] = r.Method | ||||||
| 	md.Set("URL", r.URL.String()) | 	md["URL"] = r.URL.String() | ||||||
| 	md.Set("Proto", r.Proto) | 	md["Proto"] = r.Proto | ||||||
| 	md.Set("ContentLength", fmt.Sprintf("%d", r.ContentLength)) | 	md["ContentLength"] = fmt.Sprintf("%d", r.ContentLength) | ||||||
| 	md.Set("TransferEncoding", strings.Join(r.TransferEncoding, ",")) | 	md["TransferEncoding"] = strings.Join(r.TransferEncoding, ",") | ||||||
| 	md.Set("Host", r.Host) | 	md["Host"] = r.Host | ||||||
| 	md.Set("RequestURI", r.RequestURI) | 	md["RequestURI"] = r.RequestURI | ||||||
| 	ctx = metadata.NewIncomingContext(ctx, md) | 	ctx = metadata.NewIncomingContext(ctx, md) | ||||||
|  |  | ||||||
| 	defer r.Body.Close() | 	defer r.Body.Close() | ||||||
| @@ -106,8 +107,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
|  |  | ||||||
| 	for _, shdlr := range h.handlers { | 	for _, shdlr := range h.handlers { | ||||||
| 		hdlr := shdlr.(*httpHandler) | 		hdlr := shdlr.(*httpHandler) | ||||||
| 		fh, mp, ok := hdlr.handlers.Search(r.Method, path) | 		fh, mp, err := hdlr.handlers.Search(r.Method, path) | ||||||
| 		if ok { | 		if err == nil { | ||||||
| 			match = true | 			match = true | ||||||
| 			for k, v := range mp { | 			for k, v := range mp { | ||||||
| 				matches[k] = v | 				matches[k] = v | ||||||
| @@ -115,6 +116,9 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 			hldr = fh.(*patHandler) | 			hldr = fh.(*patHandler) | ||||||
| 			handler = hdlr | 			handler = hdlr | ||||||
| 			break | 			break | ||||||
|  | 		} else if err == rhttp.ErrMethodNotAllowed && !h.registerRPC { | ||||||
|  | 			h.errorHandler(ctx, nil, w, r, fmt.Errorf("not matching route found"), http.StatusMethodNotAllowed) | ||||||
|  | 			return | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| @@ -125,8 +129,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 			if len(serviceMethod) == 2 { | 			if len(serviceMethod) == 2 { | ||||||
| 				if shdlr, ok := h.handlers[serviceMethod[0]]; ok { | 				if shdlr, ok := h.handlers[serviceMethod[0]]; ok { | ||||||
| 					hdlr := shdlr.(*httpHandler) | 					hdlr := shdlr.(*httpHandler) | ||||||
| 					fh, mp, ok := hdlr.handlers.Search(http.MethodPost, "/"+microMethod) | 					fh, mp, err := hdlr.handlers.Search(http.MethodPost, "/"+microMethod) | ||||||
| 					if ok { | 					if err == nil { | ||||||
| 						match = true | 						match = true | ||||||
| 						for k, v := range mp { | 						for k, v := range mp { | ||||||
| 							matches[k] = v | 							matches[k] = v | ||||||
| @@ -210,14 +214,14 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 		service:     handler.sopts.Name, | 		service:     handler.sopts.Name, | ||||||
| 		contentType: ct, | 		contentType: ct, | ||||||
| 		method:      fmt.Sprintf("%s.%s", hldr.name, hldr.mtype.method.Name), | 		method:      fmt.Sprintf("%s.%s", hldr.name, hldr.mtype.method.Name), | ||||||
| 		body:        buf, | 		endpoint:    fmt.Sprintf("%s.%s", hldr.name, hldr.mtype.method.Name), | ||||||
| 		payload:     argv.Interface(), | 		payload:     argv.Interface(), | ||||||
| 		header:      md, | 		header:      md, | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	// define the handler func | 	// define the handler func | ||||||
| 	fn := func(fctx context.Context, req server.Request, rsp interface{}) (err error) { | 	fn := func(fctx context.Context, req server.Request, rsp interface{}) (err error) { | ||||||
| 		returnValues = function.Call([]reflect.Value{hldr.rcvr, hldr.mtype.prepareContext(fctx), reflect.ValueOf(argv.Interface()), reflect.ValueOf(rsp)}) | 		returnValues = function.Call([]reflect.Value{hldr.rcvr, hldr.mtype.prepareContext(fctx), argv, reflect.ValueOf(rsp)}) | ||||||
|  |  | ||||||
| 		// The return value for the method is an error. | 		// The return value for the method is an error. | ||||||
| 		if rerr := returnValues[0].Interface(); rerr != nil { | 		if rerr := returnValues[0].Interface(); rerr != nil { | ||||||
| @@ -261,6 +265,13 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { | |||||||
| 			w.Header().Set(k, v) | 			w.Header().Set(k, v) | ||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  | 	if md := getRspHeader(ctx); md != nil { | ||||||
|  | 		for k, v := range md { | ||||||
|  | 			for _, vv := range v { | ||||||
|  | 				w.Header().Add(k, vv) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
| 	if nct := w.Header().Get(metadata.HeaderContentType); nct != ct { | 	if nct := w.Header().Get(metadata.HeaderContentType); nct != ct { | ||||||
| 		if cf, err = h.newCodec(nct); err != nil { | 		if cf, err = h.newCodec(nct); err != nil { | ||||||
| 			h.errorHandler(ctx, nil, w, r, err, http.StatusBadRequest) | 			h.errorHandler(ctx, nil, w, r, err, http.StatusBadRequest) | ||||||
|   | |||||||
							
								
								
									
										8
									
								
								handler/health/generate.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								handler/health/generate.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | package health | ||||||
|  |  | ||||||
|  | //go:generate sh -c "protoc -I./ -I$(go list -f '{{ .Dir }}' -m go.unistack.org/micro-proto/v4) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./ health.proto" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	// import required packages | ||||||
|  | 	_ "go.unistack.org/micro-proto/v4/openapiv3" | ||||||
|  | ) | ||||||
							
								
								
									
										82
									
								
								handler/health/health.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										82
									
								
								handler/health/health.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,82 @@ | |||||||
|  | package health // import "go.unistack.org/micro-server-http/v4/handler/health" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"context" | ||||||
|  |  | ||||||
|  | 	codecpb "go.unistack.org/micro-proto/v4/codec" | ||||||
|  | 	"go.unistack.org/micro/v4/errors" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var _ HealthServiceServer = &Handler{} | ||||||
|  |  | ||||||
|  | type Handler struct { | ||||||
|  | 	opts Options | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type CheckFunc func(context.Context) error | ||||||
|  |  | ||||||
|  | type Option func(*Options) | ||||||
|  |  | ||||||
|  | type Options struct { | ||||||
|  | 	Version     string | ||||||
|  | 	Name        string | ||||||
|  | 	LiveChecks  []CheckFunc | ||||||
|  | 	ReadyChecks []CheckFunc | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func LiveChecks(fns ...CheckFunc) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.LiveChecks = append(o.LiveChecks, fns...) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func ReadyChecks(fns ...CheckFunc) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.ReadyChecks = append(o.ReadyChecks, fns...) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func Name(name string) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.Name = name | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func Version(version string) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.Version = version | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewHandler(opts ...Option) *Handler { | ||||||
|  | 	options := Options{} | ||||||
|  | 	for _, o := range opts { | ||||||
|  | 		o(&options) | ||||||
|  | 	} | ||||||
|  | 	return &Handler{opts: options} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *Handler) Live(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { | ||||||
|  | 	var err error | ||||||
|  | 	for _, fn := range h.opts.LiveChecks { | ||||||
|  | 		if err = fn(ctx); err != nil { | ||||||
|  | 			return errors.ServiceUnavailable(h.opts.Name, "%v", err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *Handler) Ready(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { | ||||||
|  | 	var err error | ||||||
|  | 	for _, fn := range h.opts.ReadyChecks { | ||||||
|  | 		if err = fn(ctx); err != nil { | ||||||
|  | 			return errors.ServiceUnavailable(h.opts.Name, "%v", err) | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *Handler) Version(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { | ||||||
|  | 	rsp.Data = []byte(h.opts.Version) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										50
									
								
								handler/health/health.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								handler/health/health.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | syntax = "proto3"; | ||||||
|  |  | ||||||
|  | package micro.server.http.v4.handler.health; | ||||||
|  | option go_package = "go.unistack.org/micro-server-http/v4/handler/health;health"; | ||||||
|  |  | ||||||
|  | import "api/annotations.proto"; | ||||||
|  | import "openapiv3/annotations.proto"; | ||||||
|  | import "codec/frame.proto"; | ||||||
|  |  | ||||||
|  | service HealthService { | ||||||
|  | 	rpc Live(micro.codec.Frame) returns (micro.codec.Frame) { | ||||||
|  | 		option (micro.openapiv3.openapiv3_operation) = { | ||||||
|  |       operation_id: "Live"; | ||||||
|  |       responses: { | ||||||
|  |         default: { | ||||||
|  |           reference: { | ||||||
|  |             _ref: "micro.codec.Frame"; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 		option (micro.api.http) = { get: "/live"; }; | ||||||
|  |   }; | ||||||
|  | 	rpc Ready(micro.codec.Frame) returns (micro.codec.Frame) { | ||||||
|  | 		option (micro.openapiv3.openapiv3_operation) = { | ||||||
|  |       operation_id: "Ready"; | ||||||
|  |       responses: { | ||||||
|  |         default: { | ||||||
|  |           reference: { | ||||||
|  |             _ref: "micro.codec.Frame"; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 		option (micro.api.http) = { get: "/ready"; }; | ||||||
|  |   }; | ||||||
|  | 	rpc Version(micro.codec.Frame) returns (micro.codec.Frame) { | ||||||
|  | 		option (micro.openapiv3.openapiv3_operation) = { | ||||||
|  |       operation_id: "Version"; | ||||||
|  |       responses: { | ||||||
|  |         default: { | ||||||
|  |           reference: { | ||||||
|  |             _ref: "micro.codec.Frame"; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 		option (micro.api.http) = { get: "/version"; }; | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										48
									
								
								handler/health/health_micro.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										48
									
								
								handler/health/health_micro.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,48 @@ | |||||||
|  | // Code generated by protoc-gen-go-micro. DO NOT EDIT. | ||||||
|  | // versions: | ||||||
|  | // - protoc-gen-go-micro v4.10.2 | ||||||
|  | // - protoc              v4.21.12 | ||||||
|  | // source: health.proto | ||||||
|  |  | ||||||
|  | package health | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	context "context" | ||||||
|  | 	codec "go.unistack.org/micro-proto/v4/codec" | ||||||
|  | 	v4 "go.unistack.org/micro-server-http/v4" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	HealthServiceName = "HealthService" | ||||||
|  | ) | ||||||
|  | var ( | ||||||
|  | 	HealthServiceServerEndpoints = []v4.EndpointMetadata{ | ||||||
|  | 		{ | ||||||
|  | 			Name:   "HealthService.Live", | ||||||
|  | 			Path:   "/live", | ||||||
|  | 			Method: "GET", | ||||||
|  | 			Body:   "", | ||||||
|  | 			Stream: false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Name:   "HealthService.Ready", | ||||||
|  | 			Path:   "/ready", | ||||||
|  | 			Method: "GET", | ||||||
|  | 			Body:   "", | ||||||
|  | 			Stream: false, | ||||||
|  | 		}, | ||||||
|  | 		{ | ||||||
|  | 			Name:   "HealthService.Version", | ||||||
|  | 			Path:   "/version", | ||||||
|  | 			Method: "GET", | ||||||
|  | 			Body:   "", | ||||||
|  | 			Stream: false, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type HealthServiceServer interface { | ||||||
|  | 	Live(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | 	Ready(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | 	Version(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | } | ||||||
							
								
								
									
										43
									
								
								handler/health/health_micro_http.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										43
									
								
								handler/health/health_micro_http.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,43 @@ | |||||||
|  | // Code generated by protoc-gen-go-micro. DO NOT EDIT. | ||||||
|  | // protoc-gen-go-micro version: v4.10.2 | ||||||
|  | // source: health.proto | ||||||
|  |  | ||||||
|  | package health | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	context "context" | ||||||
|  | 	codec "go.unistack.org/micro-proto/v4/codec" | ||||||
|  | 	v4 "go.unistack.org/micro-server-http/v4" | ||||||
|  | 	server "go.unistack.org/micro/v4/server" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type healthServiceServer struct { | ||||||
|  | 	HealthServiceServer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *healthServiceServer) Live(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { | ||||||
|  | 	return h.HealthServiceServer.Live(ctx, req, rsp) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *healthServiceServer) Ready(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { | ||||||
|  | 	return h.HealthServiceServer.Ready(ctx, req, rsp) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *healthServiceServer) Version(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { | ||||||
|  | 	return h.HealthServiceServer.Version(ctx, req, rsp) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func RegisterHealthServiceServer(s server.Server, sh HealthServiceServer, opts ...server.HandlerOption) error { | ||||||
|  | 	type healthService interface { | ||||||
|  | 		Live(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | 		Ready(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | 		Version(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | 	} | ||||||
|  | 	type HealthService struct { | ||||||
|  | 		healthService | ||||||
|  | 	} | ||||||
|  | 	h := &healthServiceServer{sh} | ||||||
|  | 	var nopts []server.HandlerOption | ||||||
|  | 	nopts = append(nopts, v4.HandlerEndpoints(HealthServiceServerEndpoints)) | ||||||
|  | 	return s.Handle(s.NewHandler(&HealthService{h}, append(nopts, opts...)...)) | ||||||
|  | } | ||||||
							
								
								
									
										8
									
								
								handler/meter/generate.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								handler/meter/generate.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | |||||||
|  | package meter | ||||||
|  |  | ||||||
|  | //go:generate sh -c "protoc -I./ -I$(go list -f '{{ .Dir }}' -m go.unistack.org/micro-proto/v4) --go-micro_out='components=micro|http|server',standalone=false,debug=true,paths=source_relative:./ meter.proto" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	// import required packages | ||||||
|  | 	_ "go.unistack.org/micro-proto/v4/openapiv3" | ||||||
|  | ) | ||||||
							
								
								
									
										67
									
								
								handler/meter/meter.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								handler/meter/meter.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | |||||||
|  | package meter // import "go.unistack.org/micro-server-http/v4/handler/meter" | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"bytes" | ||||||
|  | 	"context" | ||||||
|  |  | ||||||
|  | 	codecpb "go.unistack.org/micro-proto/v4/codec" | ||||||
|  | 	"go.unistack.org/micro/v4/errors" | ||||||
|  | 	"go.unistack.org/micro/v4/meter" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // guard to fail early | ||||||
|  | var _ MeterServiceServer = &Handler{} | ||||||
|  |  | ||||||
|  | type Handler struct { | ||||||
|  | 	opts Options | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type Option func(*Options) | ||||||
|  |  | ||||||
|  | type Options struct { | ||||||
|  | 	Meter        meter.Meter | ||||||
|  | 	Name         string | ||||||
|  | 	MeterOptions []meter.Option | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func Meter(m meter.Meter) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.Meter = m | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func Name(name string) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.Name = name | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func MeterOptions(opts ...meter.Option) Option { | ||||||
|  | 	return func(o *Options) { | ||||||
|  | 		o.MeterOptions = append(o.MeterOptions, opts...) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewOptions(opts ...Option) Options { | ||||||
|  | 	options := Options{Meter: meter.DefaultMeter} | ||||||
|  | 	for _, o := range opts { | ||||||
|  | 		o(&options) | ||||||
|  | 	} | ||||||
|  | 	return options | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func NewHandler(opts ...Option) *Handler { | ||||||
|  | 	options := NewOptions(opts...) | ||||||
|  | 	return &Handler{opts: options} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *Handler) Metrics(ctx context.Context, req *codecpb.Frame, rsp *codecpb.Frame) error { | ||||||
|  | 	buf := bytes.NewBuffer(nil) | ||||||
|  | 	if err := h.opts.Meter.Write(buf, h.opts.MeterOptions...); err != nil { | ||||||
|  | 		return errors.InternalServerError(h.opts.Name, "%v", err) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	rsp.Data = buf.Bytes() | ||||||
|  |  | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
							
								
								
									
										24
									
								
								handler/meter/meter.proto
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										24
									
								
								handler/meter/meter.proto
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,24 @@ | |||||||
|  | syntax = "proto3"; | ||||||
|  |  | ||||||
|  | package micro.server.http.v4.handler.meter; | ||||||
|  | option go_package = "go.unistack.org/micro-server-http/v4/handler/meter;meter"; | ||||||
|  |  | ||||||
|  | import "api/annotations.proto"; | ||||||
|  | import "openapiv3/annotations.proto"; | ||||||
|  | import "codec/frame.proto"; | ||||||
|  |  | ||||||
|  | service MeterService { | ||||||
|  | 	rpc Metrics(micro.codec.Frame) returns (micro.codec.Frame) { | ||||||
|  | 		option (micro.openapiv3.openapiv3_operation) = { | ||||||
|  |       operation_id: "Metrics"; | ||||||
|  |       responses: { | ||||||
|  |         default: { | ||||||
|  |           reference: { | ||||||
|  |             _ref: "micro.codec.Frame"; | ||||||
|  |           }; | ||||||
|  |         }; | ||||||
|  |       }; | ||||||
|  |     }; | ||||||
|  | 		option (micro.api.http) = { get: "/metrics"; }; | ||||||
|  |   }; | ||||||
|  | }; | ||||||
							
								
								
									
										32
									
								
								handler/meter/meter_micro.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								handler/meter/meter_micro.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | // Code generated by protoc-gen-go-micro. DO NOT EDIT. | ||||||
|  | // versions: | ||||||
|  | // - protoc-gen-go-micro v4.10.2 | ||||||
|  | // - protoc              v4.21.12 | ||||||
|  | // source: meter.proto | ||||||
|  |  | ||||||
|  | package meter | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	context "context" | ||||||
|  | 	codec "go.unistack.org/micro-proto/v4/codec" | ||||||
|  | 	v4 "go.unistack.org/micro-server-http/v4" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | var ( | ||||||
|  | 	MeterServiceName = "MeterService" | ||||||
|  | ) | ||||||
|  | var ( | ||||||
|  | 	MeterServiceServerEndpoints = []v4.EndpointMetadata{ | ||||||
|  | 		{ | ||||||
|  | 			Name:   "MeterService.Metrics", | ||||||
|  | 			Path:   "/metrics", | ||||||
|  | 			Method: "GET", | ||||||
|  | 			Body:   "", | ||||||
|  | 			Stream: false, | ||||||
|  | 		}, | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type MeterServiceServer interface { | ||||||
|  | 	Metrics(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | } | ||||||
							
								
								
									
										33
									
								
								handler/meter/meter_micro_http.pb.go
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								handler/meter/meter_micro_http.pb.go
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | |||||||
|  | // Code generated by protoc-gen-go-micro. DO NOT EDIT. | ||||||
|  | // protoc-gen-go-micro version: v4.10.2 | ||||||
|  | // source: meter.proto | ||||||
|  |  | ||||||
|  | package meter | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	context "context" | ||||||
|  | 	codec "go.unistack.org/micro-proto/v4/codec" | ||||||
|  | 	v4 "go.unistack.org/micro-server-http/v4" | ||||||
|  | 	server "go.unistack.org/micro/v4/server" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | type meterServiceServer struct { | ||||||
|  | 	MeterServiceServer | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (h *meterServiceServer) Metrics(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error { | ||||||
|  | 	return h.MeterServiceServer.Metrics(ctx, req, rsp) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func RegisterMeterServiceServer(s server.Server, sh MeterServiceServer, opts ...server.HandlerOption) error { | ||||||
|  | 	type meterService interface { | ||||||
|  | 		Metrics(ctx context.Context, req *codec.Frame, rsp *codec.Frame) error | ||||||
|  | 	} | ||||||
|  | 	type MeterService struct { | ||||||
|  | 		meterService | ||||||
|  | 	} | ||||||
|  | 	h := &meterServiceServer{sh} | ||||||
|  | 	var nopts []server.HandlerOption | ||||||
|  | 	nopts = append(nopts, v4.HandlerEndpoints(MeterServiceServerEndpoints)) | ||||||
|  | 	return s.Handle(s.NewHandler(&MeterService{h}, append(nopts, opts...)...)) | ||||||
|  | } | ||||||
							
								
								
									
										90
									
								
								http.go
									
									
									
									
									
								
							
							
						
						
									
										90
									
								
								http.go
									
									
									
									
									
								
							| @@ -1,5 +1,5 @@ | |||||||
| // Package http implements a go-micro.Server | // Package http implements a go-micro.Server | ||||||
| package http // import "go.unistack.org/micro-server-http/v3" | package http // import "go.unistack.org/micro-server-http/v4" | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"context" | 	"context" | ||||||
| @@ -14,12 +14,12 @@ import ( | |||||||
| 	"sync" | 	"sync" | ||||||
| 	"time" | 	"time" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/broker" | 	"go.unistack.org/micro/v4/broker" | ||||||
| 	"go.unistack.org/micro/v3/codec" | 	"go.unistack.org/micro/v4/codec" | ||||||
| 	"go.unistack.org/micro/v3/logger" | 	"go.unistack.org/micro/v4/logger" | ||||||
| 	"go.unistack.org/micro/v3/register" | 	"go.unistack.org/micro/v4/register" | ||||||
| 	"go.unistack.org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| 	rhttp "go.unistack.org/micro/v3/util/http" | 	rhttp "go.unistack.org/micro/v4/util/http" | ||||||
| 	"golang.org/x/net/netutil" | 	"golang.org/x/net/netutil" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| @@ -109,10 +109,6 @@ func (h *httpServer) Init(opts ...server.Option) error { | |||||||
| 		h.RUnlock() | 		h.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
| 	if err := h.opts.Auth.Init(); err != nil { |  | ||||||
| 		h.RUnlock() |  | ||||||
| 		return err |  | ||||||
| 	} |  | ||||||
| 	if err := h.opts.Logger.Init(); err != nil { | 	if err := h.opts.Logger.Init(); err != nil { | ||||||
| 		h.RUnlock() | 		h.RUnlock() | ||||||
| 		return err | 		return err | ||||||
| @@ -184,14 +180,17 @@ func (h *httpServer) NewHandler(handler interface{}, opts ...server.HandlerOptio | |||||||
|  |  | ||||||
| 	tp := reflect.TypeOf(handler) | 	tp := reflect.TypeOf(handler) | ||||||
|  |  | ||||||
| 	if len(options.Metadata) == 0 { | 	/* | ||||||
| 		if h.registerRPC { | 		if len(options.Metadata) == 0 { | ||||||
| 			h.opts.Logger.Infof(h.opts.Context, "register rpc handler for http.MethodPost %s /%s", hn, hn) | 			if h.registerRPC { | ||||||
| 			if err := hdlr.handlers.Insert([]string{http.MethodPost}, "/"+hn, pth); err != nil { | 				h.opts.Logger.Infof(h.opts.Context, "register rpc handler for http.MethodPost %s /%s", hn, hn) | ||||||
| 				h.opts.Logger.Errorf(h.opts.Context, "cant add rpc handler for http.MethodPost %s /%s", hn, hn) | 				if err := hdlr.handlers.Insert([]string{http.MethodPost}, "/"+hn, pth); err != nil { | ||||||
|  | 					h.opts.Logger.Errorf(h.opts.Context, "cant add rpc handler for http.MethodPost %s /%s", hn, hn) | ||||||
|  | 				} | ||||||
| 			} | 			} | ||||||
| 		} | 		} | ||||||
| 	} | 	*/ | ||||||
|  |  | ||||||
| 	for hn, md := range options.Metadata { | 	for hn, md := range options.Metadata { | ||||||
| 		var method reflect.Method | 		var method reflect.Method | ||||||
| 		mname := hn[strings.Index(hn, ".")+1:] | 		mname := hn[strings.Index(hn, ".")+1:] | ||||||
| @@ -236,6 +235,56 @@ func (h *httpServer) NewHandler(handler interface{}, opts ...server.HandlerOptio | |||||||
| 		} | 		} | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	metadata, ok := options.Context.Value(handlerEndpointsKey{}).([]EndpointMetadata) | ||||||
|  | 	if !ok { | ||||||
|  | 		return hdlr | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	for _, md := range metadata { | ||||||
|  | 		hn := md.Name | ||||||
|  | 		var method reflect.Method | ||||||
|  | 		mname := hn[strings.Index(hn, ".")+1:] | ||||||
|  | 		for m := 0; m < tp.NumMethod(); m++ { | ||||||
|  | 			mn := tp.Method(m) | ||||||
|  | 			if mn.Name != mname { | ||||||
|  | 				continue | ||||||
|  | 			} | ||||||
|  | 			method = mn | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if method.Name == "" && h.opts.Logger.V(logger.ErrorLevel) { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "nil method for %s", mname) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		mtype, err := prepareEndpoint(method) | ||||||
|  | 		if err != nil && h.opts.Logger.V(logger.ErrorLevel) { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "%v", err) | ||||||
|  | 			continue | ||||||
|  | 		} else if mtype == nil { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "nil mtype for %s", mname) | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		rcvr := reflect.ValueOf(handler) | ||||||
|  | 		name := reflect.Indirect(rcvr).Type().Name() | ||||||
|  |  | ||||||
|  | 		pth := &patHandler{mtype: mtype, name: name, rcvr: rcvr} | ||||||
|  | 		hdlr.name = name | ||||||
|  |  | ||||||
|  | 		if err := hdlr.handlers.Insert([]string{md.Method}, md.Path, pth); err != nil { | ||||||
|  | 			h.opts.Logger.Errorf(h.opts.Context, "cant add handler for %s %s", md.Method, md.Path) | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if h.registerRPC { | ||||||
|  | 			h.opts.Logger.Infof(h.opts.Context, "register rpc handler for http.MethodPost %s /%s", hn, hn) | ||||||
|  | 			if err := hdlr.handlers.Insert([]string{http.MethodPost}, "/"+hn, pth); err != nil { | ||||||
|  | 				h.opts.Logger.Errorf(h.opts.Context, "cant add rpc handler for http.MethodPost %s /%s", hn, hn) | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	return hdlr | 	return hdlr | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -342,6 +391,7 @@ func (h *httpServer) Register() error { | |||||||
| 		} | 		} | ||||||
| 		opts = append(opts, broker.SubscribeContext(subCtx)) | 		opts = append(opts, broker.SubscribeContext(subCtx)) | ||||||
| 		opts = append(opts, broker.SubscribeAutoAck(sb.Options().AutoAck)) | 		opts = append(opts, broker.SubscribeAutoAck(sb.Options().AutoAck)) | ||||||
|  | 		opts = append(opts, broker.SubscribeBodyOnly(sb.Options().BodyOnly)) | ||||||
|  |  | ||||||
| 		sub, err := config.Broker.Subscribe(subCtx, sb.Topic(), handler, opts...) | 		sub, err := config.Broker.Subscribe(subCtx, sb.Topic(), handler, opts...) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| @@ -602,11 +652,15 @@ func (h *httpServer) Name() string { | |||||||
|  |  | ||||||
| func NewServer(opts ...server.Option) *httpServer { | func NewServer(opts ...server.Option) *httpServer { | ||||||
| 	options := server.NewOptions(opts...) | 	options := server.NewOptions(opts...) | ||||||
|  | 	eh := DefaultErrorHandler | ||||||
|  | 	if v, ok := options.Context.Value(errorHandlerKey{}).(errorHandler); ok && v != nil { | ||||||
|  | 		eh = v | ||||||
|  | 	} | ||||||
| 	return &httpServer{ | 	return &httpServer{ | ||||||
| 		opts:         options, | 		opts:         options, | ||||||
| 		exit:         make(chan chan error), | 		exit:         make(chan chan error), | ||||||
| 		subscribers:  make(map[*httpSubscriber][]broker.Subscriber), | 		subscribers:  make(map[*httpSubscriber][]broker.Subscriber), | ||||||
| 		errorHandler: DefaultErrorHandler, | 		errorHandler: eh, | ||||||
| 		pathHandlers: rhttp.NewTrie(), | 		pathHandlers: rhttp.NewTrie(), | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										12
									
								
								message.go
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								message.go
									
									
									
									
									
								
							| @@ -1,8 +1,8 @@ | |||||||
| package http | package http | ||||||
|  |  | ||||||
| import ( | import ( | ||||||
| 	"go.unistack.org/micro/v3/codec" | 	"go.unistack.org/micro/v4/codec" | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v4/metadata" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type httpMessage struct { | type httpMessage struct { | ||||||
| @@ -18,10 +18,6 @@ func (r *httpMessage) Topic() string { | |||||||
| 	return r.topic | 	return r.topic | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *httpMessage) Payload() interface{} { |  | ||||||
| 	return r.payload |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *httpMessage) ContentType() string { | func (r *httpMessage) ContentType() string { | ||||||
| 	return r.contentType | 	return r.contentType | ||||||
| } | } | ||||||
| @@ -30,8 +26,8 @@ func (r *httpMessage) Header() metadata.Metadata { | |||||||
| 	return r.header | 	return r.header | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *httpMessage) Body() []byte { | func (r *httpMessage) Body() interface{} { | ||||||
| 	return r.body | 	return r.payload | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *httpMessage) Codec() codec.Codec { | func (r *httpMessage) Codec() codec.Codec { | ||||||
|   | |||||||
							
								
								
									
										42
									
								
								options.go
									
									
									
									
									
								
							
							
						
						
									
										42
									
								
								options.go
									
									
									
									
									
								
							| @@ -5,7 +5,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"net/http" | 	"net/http" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| // SetError pass error to caller | // SetError pass error to caller | ||||||
| @@ -38,6 +38,20 @@ type ( | |||||||
| 	} | 	} | ||||||
| ) | ) | ||||||
|  |  | ||||||
|  | type ( | ||||||
|  | 	rspHeaderKey struct{} | ||||||
|  | 	rspHeaderVal struct { | ||||||
|  | 		h http.Header | ||||||
|  | 	} | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // SetRspHeader add response headers | ||||||
|  | func SetRspHeader(ctx context.Context, h http.Header) { | ||||||
|  | 	if rsp, ok := ctx.Value(rspHeaderKey{}).(*rspHeaderVal); ok { | ||||||
|  | 		rsp.h = h | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| // SetRspCode saves response code in context, must be used by handler to specify http code | // SetRspCode saves response code in context, must be used by handler to specify http code | ||||||
| func SetRspCode(ctx context.Context, code int) { | func SetRspCode(ctx context.Context, code int) { | ||||||
| 	if rsp, ok := ctx.Value(rspCodeKey{}).(*rspCodeVal); ok { | 	if rsp, ok := ctx.Value(rspCodeKey{}).(*rspCodeVal); ok { | ||||||
| @@ -45,6 +59,14 @@ func SetRspCode(ctx context.Context, code int) { | |||||||
| 	} | 	} | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // getRspHeader get http.Header from context | ||||||
|  | func getRspHeader(ctx context.Context) http.Header { | ||||||
|  | 	if rsp, ok := ctx.Value(rspHeaderKey{}).(*rspHeaderVal); ok { | ||||||
|  | 		return rsp.h | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // GetRspCode used internally by generated http server handler | // GetRspCode used internally by generated http server handler | ||||||
| func GetRspCode(ctx context.Context) int { | func GetRspCode(ctx context.Context) int { | ||||||
| 	var code int | 	var code int | ||||||
| @@ -68,10 +90,12 @@ func Server(hs *http.Server) server.Option { | |||||||
| 	return server.SetOption(serverKey{}, hs) | 	return server.SetOption(serverKey{}, hs) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | type errorHandler func(ctx context.Context, s server.Handler, w http.ResponseWriter, r *http.Request, err error, status int) | ||||||
|  |  | ||||||
| type errorHandlerKey struct{} | type errorHandlerKey struct{} | ||||||
|  |  | ||||||
| // ErrorHandler specifies handler for errors | // ErrorHandler specifies handler for errors | ||||||
| func ErrorHandler(fn func(ctx context.Context, s server.Handler, w http.ResponseWriter, r *http.Request, err error, status int)) server.Option { | func ErrorHandler(fn errorHandler) server.Option { | ||||||
| 	return server.SetOption(errorHandlerKey{}, fn) | 	return server.SetOption(errorHandlerKey{}, fn) | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -109,7 +133,19 @@ func RegisterRPCHandler(b bool) server.Option { | |||||||
| 	return server.SetOption(registerRPCHandlerKey{}, b) | 	return server.SetOption(registerRPCHandlerKey{}, b) | ||||||
| } | } | ||||||
|  |  | ||||||
| type headerKey struct{} | type handlerEndpointsKey struct{} | ||||||
|  |  | ||||||
|  | type EndpointMetadata struct { | ||||||
|  | 	Name   string | ||||||
|  | 	Path   string | ||||||
|  | 	Method string | ||||||
|  | 	Body   string | ||||||
|  | 	Stream bool | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func HandlerEndpoints(md []EndpointMetadata) server.HandlerOption { | ||||||
|  | 	return server.SetHandlerOption(handlerEndpointsKey{}, md) | ||||||
|  | } | ||||||
|  |  | ||||||
| type handlerOptions struct { | type handlerOptions struct { | ||||||
| 	headers []string | 	headers []string | ||||||
|   | |||||||
							
								
								
									
										14
									
								
								request.go
									
									
									
									
									
								
							
							
						
						
									
										14
									
								
								request.go
									
									
									
									
									
								
							| @@ -3,9 +3,9 @@ package http | |||||||
| import ( | import ( | ||||||
| 	"io" | 	"io" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/codec" | 	"go.unistack.org/micro/v4/codec" | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v4/metadata" | ||||||
| 	"go.unistack.org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -22,7 +22,6 @@ type rpcRequest struct { | |||||||
| 	endpoint    string | 	endpoint    string | ||||||
| 	contentType string | 	contentType string | ||||||
| 	service     string | 	service     string | ||||||
| 	body        []byte |  | ||||||
| 	stream      bool | 	stream      bool | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -32,7 +31,6 @@ type rpcMessage struct { | |||||||
| 	header      metadata.Metadata | 	header      metadata.Metadata | ||||||
| 	topic       string | 	topic       string | ||||||
| 	contentType string | 	contentType string | ||||||
| 	body        []byte |  | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *rpcRequest) ContentType() string { | func (r *rpcRequest) ContentType() string { | ||||||
| @@ -83,7 +81,7 @@ func (r *rpcMessage) Topic() string { | |||||||
| 	return r.topic | 	return r.topic | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *rpcMessage) Payload() interface{} { | func (r *rpcMessage) Body() interface{} { | ||||||
| 	return r.payload | 	return r.payload | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -91,10 +89,6 @@ func (r *rpcMessage) Header() metadata.Metadata { | |||||||
| 	return r.header | 	return r.header | ||||||
| } | } | ||||||
|  |  | ||||||
| func (r *rpcMessage) Body() []byte { |  | ||||||
| 	return r.body |  | ||||||
| } |  | ||||||
|  |  | ||||||
| func (r *rpcMessage) Codec() codec.Codec { | func (r *rpcMessage) Codec() codec.Codec { | ||||||
| 	return r.codec | 	return r.codec | ||||||
| } | } | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ import ( | |||||||
| 	"unicode" | 	"unicode" | ||||||
| 	"unicode/utf8" | 	"unicode/utf8" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type methodType struct { | type methodType struct { | ||||||
|   | |||||||
| @@ -7,11 +7,11 @@ import ( | |||||||
| 	"reflect" | 	"reflect" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/broker" | 	"go.unistack.org/micro/v4/broker" | ||||||
| 	"go.unistack.org/micro/v3/codec" | 	"go.unistack.org/micro/v4/codec" | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v4/metadata" | ||||||
| 	"go.unistack.org/micro/v3/register" | 	"go.unistack.org/micro/v4/register" | ||||||
| 	"go.unistack.org/micro/v3/server" | 	"go.unistack.org/micro/v4/server" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var typeOfError = reflect.TypeOf((*error)(nil)).Elem() | var typeOfError = reflect.TypeOf((*error)(nil)).Elem() | ||||||
| @@ -151,7 +151,7 @@ func (s *httpServer) createSubHandler(sb *httpSubscriber, opts server.Options) b | |||||||
| 					vals = append(vals, reflect.ValueOf(ctx)) | 					vals = append(vals, reflect.ValueOf(ctx)) | ||||||
| 				} | 				} | ||||||
|  |  | ||||||
| 				vals = append(vals, reflect.ValueOf(msg.Payload())) | 				vals = append(vals, reflect.ValueOf(msg.Body())) | ||||||
|  |  | ||||||
| 				returnValues := handler.method.Call(vals) | 				returnValues := handler.method.Call(vals) | ||||||
| 				if err := returnValues[0].Interface(); err != nil { | 				if err := returnValues[0].Interface(); err != nil { | ||||||
| @@ -170,7 +170,6 @@ func (s *httpServer) createSubHandler(sb *httpSubscriber, opts server.Options) b | |||||||
| 					contentType: ct, | 					contentType: ct, | ||||||
| 					payload:     req.Interface(), | 					payload:     req.Interface(), | ||||||
| 					header:      msg.Header, | 					header:      msg.Header, | ||||||
| 					body:        msg.Body, |  | ||||||
| 					codec:       cf, | 					codec:       cf, | ||||||
| 				}) | 				}) | ||||||
| 			}() | 			}() | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								util.go
									
									
									
									
									
								
							
							
						
						
									
										4
									
								
								util.go
									
									
									
									
									
								
							| @@ -5,8 +5,8 @@ import ( | |||||||
| 	"net/http" | 	"net/http" | ||||||
| 	"strings" | 	"strings" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v4/metadata" | ||||||
| 	rutil "go.unistack.org/micro/v3/util/reflect" | 	rutil "go.unistack.org/micro/v4/util/reflect" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func FillRequest(ctx context.Context, req interface{}, opts ...FillRequestOption) error { | func FillRequest(ctx context.Context, req interface{}, opts ...FillRequestOption) error { | ||||||
|   | |||||||
| @@ -7,7 +7,7 @@ import ( | |||||||
| 	"strings" | 	"strings" | ||||||
| 	"testing" | 	"testing" | ||||||
|  |  | ||||||
| 	"go.unistack.org/micro/v3/metadata" | 	"go.unistack.org/micro/v4/metadata" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| func TestFillrequest(t *testing.T) { | func TestFillrequest(t *testing.T) { | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user