diff --git a/go.mod b/go.mod index 9941236..6879b39 100644 --- a/go.mod +++ b/go.mod @@ -1,15 +1,19 @@ -module go.unistack.org/micro-client-http/v3 +module go.unistack.org/micro-client-http/v4 -go 1.22 +go 1.22.0 -toolchain go1.23.1 - -require go.unistack.org/micro/v3 v3.10.97 +require go.unistack.org/micro/v4 v4.1.2 require ( - go.unistack.org/micro-proto/v3 v3.4.1 // indirect - golang.org/x/sys v0.26.0 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 // indirect - google.golang.org/grpc v1.67.1 // indirect - google.golang.org/protobuf v1.35.1 // indirect + 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.30.0 // indirect + golang.org/x/text v0.22.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 6b3bcb8..a4045cc 100644 --- a/go.sum +++ b/go.sum @@ -1,39 +1,43 @@ +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= -go.unistack.org/micro-proto/v3 v3.4.1 h1:UTjLSRz2YZuaHk9iSlVqqsA50JQNAEK2ZFboGqtEa9Q= -go.unistack.org/micro-proto/v3 v3.4.1/go.mod h1:okx/cnOhzuCX0ggl/vToatbCupi0O44diiiLLsZ93Zo= -go.unistack.org/micro/v3 v3.10.69 h1:V4g9LqUhzGab73U2aevnjtffCdJqGTuMfWY7fy4qGwI= -go.unistack.org/micro/v3 v3.10.69/go.mod h1:erMgt3Bl7vQQ0e9UpQyR5NlLiZ9pKeEJ9+1tfYFaqUg= -go.unistack.org/micro/v3 v3.10.88 h1:MxlzP+77Y6Kphb3lzHxROL4XfE/WdCQMQpnPv4D9Z8U= -go.unistack.org/micro/v3 v3.10.88/go.mod h1:erMgt3Bl7vQQ0e9UpQyR5NlLiZ9pKeEJ9+1tfYFaqUg= -go.unistack.org/micro/v3 v3.10.91 h1:vuJY4tXwpqimwIkEJ3TozMYNVQQs+C5QMlQWPgSY/YM= -go.unistack.org/micro/v3 v3.10.91/go.mod h1:erMgt3Bl7vQQ0e9UpQyR5NlLiZ9pKeEJ9+1tfYFaqUg= -go.unistack.org/micro/v3 v3.10.97 h1:8l7fv+i06/PjPrBBhRC/ZQkWGIOuHPg3jJN0vktYE78= -go.unistack.org/micro/v3 v3.10.97/go.mod h1:YzMldzHN9Ei+zy5t/Psu7RUWDZwUfrNYiStSQtTz90g= -golang.org/x/net v0.21.0 h1:AQyQV4dYCvJ7vGmJyKki9+PBdyvhkSd8EIx/qb0AYv4= -golang.org/x/sys v0.19.0 h1:q5f1RH2jigJ1MoAWp2KTp3gm5zAGFUTarQZ5U386+4o= -golang.org/x/sys v0.19.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.25.0 h1:r+8e+loiHxRqhXVl6ML1nO3l1+oFoWbnlu2Ehimmi34= -golang.org/x/sys v0.25.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.26.0 h1:KHjCJyddX0LoSTb3J+vWpupP9p0oznkqVk/IfjymZbo= -golang.org/x/sys v0.26.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/text v0.14.0 h1:ScX5w1eTa3QqT8oi6+ziP7dTV1S2+ALU0bI+0zXKWiQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be h1:LG9vZxsWGOmUKieR8wPAUR3u3MpnYFQZROPIMaXh7/A= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240415180920-8c6c420018be/go.mod h1:WtryC6hu0hhx87FDGxWCDptyssuo68sk10vYjF+T9fY= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1 h1:pPJltXNxVzT4pK9yD8vR9X75DaWYYmLGMsEvBfFQZzQ= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240903143218-8af14fe29dc1/go.mod h1:UqMtugtsSgubUsoxbuAoiCXvqvErP7Gf0so0mK9tHxU= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9 h1:QCqS/PdaHTSWGvupk2F/ehwHtGc0/GYkT+3GAcR1CCc= -google.golang.org/genproto/googleapis/rpc v0.0.0-20241007155032-5fefd90f89a9/go.mod h1:GX3210XPVPUjJbTUbvwI8f2IpZDMZuPJWDzDuebbviI= -google.golang.org/grpc v1.63.2 h1:MUeiw1B2maTVZthpU5xvASfTh3LDbxHd6IJ6QQVU+xM= -google.golang.org/grpc v1.63.2/go.mod h1:WAX/8DgncnokcFUldAxq7GeB5DXHDbMF+lLvDomNkRA= -google.golang.org/grpc v1.66.2 h1:3QdXkuq3Bkh7w+ywLdLvM56cmGvQHUMZpiCzt6Rqaoo= -google.golang.org/grpc v1.66.2/go.mod h1:s3/l6xSSCURdVfAnL+TqCNMyTDAGN6+lZeVxnZR128Y= -google.golang.org/grpc v1.67.0 h1:IdH9y6PF5MPSdAntIcpjQ+tXO41pcQsfZV2RxtQgVcw= -google.golang.org/grpc v1.67.0/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/grpc v1.67.1 h1:zWnc1Vrcno+lHZCOofnIMvycFcc0QRGIzm9dhnDX68E= -google.golang.org/grpc v1.67.1/go.mod h1:1gLDyUQU7CTLJI90u3nXZ9ekeghjeM7pTDZlqFNg2AA= -google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= -google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= -google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg= -google.golang.org/protobuf v1.34.2/go.mod h1:qYOHts0dSfpeUzUFpOMr/WGzszTmLH+DiWniOlNbLDw= -google.golang.org/protobuf v1.35.1 h1:m3LfL6/Ca+fqnjnlqQXNpFPABW1UD7mjh8KO2mKFytA= -google.golang.org/protobuf v1.35.1/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= +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.2 h1:9SOlPYyPNNFpg1A7BsvhDyQm3gysLH1AhWbDCp1hyoY= +go.unistack.org/micro/v4 v4.1.2/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.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +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 11fa784..0531a80 100644 --- a/http.go +++ b/http.go @@ -10,23 +10,21 @@ import ( "net" "net/http" "net/url" - "os" "strconv" "strings" "sync" "time" - "go.unistack.org/micro/v3/broker" - "go.unistack.org/micro/v3/client" - "go.unistack.org/micro/v3/codec" - "go.unistack.org/micro/v3/errors" - "go.unistack.org/micro/v3/logger" - "go.unistack.org/micro/v3/metadata" - "go.unistack.org/micro/v3/options" - "go.unistack.org/micro/v3/selector" - "go.unistack.org/micro/v3/semconv" - "go.unistack.org/micro/v3/tracer" - rutil "go.unistack.org/micro/v3/util/reflect" + "go.unistack.org/micro/v4/client" + "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/errors" + "go.unistack.org/micro/v4/logger" + "go.unistack.org/micro/v4/metadata" + "go.unistack.org/micro/v4/options" + "go.unistack.org/micro/v4/selector" + "go.unistack.org/micro/v4/semconv" + "go.unistack.org/micro/v4/tracer" + rutil "go.unistack.org/micro/v4/util/reflect" ) var DefaultContentType = "application/json" @@ -39,12 +37,10 @@ func filterLabel(r []router.Route) []router.Route { */ type httpClient struct { - funcPublish client.FuncPublish - funcBatchPublish client.FuncBatchPublish - funcCall client.FuncCall - funcStream client.FuncStream - httpcli *http.Client - opts client.Options + funcCall client.FuncCall + funcStream client.FuncStream + httpcli *http.Client + opts client.Options sync.RWMutex } @@ -147,7 +143,7 @@ func newRequest(ctx context.Context, log logger.Logger, addr string, req client. if opts.Context != nil { if md, ok := opts.Context.Value(metadataKey{}).(metadata.Metadata); ok { for k, v := range md { - header.Set(k, v) + header[k] = append(header[k], v...) } } } @@ -156,13 +152,13 @@ func newRequest(ctx context.Context, log logger.Logger, addr string, req client. } if opts.RequestMetadata != nil { for k, v := range opts.RequestMetadata { - header.Set(k, v) + header[k] = append(header[k], v...) } } if md, ok := metadata.FromOutgoingContext(ctx); ok { for k, v := range md { - header.Set(k, v) + header[k] = append(header[k], v...) } } @@ -320,8 +316,6 @@ func (c *httpClient) Init(opts ...client.Option) error { c.funcCall = c.fnCall c.funcStream = c.fnStream - c.funcPublish = c.fnPublish - c.funcBatchPublish = c.fnBatchPublish c.opts.Hooks.EachPrev(func(hook options.Hook) { switch h := hook.(type) { @@ -329,10 +323,6 @@ func (c *httpClient) Init(opts ...client.Option) error { c.funcCall = h(c.funcCall) case client.HookStream: c.funcStream = h(c.funcStream) - case client.HookPublish: - c.funcPublish = h(c.funcPublish) - case client.HookBatchPublish: - c.funcBatchPublish = h(c.funcBatchPublish) } }) @@ -343,10 +333,6 @@ func (c *httpClient) Options() client.Options { return c.opts } -func (c *httpClient) NewMessage(topic string, msg interface{}, opts ...client.MessageOption) client.Message { - return newHTTPMessage(topic, msg, c.opts.ContentType, opts...) -} - func (c *httpClient) NewRequest(service, method string, req interface{}, opts ...client.RequestOption) client.Request { return newHTTPRequest(service, method, req, c.opts.ContentType, opts...) } @@ -668,86 +654,6 @@ func (c *httpClient) fnStream(ctx context.Context, req client.Request, opts ...c return nil, grr } -func (c *httpClient) BatchPublish(ctx context.Context, p []client.Message, opts ...client.PublishOption) error { - return c.funcBatchPublish(ctx, p, opts...) -} - -func (c *httpClient) fnBatchPublish(ctx context.Context, p []client.Message, opts ...client.PublishOption) error { - return c.publish(ctx, p, opts...) -} - -func (c *httpClient) Publish(ctx context.Context, p client.Message, opts ...client.PublishOption) error { - return c.funcPublish(ctx, p, opts...) -} - -func (c *httpClient) fnPublish(ctx context.Context, p client.Message, opts ...client.PublishOption) error { - return c.publish(ctx, []client.Message{p}, opts...) -} - -func (c *httpClient) publish(ctx context.Context, ps []client.Message, opts ...client.PublishOption) error { - var body []byte - - options := client.NewPublishOptions(opts...) - - // get proxy - exchange := "" - if v, ok := os.LookupEnv("MICRO_PROXY"); ok { - exchange = v - } - // get the exchange - if len(options.Exchange) > 0 { - exchange = options.Exchange - } - - omd, ok := metadata.FromOutgoingContext(ctx) - if !ok { - omd = metadata.New(2) - } - - msgs := make([]*broker.Message, 0, len(ps)) - - for _, p := range ps { - md := metadata.Copy(omd) - - topic := p.Topic() - if len(exchange) > 0 { - topic = exchange - } - md.Set(metadata.HeaderTopic, topic) - iter := p.Metadata().Iterator() - var k, v string - for iter.Next(&k, &v) { - md.Set(k, v) - } - - md[metadata.HeaderContentType] = p.ContentType() - - // passed in raw data - if d, ok := p.Payload().(*codec.Frame); ok { - body = d.Data - } else { - // use codec for payload - cf, err := c.newCodec(p.ContentType()) - if err != nil { - return errors.InternalServerError("go.micro.client", "%+v", err) - } - // set the body - b, err := cf.Marshal(p.Payload()) - if err != nil { - return errors.InternalServerError("go.micro.client", "%+v", err) - } - body = b - } - - msgs = append(msgs, &broker.Message{Header: md, Body: body}) - } - - return c.opts.Broker.BatchPublish(ctx, msgs, - broker.PublishContext(ctx), - broker.PublishBodyOnly(options.BodyOnly), - ) -} - func (c *httpClient) String() string { return "http" } @@ -807,8 +713,6 @@ func NewClient(opts ...client.Option) *httpClient { c.funcCall = c.fnCall c.funcStream = c.fnStream - c.funcPublish = c.fnPublish - c.funcBatchPublish = c.fnBatchPublish return c } diff --git a/message.go b/message.go deleted file mode 100644 index 5b7f95a..0000000 --- a/message.go +++ /dev/null @@ -1,44 +0,0 @@ -package http - -import ( - "go.unistack.org/micro/v3/client" - "go.unistack.org/micro/v3/metadata" -) - -type httpMessage struct { - payload interface{} - topic string - contentType string - opts client.MessageOptions -} - -func newHTTPMessage(topic string, payload interface{}, contentType string, opts ...client.MessageOption) client.Message { - options := client.NewMessageOptions(opts...) - - if len(options.ContentType) > 0 { - contentType = options.ContentType - } - - return &httpMessage{ - payload: payload, - topic: topic, - contentType: contentType, - opts: options, - } -} - -func (h *httpMessage) ContentType() string { - return h.contentType -} - -func (h *httpMessage) Topic() string { - return h.topic -} - -func (h *httpMessage) Payload() interface{} { - return h.payload -} - -func (h *httpMessage) Metadata() metadata.Metadata { - return h.opts.Metadata -} diff --git a/options.go b/options.go index 0e24695..3590a05 100644 --- a/options.go +++ b/options.go @@ -4,8 +4,8 @@ import ( "net" "net/http" - "go.unistack.org/micro/v3/client" - "go.unistack.org/micro/v3/metadata" + "go.unistack.org/micro/v4/client" + "go.unistack.org/micro/v4/metadata" ) var ( diff --git a/request.go b/request.go index 00c23a4..0622422 100644 --- a/request.go +++ b/request.go @@ -1,8 +1,8 @@ package http import ( - "go.unistack.org/micro/v3/client" - "go.unistack.org/micro/v3/codec" + "go.unistack.org/micro/v4/client" + "go.unistack.org/micro/v4/codec" ) type httpRequest struct { diff --git a/stream.go b/stream.go index 3ba9cec..9f30103 100644 --- a/stream.go +++ b/stream.go @@ -9,10 +9,10 @@ import ( "net/http" "sync" - "go.unistack.org/micro/v3/client" - "go.unistack.org/micro/v3/codec" - "go.unistack.org/micro/v3/errors" - "go.unistack.org/micro/v3/logger" + "go.unistack.org/micro/v4/client" + "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/errors" + "go.unistack.org/micro/v4/logger" ) // Implements the streamer interface diff --git a/util.go b/util.go index ea8778b..c21a59b 100644 --- a/util.go +++ b/util.go @@ -10,11 +10,11 @@ import ( "strings" "sync" - "go.unistack.org/micro/v3/client" - "go.unistack.org/micro/v3/errors" - "go.unistack.org/micro/v3/logger" - "go.unistack.org/micro/v3/metadata" - rutil "go.unistack.org/micro/v3/util/reflect" + "go.unistack.org/micro/v4/client" + "go.unistack.org/micro/v4/errors" + "go.unistack.org/micro/v4/logger" + "go.unistack.org/micro/v4/metadata" + rutil "go.unistack.org/micro/v4/util/reflect" ) var (