diff --git a/.github/workflows/autoapprove.yml b/.github/workflows/autoapprove.yml index ebe28c9..5bf5d9f 100644 --- a/.github/workflows/autoapprove.yml +++ b/.github/workflows/autoapprove.yml @@ -13,7 +13,7 @@ jobs: runs-on: ubuntu-latest steps: - name: approve - uses: hmarr/auto-approve-action@v2 + uses: hmarr/auto-approve-action@v3 if: github.actor == 'vtolstov' || github.actor == 'dependabot[bot]' id: approve with: diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index d8002e9..9603352 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -10,13 +10,13 @@ jobs: runs-on: ubuntu-latest steps: - name: setup - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.17 - name: checkout uses: actions/checkout@v3 - name: cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -34,7 +34,7 @@ jobs: - name: checkout uses: actions/checkout@v3 - name: lint - uses: golangci/golangci-lint-action@v3.1.0 + uses: golangci/golangci-lint-action@v3.4.0 continue-on-error: true with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml index 9b4d428..2f6c6de 100644 --- a/.github/workflows/codeql-analysis.yml +++ b/.github/workflows/codeql-analysis.yml @@ -45,12 +45,12 @@ jobs: - name: checkout uses: actions/checkout@v3 - name: setup - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.17 # Initializes the CodeQL tools for scanning. - name: init - uses: github/codeql-action/init@v1 + uses: github/codeql-action/init@v2 with: languages: ${{ matrix.language }} # 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). # If this step fails, then you should remove it and run the build manually (see below) - name: autobuild - uses: github/codeql-action/autobuild@v1 + uses: github/codeql-action/autobuild@v2 # ℹī¸ Command-line programs to run using the OS shell. # 📚 https://git.io/JvXDl @@ -75,4 +75,4 @@ jobs: # make release - name: analyze - uses: github/codeql-action/analyze@v1 + uses: github/codeql-action/analyze@v2 diff --git a/.github/workflows/dependabot-automerge.yml b/.github/workflows/dependabot-automerge.yml index 3681028..f41c1c0 100644 --- a/.github/workflows/dependabot-automerge.yml +++ b/.github/workflows/dependabot-automerge.yml @@ -15,7 +15,7 @@ jobs: steps: - name: metadata id: metadata - uses: dependabot/fetch-metadata@v1.3.0 + uses: dependabot/fetch-metadata@v1.3.6 with: github-token: "${{ secrets.TOKEN }}" - name: merge diff --git a/.github/workflows/pr.yml b/.github/workflows/pr.yml index ff10c46..f313ebe 100644 --- a/.github/workflows/pr.yml +++ b/.github/workflows/pr.yml @@ -10,13 +10,13 @@ jobs: runs-on: ubuntu-latest steps: - name: setup - uses: actions/setup-go@v2 + uses: actions/setup-go@v3 with: - go-version: 1.16 + go-version: 1.17 - name: checkout uses: actions/checkout@v3 - name: cache - uses: actions/cache@v2 + uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} @@ -34,7 +34,7 @@ jobs: - name: checkout uses: actions/checkout@v3 - name: lint - uses: golangci/golangci-lint-action@v3.1.0 + uses: golangci/golangci-lint-action@v3.4.0 continue-on-error: true with: # Required: the version of golangci-lint is required and must be specified without patch version: we always use the latest patch version. diff --git a/README.md b/README.md index a32fab6..ddfc0b2 100644 --- a/README.md +++ b/README.md @@ -9,8 +9,8 @@ to create a HTTP Server that could potentially be used for REST based API servic import ( "net/http" - "github.com/unistack-org/micro/v3/server" - httpServer "github.com/unistack-org/micro-server-http" + "go.unistack.org/micro/v4/server" + httpServer "go.unistack.org/micro-server-http/v4" ) func main() { @@ -37,9 +37,9 @@ Or as part of a service import ( "net/http" - "github.com/unistack-org/micro/v3" - "github.com/unistack-org/micro/v3/server" - httpServer "github.com/unistack-org/micro-server-http" + "go.unistack.org/micro/v4" + "go.unistack.org/micro/v4/server" + httpServer "go.unistack.org/micro-server-http/v4" ) func main() { diff --git a/go.mod b/go.mod index 32abb3f..f3c7063 100644 --- a/go.mod +++ b/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 ( - go.unistack.org/micro/v3 v3.8.21 - golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba + go.unistack.org/micro-proto/v4 v4.0.0 + 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 ) diff --git a/go.sum b/go.sum index 5d2e27d..8e7c920 100644 --- a/go.sum +++ b/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.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/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.1-0.20191026205805-5f8ba28d4473/go.mod h1:YTl/9mNaCwkRvm6d1a2C3ymFceY/DCBVvsKhRF0iEA4= 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/flowstack/go-jsonschema v0.1.1/go.mod h1:yL7fNggx1o8rm9RlgXv7hTBWxdBM0rVwpMwimd3F3N0= 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/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfbm0A= 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.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= 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/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.3.0/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/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/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/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/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/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/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/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= @@ -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/gojsonschema v1.2.0/go.mod h1:anYRn/JVcOK2ZgGU+IjEV4nwlhoK5sQluxsYJ78Id3Y= 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/v3 v3.2.1/go.mod h1:ZltVWNECD5yK+40+OCONzGw4OtmSdTpVi8/KFgo9dqM= -go.unistack.org/micro/v3 v3.8.21 h1:8vYxtIlPnCBZ888BrQSP6+b0CFQcn5FiaqDpI5XqorQ= -go.unistack.org/micro/v3 v3.8.21/go.mod h1:aBOCQ6SkAwKMRI7Q1CIsQA2S88ibyJfweJZlT1M2qpE= +go.unistack.org/micro-proto/v4 v4.0.0 h1:+TAwKSlx48eLsNO2E2cO0JLE8we1KU2AuWe9Q310FuU= +go.unistack.org/micro-proto/v4 v4.0.0/go.mod h1:ArmK7o+uFvxSY3dbJhKBBX4Pm1rhWdLEFf3LxBrMtec= +go.unistack.org/micro/v4 v4.0.1 h1:xo1IxbVfgh8i0eY0VeYa3cbb13u5n/Mxnp3FOgWD4Jo= +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-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= 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-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-20210928044308-7d9f5e0b762b/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= -golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba h1:6u6sik+bn/y7vILcYkK3iwTBWN7WtBvB0+SZswQnbf8= -golang.org/x/net v0.0.0-20220121210141-e204ce36a2ba/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.7.0 h1:rJrUqqhjsgNp7KqAIc25s9pZnjU7TUcSY7HcVZjdn1g= +golang.org/x/net v0.7.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= 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/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-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-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-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.3/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.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-20190114222345-bf090417da8b/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= 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.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.27.1 h1:SnqbnDw1V7RiZcXPx5MEeqPv2s79L9i7BJUlG/+RurQ= 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 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/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.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-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-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/handler.go b/handler.go index a555f43..a779aeb 100644 --- a/handler.go +++ b/handler.go @@ -9,13 +9,13 @@ import ( "strings" "sync" - "go.unistack.org/micro/v3/errors" - "go.unistack.org/micro/v3/logger" - "go.unistack.org/micro/v3/metadata" - "go.unistack.org/micro/v3/register" - "go.unistack.org/micro/v3/server" - rhttp "go.unistack.org/micro/v3/util/http" - rflutil "go.unistack.org/micro/v3/util/reflect" + "go.unistack.org/micro/v4/errors" + "go.unistack.org/micro/v4/logger" + "go.unistack.org/micro/v4/metadata" + "go.unistack.org/micro/v4/register" + "go.unistack.org/micro/v4/server" + rhttp "go.unistack.org/micro/v4/util/http" + rflutil "go.unistack.org/micro/v4/util/reflect" ) var ( @@ -62,7 +62,7 @@ func (h *httpHandler) Options() server.HandlerOptions { func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { // 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) 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(ctx, rspHeaderKey{}, &rspHeaderVal{}) md, ok := metadata.FromIncomingContext(ctx) if !ok { md = metadata.New(len(r.Header) + 8) } for k, v := range r.Header { - md.Set(k, strings.Join(v, ", ")) + md[k] = strings.Join(v, ", ") } - md.Set("RemoteAddr", r.RemoteAddr) - md.Set("Method", r.Method) - md.Set("URL", r.URL.String()) - md.Set("Proto", r.Proto) - md.Set("ContentLength", fmt.Sprintf("%d", r.ContentLength)) - md.Set("TransferEncoding", strings.Join(r.TransferEncoding, ",")) - md.Set("Host", r.Host) - md.Set("RequestURI", r.RequestURI) + md["RemoteAddr"] = r.RemoteAddr + md["Method"] = r.Method + md["URL"] = r.URL.String() + md["Proto"] = r.Proto + md["ContentLength"] = fmt.Sprintf("%d", r.ContentLength) + md["TransferEncoding"] = strings.Join(r.TransferEncoding, ",") + md["Host"] = r.Host + md["RequestURI"] = r.RequestURI ctx = metadata.NewIncomingContext(ctx, md) defer r.Body.Close() @@ -106,8 +107,8 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { for _, shdlr := range h.handlers { hdlr := shdlr.(*httpHandler) - fh, mp, ok := hdlr.handlers.Search(r.Method, path) - if ok { + fh, mp, err := hdlr.handlers.Search(r.Method, path) + if err == nil { match = true for k, v := range mp { matches[k] = v @@ -115,6 +116,9 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { hldr = fh.(*patHandler) handler = hdlr 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 shdlr, ok := h.handlers[serviceMethod[0]]; ok { hdlr := shdlr.(*httpHandler) - fh, mp, ok := hdlr.handlers.Search(http.MethodPost, "/"+microMethod) - if ok { + fh, mp, err := hdlr.handlers.Search(http.MethodPost, "/"+microMethod) + if err == nil { match = true for k, v := range mp { matches[k] = v @@ -210,14 +214,14 @@ func (h *httpServer) ServeHTTP(w http.ResponseWriter, r *http.Request) { service: handler.sopts.Name, contentType: ct, 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(), header: md, } // define the handler func 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. 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) } } + 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 cf, err = h.newCodec(nct); err != nil { h.errorHandler(ctx, nil, w, r, err, http.StatusBadRequest) diff --git a/handler/health/generate.go b/handler/health/generate.go new file mode 100644 index 0000000..8df8f29 --- /dev/null +++ b/handler/health/generate.go @@ -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" +) diff --git a/handler/health/health.go b/handler/health/health.go new file mode 100644 index 0000000..84467ff --- /dev/null +++ b/handler/health/health.go @@ -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 +} diff --git a/handler/health/health.proto b/handler/health/health.proto new file mode 100644 index 0000000..7986943 --- /dev/null +++ b/handler/health/health.proto @@ -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"; }; + }; +}; diff --git a/handler/health/health_micro.pb.go b/handler/health/health_micro.pb.go new file mode 100644 index 0000000..767aa3a --- /dev/null +++ b/handler/health/health_micro.pb.go @@ -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 +} diff --git a/handler/health/health_micro_http.pb.go b/handler/health/health_micro_http.pb.go new file mode 100644 index 0000000..b8c2362 --- /dev/null +++ b/handler/health/health_micro_http.pb.go @@ -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...)...)) +} diff --git a/handler/meter/generate.go b/handler/meter/generate.go new file mode 100644 index 0000000..0342602 --- /dev/null +++ b/handler/meter/generate.go @@ -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" +) diff --git a/handler/meter/meter.go b/handler/meter/meter.go new file mode 100644 index 0000000..68ea5ba --- /dev/null +++ b/handler/meter/meter.go @@ -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 +} diff --git a/handler/meter/meter.proto b/handler/meter/meter.proto new file mode 100644 index 0000000..ddf23a0 --- /dev/null +++ b/handler/meter/meter.proto @@ -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"; }; + }; +}; diff --git a/handler/meter/meter_micro.pb.go b/handler/meter/meter_micro.pb.go new file mode 100644 index 0000000..b426725 --- /dev/null +++ b/handler/meter/meter_micro.pb.go @@ -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 +} diff --git a/handler/meter/meter_micro_http.pb.go b/handler/meter/meter_micro_http.pb.go new file mode 100644 index 0000000..75c2b2a --- /dev/null +++ b/handler/meter/meter_micro_http.pb.go @@ -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...)...)) +} diff --git a/http.go b/http.go index 8e99d7d..f447a0f 100644 --- a/http.go +++ b/http.go @@ -1,5 +1,5 @@ // 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 ( "context" @@ -14,12 +14,12 @@ import ( "sync" "time" - "go.unistack.org/micro/v3/broker" - "go.unistack.org/micro/v3/codec" - "go.unistack.org/micro/v3/logger" - "go.unistack.org/micro/v3/register" - "go.unistack.org/micro/v3/server" - rhttp "go.unistack.org/micro/v3/util/http" + "go.unistack.org/micro/v4/broker" + "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/logger" + "go.unistack.org/micro/v4/register" + "go.unistack.org/micro/v4/server" + rhttp "go.unistack.org/micro/v4/util/http" "golang.org/x/net/netutil" ) @@ -109,10 +109,6 @@ func (h *httpServer) Init(opts ...server.Option) error { h.RUnlock() return err } - if err := h.opts.Auth.Init(); err != nil { - h.RUnlock() - return err - } if err := h.opts.Logger.Init(); err != nil { h.RUnlock() return err @@ -184,14 +180,17 @@ func (h *httpServer) NewHandler(handler interface{}, opts ...server.HandlerOptio tp := reflect.TypeOf(handler) - if len(options.Metadata) == 0 { - 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) + /* + if len(options.Metadata) == 0 { + 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) + } } } - } + */ + for hn, md := range options.Metadata { var method reflect.Method 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 } @@ -342,6 +391,7 @@ func (h *httpServer) Register() error { } opts = append(opts, broker.SubscribeContext(subCtx)) 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...) if err != nil { @@ -602,11 +652,15 @@ func (h *httpServer) Name() string { func NewServer(opts ...server.Option) *httpServer { options := server.NewOptions(opts...) + eh := DefaultErrorHandler + if v, ok := options.Context.Value(errorHandlerKey{}).(errorHandler); ok && v != nil { + eh = v + } return &httpServer{ opts: options, exit: make(chan chan error), subscribers: make(map[*httpSubscriber][]broker.Subscriber), - errorHandler: DefaultErrorHandler, + errorHandler: eh, pathHandlers: rhttp.NewTrie(), } } diff --git a/message.go b/message.go index f6d3763..40e14de 100644 --- a/message.go +++ b/message.go @@ -1,8 +1,8 @@ package http import ( - "go.unistack.org/micro/v3/codec" - "go.unistack.org/micro/v3/metadata" + "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/metadata" ) type httpMessage struct { @@ -18,10 +18,6 @@ func (r *httpMessage) Topic() string { return r.topic } -func (r *httpMessage) Payload() interface{} { - return r.payload -} - func (r *httpMessage) ContentType() string { return r.contentType } @@ -30,8 +26,8 @@ func (r *httpMessage) Header() metadata.Metadata { return r.header } -func (r *httpMessage) Body() []byte { - return r.body +func (r *httpMessage) Body() interface{} { + return r.payload } func (r *httpMessage) Codec() codec.Codec { diff --git a/options.go b/options.go index 7a2903d..3e6fde1 100644 --- a/options.go +++ b/options.go @@ -5,7 +5,7 @@ import ( "fmt" "net/http" - "go.unistack.org/micro/v3/server" + "go.unistack.org/micro/v4/server" ) // 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 func SetRspCode(ctx context.Context, code int) { 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 func GetRspCode(ctx context.Context) int { var code int @@ -68,10 +90,12 @@ func Server(hs *http.Server) server.Option { 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{} // 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) } @@ -109,7 +133,19 @@ func RegisterRPCHandler(b bool) server.Option { 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 { headers []string diff --git a/request.go b/request.go index 4afa92d..16ac60b 100644 --- a/request.go +++ b/request.go @@ -3,9 +3,9 @@ package http import ( "io" - "go.unistack.org/micro/v3/codec" - "go.unistack.org/micro/v3/metadata" - "go.unistack.org/micro/v3/server" + "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/metadata" + "go.unistack.org/micro/v4/server" ) var ( @@ -22,7 +22,6 @@ type rpcRequest struct { endpoint string contentType string service string - body []byte stream bool } @@ -32,7 +31,6 @@ type rpcMessage struct { header metadata.Metadata topic string contentType string - body []byte } func (r *rpcRequest) ContentType() string { @@ -83,7 +81,7 @@ func (r *rpcMessage) Topic() string { return r.topic } -func (r *rpcMessage) Payload() interface{} { +func (r *rpcMessage) Body() interface{} { return r.payload } @@ -91,10 +89,6 @@ func (r *rpcMessage) Header() metadata.Metadata { return r.header } -func (r *rpcMessage) Body() []byte { - return r.body -} - func (r *rpcMessage) Codec() codec.Codec { return r.codec } diff --git a/server.go b/server.go index 7508467..8ea0da0 100644 --- a/server.go +++ b/server.go @@ -7,7 +7,7 @@ import ( "unicode" "unicode/utf8" - "go.unistack.org/micro/v3/server" + "go.unistack.org/micro/v4/server" ) type methodType struct { diff --git a/subscriber.go b/subscriber.go index 8880a95..9889c9d 100644 --- a/subscriber.go +++ b/subscriber.go @@ -7,11 +7,11 @@ import ( "reflect" "strings" - "go.unistack.org/micro/v3/broker" - "go.unistack.org/micro/v3/codec" - "go.unistack.org/micro/v3/metadata" - "go.unistack.org/micro/v3/register" - "go.unistack.org/micro/v3/server" + "go.unistack.org/micro/v4/broker" + "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/metadata" + "go.unistack.org/micro/v4/register" + "go.unistack.org/micro/v4/server" ) 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(msg.Payload())) + vals = append(vals, reflect.ValueOf(msg.Body())) returnValues := handler.method.Call(vals) if err := returnValues[0].Interface(); err != nil { @@ -170,7 +170,6 @@ func (s *httpServer) createSubHandler(sb *httpSubscriber, opts server.Options) b contentType: ct, payload: req.Interface(), header: msg.Header, - body: msg.Body, codec: cf, }) }() diff --git a/util.go b/util.go index 99576d3..83cc8fa 100644 --- a/util.go +++ b/util.go @@ -5,8 +5,8 @@ import ( "net/http" "strings" - "go.unistack.org/micro/v3/metadata" - rutil "go.unistack.org/micro/v3/util/reflect" + "go.unistack.org/micro/v4/metadata" + rutil "go.unistack.org/micro/v4/util/reflect" ) func FillRequest(ctx context.Context, req interface{}, opts ...FillRequestOption) error { diff --git a/util_test.go b/util_test.go index 76c7cd3..515f734 100644 --- a/util_test.go +++ b/util_test.go @@ -7,7 +7,7 @@ import ( "strings" "testing" - "go.unistack.org/micro/v3/metadata" + "go.unistack.org/micro/v4/metadata" ) func TestFillrequest(t *testing.T) {