diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c2fff38 --- /dev/null +++ b/.gitignore @@ -0,0 +1,39 @@ +# Develop tools +/.vscode/ +/.idea/ +.idea +.vscode + +# Binaries for programs and plugins +*.exe +*.exe~ +*.dll +*.so +*.dylib + +# Folders +_obj +_test +_build +.DS_Store + +# Architecture specific extensions/prefixes +*.[568vq] +[568vq].out + +*.cgo1.go +*.cgo2.c +_cgo_defun.c +_cgo_gotypes.go +_cgo_export.* + +# Test binary, build with `go test -c` +*.test + +# Output of the go coverage tool, specifically when used with LiteIDE +*.out + +# vim temp files +*~ +*.swp +*.swo diff --git a/go.mod b/go.mod index 65733a3..4c8ccb9 100644 --- a/go.mod +++ b/go.mod @@ -1,5 +1,20 @@ module go.unistack.org/micro-client-http/v4 -go 1.19 +go 1.22.0 -require go.unistack.org/micro/v4 v4.0.18 +toolchain go1.23.3 + +require go.unistack.org/micro/v4 v4.1.1 + +require ( + github.com/ash3in/uuidv8 v1.2.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/matoous/go-nanoid v1.5.1 // indirect + github.com/spf13/cast v1.7.1 // indirect + go.unistack.org/micro-proto/v4 v4.1.0 // indirect + golang.org/x/sys v0.29.0 // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20241216192217-9240e9c98484 // indirect + google.golang.org/grpc v1.69.4 // indirect + google.golang.org/protobuf v1.36.3 // indirect + gopkg.in/yaml.v3 v3.0.1 // indirect +) diff --git a/go.sum b/go.sum index 03a7fae..f7adb81 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,43 @@ -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= -go.unistack.org/micro/v4 v4.0.6 h1:YFWvTh3VwyOd6NHYTQcf47n2TF5+p/EhpnbuBQX3qhk= -go.unistack.org/micro/v4 v4.0.6/go.mod h1:bVEYTlPi0EsdgZZt311bIroDg9ict7ky3C87dSCCAGk= -go.unistack.org/micro/v4 v4.0.18 h1:b7WFwem8Nz1xBrRg5FeLnm9CE5gJseHyf9j0BhkiXW0= -go.unistack.org/micro/v4 v4.0.18/go.mod h1:5+da5r835gP0WnNZbYUJDCvWpJ9Xc3IEGyp62e8o8R4= +github.com/DATA-DOG/go-sqlmock v1.5.2 h1:OcvFkGmslmlZibjAjaHm3L//6LiuBgolP7OputlJIzU= +github.com/DATA-DOG/go-sqlmock v1.5.2/go.mod h1:88MAG/4G7SMwSE3CeA0ZKzrT5CiOU3OJ+JlNzwDqpNU= +github.com/ash3in/uuidv8 v1.2.0 h1:2oogGdtCPwaVtyvPPGin4TfZLtOGE5F+W++E880G6SI= +github.com/ash3in/uuidv8 v1.2.0/go.mod h1:BnU0wJBxnzdEKmVg4xckBkD+VZuecTFTUP3M0dWgyY4= +github.com/frankban/quicktest v1.14.6 h1:7Xjx+VpznH+oBnejlPUj8oUpdxnVs4f8XU8WnHkI4W8= +github.com/frankban/quicktest v1.14.6/go.mod h1:4ptaffx2x8+WTWXmUCuVU6aPUX1/Mz7zb5vbUoiM6w0= +github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek= +github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= +github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= +github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= +github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= +github.com/matoous/go-nanoid v1.5.1 h1:aCjdvTyO9LLnTIi0fgdXhOPPvOHjpXN6Ik9DaNjIct4= +github.com/matoous/go-nanoid v1.5.1/go.mod h1:zyD2a71IubI24efhpvkJz+ZwfwagzgSO6UNiFsZKN7U= +github.com/rogpeppe/go-internal v1.13.1 h1:KvO1DLK/DRN07sQ1LQKScxyZJuNnedQ5/wKSR38lUII= +github.com/rogpeppe/go-internal v1.13.1/go.mod h1:uMEvuHeurkdAXX61udpOXGD/AzZDWNMNyH2VO9fmH0o= +github.com/spf13/cast v1.7.1 h1:cuNEagBQEHWN1FnbGEjCXL2szYEXqfJPbP2HNUaca9Y= +github.com/spf13/cast v1.7.1/go.mod h1:ancEpBxwJDODSW/UG4rDrAqiKolqNNh2DX3mk86cAdo= +go.unistack.org/micro-proto/v4 v4.1.0 h1:qPwL2n/oqh9RE3RTTDgt28XK3QzV597VugQPaw9lKUk= +go.unistack.org/micro-proto/v4 v4.1.0/go.mod h1:ArmK7o+uFvxSY3dbJhKBBX4Pm1rhWdLEFf3LxBrMtec= +go.unistack.org/micro/v4 v4.1.1 h1:Cx2Uo5LN3J3lIxLv2jNYSqoVQbGShwMQgr4cffjqqVI= +go.unistack.org/micro/v4 v4.1.1/go.mod h1:lr3oYED8Ay1vjK68QqRw30QOtdk/ffpZqMFDasOUhKw= +golang.org/x/net v0.34.0 h1:Mb7Mrk043xzHgnRM88suvJFwzVrRfHEHJEl5/71CKw0= +golang.org/x/net v0.34.0/go.mod h1:di0qlW3YNM5oh6GqDGQr92MyTozJPmybPK4Ev/Gm31k= +golang.org/x/sys v0.29.0 h1:TPYlXGxvx1MGTn2GiZDhnjPA9wZzZeGKHHmKhHYvgaU= +golang.org/x/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.19.0 h1:kTxAhCbGbxhK0IwgSKiMO5awPoDQ0RpfiVYBfK860YM= +golang.org/x/text v0.19.0/go.mod h1:BuEKDfySbSR4drPmRPG/7iBdf8hvFMuRexcpahXilzY= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241216192217-9240e9c98484 h1:Z7FRVJPSMaHQxD0uXU8WdgFh8PseLM8Q8NzhnpMrBhQ= +google.golang.org/genproto/googleapis/rpc v0.0.0-20241216192217-9240e9c98484/go.mod h1:lcTa1sDdWEIHMWlITnIczmw5w60CF9ffkb8Z+DVmmjA= +google.golang.org/grpc v1.69.4 h1:MF5TftSMkd8GLw/m0KM6V8CMOCY6NZ1NQDPGFgbTt4A= +google.golang.org/grpc v1.69.4/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4= +google.golang.org/protobuf v1.36.3 h1:82DV7MYdb8anAVi3qge1wSnMDrnKK7ebr+I0hHRN1BU= +google.golang.org/protobuf v1.36.3/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= +gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= diff --git a/http.go b/http.go index bb83d6c..e909b75 100644 --- a/http.go +++ b/http.go @@ -304,7 +304,7 @@ func (h *httpClient) newCodec(ct string) (codec.Codec, error) { return nil, codec.ErrUnknownContentType } -func (h *httpClient) Init(opts ...options.Option) error { +func (h *httpClient) Init(opts ...client.Option) error { if len(opts) == 0 && h.init { return nil } @@ -332,11 +332,11 @@ func (h *httpClient) Options() client.Options { return h.opts } -func (h *httpClient) NewRequest(service, method string, req interface{}, opts ...options.Option) client.Request { +func (h *httpClient) NewRequest(service, method string, req interface{}, opts ...client.RequestOption) client.Request { return newHTTPRequest(service, method, req, h.opts.ContentType, opts...) } -func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...options.Option) error { +func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { // make a copy of call opts callOpts := h.opts.CallOptions for _, opt := range opts { @@ -353,7 +353,8 @@ func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface } else { // got a deadline so no need to setup context // but we need to set the timeout we pass along - if err := options.Set(&callOpts, time.Until(d), ".RequestTimeout"); err != nil { + o := options.NewOption("RequestTimeout")(time.Until(d)) + if err := options.Apply(&callOpts, o); err != nil { return errors.New("go.micro.client", fmt.Sprintf("%v", err.Error()), 400) } } @@ -469,7 +470,7 @@ func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface return gerr } -func (h *httpClient) Stream(ctx context.Context, req client.Request, opts ...options.Option) (client.Stream, error) { +func (h *httpClient) Stream(ctx context.Context, req client.Request, opts ...client.CallOption) (client.Stream, error) { var err error // make a copy of call opts @@ -488,7 +489,8 @@ func (h *httpClient) Stream(ctx context.Context, req client.Request, opts ...opt } else { // got a deadline so no need to setup context // but we need to set the timeout we pass along - if err = options.Set(&callOpts, time.Until(d), ".StreamTimeout"); err != nil { + o := options.NewOption("StreamTimeout")(time.Until(d)) + if err := options.Apply(&callOpts, o); err != nil { return nil, errors.New("go.micro.client", fmt.Sprintf("%v", err.Error()), 400) } } @@ -618,7 +620,7 @@ func (h *httpClient) Name() string { return h.opts.Name } -func NewClient(opts ...options.Option) client.Client { +func NewClient(opts ...client.Option) client.Client { options := client.NewOptions(opts...) if len(options.ContentType) == 0 { @@ -666,7 +668,6 @@ func NewClient(opts ...options.Option) client.Client { } rc.httpcli = &http.Client{Transport: tr} } - c := client.Client(rc) - return c + return rc } diff --git a/options.go b/options.go index 03066e8..d860643 100644 --- a/options.go +++ b/options.go @@ -1,6 +1,7 @@ package http import ( + "go.unistack.org/micro/v4/client" "net" "net/http" @@ -30,6 +31,9 @@ type poolMaxStreams struct{} // PoolMaxStreams maximum streams on a connectioin func PoolMaxStreams(n int) options.Option { + return func(i interface{}) error { + + } return options.ContextOption(poolMaxStreams{}, n) } @@ -73,8 +77,8 @@ func HTTPDialer(d *net.Dialer) options.Option { type methodKey struct{} // Method pass method option to client Call -func Method(m string) options.Option { - return options.ContextOption(methodKey{}, m) +func Method(m string) client.CallOptions { + return options.Context(methodKey{}, m) } type pathKey struct{} diff --git a/request.go b/request.go index 47f3512..0622422 100644 --- a/request.go +++ b/request.go @@ -3,7 +3,6 @@ package http import ( "go.unistack.org/micro/v4/client" "go.unistack.org/micro/v4/codec" - "go.unistack.org/micro/v4/options" ) type httpRequest struct { @@ -14,7 +13,7 @@ type httpRequest struct { opts client.RequestOptions } -func newHTTPRequest(service, method string, request interface{}, contentType string, opts ...options.Option) client.Request { +func newHTTPRequest(service, method string, request interface{}, contentType string, opts ...client.RequestOption) client.Request { options := client.NewRequestOptions(opts...) if len(options.ContentType) == 0 { options.ContentType = contentType