diff --git a/.github/workflows/autoapprove.yml b/.github/workflows/autoapprove.yml new file mode 100644 index 0000000..ebe28c9 --- /dev/null +++ b/.github/workflows/autoapprove.yml @@ -0,0 +1,20 @@ +name: "autoapprove" + +on: + pull_request_target: + types: [assigned, opened, synchronize, reopened] + +permissions: + pull-requests: write + contents: write + +jobs: + autoapprove: + runs-on: ubuntu-latest + steps: + - name: approve + uses: hmarr/auto-approve-action@v2 + if: github.actor == 'vtolstov' || github.actor == 'dependabot[bot]' + id: approve + with: + github-token: ${{ secrets.GITHUB_TOKEN }} \ No newline at end of file diff --git a/.github/workflows/automerge.yml b/.github/workflows/automerge.yml new file mode 100644 index 0000000..5ff3f69 --- /dev/null +++ b/.github/workflows/automerge.yml @@ -0,0 +1,21 @@ +name: "automerge" + +on: + pull_request_target: + types: [assigned, opened, synchronize, reopened] + +permissions: + pull-requests: write + contents: write + +jobs: + automerge: + runs-on: ubuntu-latest + if: github.actor == 'vtolstov' + steps: + - name: merge + id: merge + run: gh pr merge --auto --merge "$PR_URL" + env: + PR_URL: ${{github.event.pull_request.html_url}} + GITHUB_TOKEN: ${{secrets.TOKEN}} diff --git a/.github/workflows/dependabot-automerge.yml b/.github/workflows/dependabot-automerge.yml index 12490d1..3681028 100644 --- a/.github/workflows/dependabot-automerge.yml +++ b/.github/workflows/dependabot-automerge.yml @@ -1,4 +1,4 @@ -name: "prautomerge" +name: "dependabot-automerge" on: pull_request_target: @@ -9,21 +9,17 @@ permissions: contents: write jobs: - dependabot: + automerge: runs-on: ubuntu-latest - if: ${{ github.actor == 'dependabot[bot]' }} + if: github.actor == 'dependabot[bot]' steps: - name: metadata id: metadata uses: dependabot/fetch-metadata@v1.3.0 with: github-token: "${{ secrets.TOKEN }}" - - name: approve - run: gh pr review --approve "$PR_URL" - env: - PR_URL: ${{github.event.pull_request.html_url}} - GITHUB_TOKEN: ${{secrets.TOKEN}} - name: merge + id: merge if: ${{contains(steps.metadata.outputs.dependency-names, 'go.unistack.org')}} run: gh pr merge --auto --merge "$PR_URL" env: diff --git a/http.go b/http.go index 8e843df..b29468a 100644 --- a/http.go +++ b/http.go @@ -604,6 +604,8 @@ func (h *httpClient) Publish(ctx context.Context, p client.Message, opts ...clie } func (h *httpClient) publish(ctx context.Context, ps []client.Message, opts ...client.PublishOption) error { + var body []byte + options := client.NewPublishOptions(opts...) // get proxy @@ -622,24 +624,22 @@ func (h *httpClient) publish(ctx context.Context, ps []client.Message, opts ...c for _, p := range ps { md := metadata.Copy(omd) md[metadata.HeaderContentType] = p.ContentType() - md[metadata.HeaderTopic] = p.Topic() - - cf, err := h.newCodec(p.ContentType()) - if err != nil { - return errors.InternalServerError("go.micro.client", err.Error()) - } - - var body []byte // passed in raw data if d, ok := p.Payload().(*codec.Frame); ok { body = d.Data } else { - b := bytes.NewBuffer(nil) - if err := cf.Write(b, &codec.Message{Type: codec.Event}, p.Payload()); err != nil { + // use codec for payload + cf, err := h.newCodec(p.ContentType()) + if err != nil { return errors.InternalServerError("go.micro.client", err.Error()) } - body = b.Bytes() + // set the body + b, err := cf.Marshal(p.Payload()) + if err != nil { + return errors.InternalServerError("go.micro.client", err.Error()) + } + body = b } topic := p.Topic() @@ -647,6 +647,9 @@ func (h *httpClient) publish(ctx context.Context, ps []client.Message, opts ...c topic = exchange } + for k, v := range p.Metadata() { + md.Set(k, v) + } md.Set(metadata.HeaderTopic, topic) msgs = append(msgs, &broker.Message{Header: md, Body: body}) } diff --git a/util.go b/util.go index 0673d1f..2fc37d4 100644 --- a/util.go +++ b/util.go @@ -147,11 +147,11 @@ func newPathRequest(path string, method string, body string, msg interface{}, ta switch val.Type().Kind() { case reflect.Slice: for idx := 0; idx < val.Len(); idx++ { - values.Add(t.name, fmt.Sprintf("%v", val.Index(idx).Interface())) + values.Add(t.name, getParam(val.Index(idx))) } fieldsmapskip[t.name] = struct{}{} default: - fieldsmap[t.name] = fmt.Sprintf("%v", val.Interface()) + fieldsmap[t.name] = getParam(val) } } else if (body == "*" || body == t.name) && method != http.MethodGet { if tnmsg.Field(i).CanSet() { @@ -160,10 +160,10 @@ func newPathRequest(path string, method string, body string, msg interface{}, ta } else { if val.Type().Kind() == reflect.Slice { for idx := 0; idx < val.Len(); idx++ { - values.Add(t.name, fmt.Sprintf("%v", val.Index(idx).Interface())) + values.Add(t.name, getParam(val.Index(idx))) } } else { - values.Add(t.name, fmt.Sprintf("%v", val.Interface())) + values.Add(t.name, getParam(val)) } } } @@ -216,12 +216,6 @@ func newPathRequest(path string, method string, body string, msg interface{}, ta _, _ = b.WriteString(values.Encode()) } - /* - if err = rutil.ZeroFieldByPath(nmsg, k); err != nil { - return nil, errors.BadRequest("go.micro.client", err.Error()) - } - */ - if rutil.IsZero(nmsg) { return b.String(), nil, nil } @@ -324,3 +318,26 @@ type tag struct { key string name string } + +func getParam(val reflect.Value) string { + var v string + switch val.Kind() { + case reflect.Ptr: + switch reflect.Indirect(val).Type().String() { + case + "wrapperspb.BoolValue", + "wrapperspb.BytesValue", + "wrapperspb.DoubleValue", + "wrapperspb.FloatValue", + "wrapperspb.Int32Value", "wrapperspb.Int64Value", + "wrapperspb.StringValue", + "wrapperspb.UInt32Value", "wrapperspb.UInt64Value": + if eva := reflect.Indirect(val).FieldByName("Value"); eva.IsValid() { + v = getParam(eva) + } + } + default: + v = fmt.Sprintf("%v", val.Interface()) + } + return v +}