h2non / gentleman

Plugin-driven, extensible HTTP client toolkit for Go

Home Page:https://pkg.go.dev/github.com/h2non/gentleman?tab=doc

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

HTTP method is overridden

solher opened this issue · comments

I wanted to try gentleman doing a simple:

func (r *Repository) Send(authPayload, method, url string, data interface{}) ([]byte, error) {
    req := r.c.Request()
    req.AddHeader("Auth-Server-Payload", authPayload)
    req.Method(method)
    req.URL(url)
    req.JSON(data)
    res, err := req.Send()
    if err != nil {
        return nil, err
    }
        return res.Bytes(), nil
}

But when I use it, the HTTP method is overridden and the client always send a POST.

When I write fmt.Printf(req.Context.Request.Method) just before the Send and it prints a GET, I can see that a fmt.Printf(ctx.Request.Method) in the doDial method of the dispatcher prints a POST.

Am I doing something wrong ?

commented

Well, that scenario could happen when you define a client level HTTP method.

I've fixed the issue. Try updating gentleman.

go get -u gopkg.in/h2non/gentleman.v0

Hum. It doesn't seems to solve the problem for me.

I don't define a client level HTTP method. I only do:

type Repository struct {
    c *gentleman.Client
}

func NewRepository() *Repository {
    return &Repository{c: gentleman.New()}
}

And then call the Send method.

commented

Have you tried it again updating gentleman?. It should work now since the method is define either in client or request level via middleware call chain.

Yeah the update is done.

// Method defines the HTTP verb to be used.
func (r *Request) Method(method string) *Request {
    r.Middleware.UseRequest(func(ctx *context.Context, h context.Handler) {
        ctx.Request.Method = method
        fmt.Print(ctx.Request.Method)
        h.Next(ctx)
    })
    return r
}

Prints GET while the same in the doDial method still prints POST.

commented

I see where is the issue. You're always calling JSON(), which implicitely defines the POST method if no method was previously defined. In that case you should consider calling that method only if payload data exists.

Oh ok ! Perfect, thanks a lot.