diff --git a/go.mod b/go.mod index 3393dc1..62bc45c 100644 --- a/go.mod +++ b/go.mod @@ -2,4 +2,4 @@ module go.unistack.org/micro-client-http/v4 go 1.19 -require go.unistack.org/micro/v4 v4.0.1 +require go.unistack.org/micro/v4 v4.0.6 diff --git a/go.sum b/go.sum index ff93cdc..979a288 100644 --- a/go.sum +++ b/go.sum @@ -1,2 +1,4 @@ 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= diff --git a/http.go b/http.go index 7cfa677..b5f2ebf 100644 --- a/http.go +++ b/http.go @@ -19,6 +19,7 @@ import ( "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" rutil "go.unistack.org/micro/v4/util/reflect" ) @@ -303,7 +304,7 @@ func (h *httpClient) newCodec(ct string) (codec.Codec, error) { return nil, codec.ErrUnknownContentType } -func (h *httpClient) Init(opts ...client.Option) error { +func (h *httpClient) Init(opts ...options.Option) error { if len(opts) == 0 && h.init { return nil } @@ -323,9 +324,6 @@ func (h *httpClient) Init(opts ...client.Option) error { if err := h.opts.Meter.Init(); err != nil { return err } - if err := h.opts.Transport.Init(); err != nil { - return err - } return nil } @@ -334,11 +332,11 @@ func (h *httpClient) Options() client.Options { return h.opts } -func (h *httpClient) NewRequest(service, method string, req interface{}, opts ...client.RequestOption) client.Request { +func (h *httpClient) NewRequest(service, method string, req interface{}, opts ...options.Option) client.Request { return newHTTPRequest(service, method, req, h.opts.ContentType, opts...) } -func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...client.CallOption) error { +func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface{}, opts ...options.Option) error { // make a copy of call opts callOpts := h.opts.CallOptions for _, opt := range opts { @@ -355,8 +353,9 @@ 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 - opt := client.WithRequestTimeout(time.Until(d)) - opt(&callOpts) + if err := options.Set(&callOpts, time.Until(d), ".RequestTimeout"); err != nil { + return errors.New("go.micro.client", fmt.Sprintf("%v", err.Error()), 400) + } } // should we noop right here? @@ -370,9 +369,9 @@ func (h *httpClient) Call(ctx context.Context, req client.Request, rsp interface hcall := h.call // wrap the call in reverse - for i := len(callOpts.CallWrappers); i > 0; i-- { - hcall = callOpts.CallWrappers[i-1](hcall) - } + //for i := len(callOpts.CallWrappers); i > 0; i-- { + // hcall = callOpts.CallWrappers[i-1](hcall) + //} // use the router passed as a call option, or fallback to the rpc clients router if callOpts.Router == nil { @@ -470,7 +469,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 ...client.CallOption) (client.Stream, error) { +func (h *httpClient) Stream(ctx context.Context, req client.Request, opts ...options.Option) (client.Stream, error) { var err error // make a copy of call opts @@ -489,8 +488,9 @@ func (h *httpClient) Stream(ctx context.Context, req client.Request, opts ...cli } else { // got a deadline so no need to setup context // but we need to set the timeout we pass along - o := client.WithStreamTimeout(time.Until(d)) - o(&callOpts) + if err = options.Set(&callOpts, time.Until(d), ".StreamTimeout"); err != nil { + return nil, errors.New("go.micro.client", fmt.Sprintf("%v", err.Error()), 400) + } } // should we noop right here? @@ -618,7 +618,7 @@ func (h *httpClient) Name() string { return h.opts.Name } -func NewClient(opts ...client.Option) client.Client { +func NewClient(opts ...options.Option) client.Client { options := client.NewOptions(opts...) if len(options.ContentType) == 0 { @@ -668,10 +668,5 @@ func NewClient(opts ...client.Option) client.Client { } c := client.Client(rc) - // wrap in reverse - for i := len(options.Wrappers); i > 0; i-- { - c = options.Wrappers[i-1](c) - } - return c } diff --git a/options.go b/options.go index 3590a05..03066e8 100644 --- a/options.go +++ b/options.go @@ -4,8 +4,8 @@ import ( "net" "net/http" - "go.unistack.org/micro/v4/client" "go.unistack.org/micro/v4/metadata" + "go.unistack.org/micro/v4/options" ) var ( @@ -29,98 +29,98 @@ var ( type poolMaxStreams struct{} // PoolMaxStreams maximum streams on a connectioin -func PoolMaxStreams(n int) client.Option { - return client.SetOption(poolMaxStreams{}, n) +func PoolMaxStreams(n int) options.Option { + return options.ContextOption(poolMaxStreams{}, n) } type poolMaxIdle struct{} // PoolMaxIdle maximum idle conns of a pool -func PoolMaxIdle(d int) client.Option { - return client.SetOption(poolMaxIdle{}, d) +func PoolMaxIdle(d int) options.Option { + return options.ContextOption(poolMaxIdle{}, d) } type maxRecvMsgSizeKey struct{} // MaxRecvMsgSize set the maximum size of message that client can receive. -func MaxRecvMsgSize(s int) client.Option { - return client.SetOption(maxRecvMsgSizeKey{}, s) +func MaxRecvMsgSize(s int) options.Option { + return options.ContextOption(maxRecvMsgSizeKey{}, s) } type maxSendMsgSizeKey struct{} // MaxSendMsgSize set the maximum size of message that client can send. -func MaxSendMsgSize(s int) client.Option { - return client.SetOption(maxSendMsgSizeKey{}, s) +func MaxSendMsgSize(s int) options.Option { + return options.ContextOption(maxSendMsgSizeKey{}, s) } type httpClientKey struct{} // nolint: golint // HTTPClient pass http.Client option to client Call -func HTTPClient(c *http.Client) client.Option { - return client.SetOption(httpClientKey{}, c) +func HTTPClient(c *http.Client) options.Option { + return options.ContextOption(httpClientKey{}, c) } type httpDialerKey struct{} // nolint: golint // HTTPDialer pass net.Dialer option to client -func HTTPDialer(d *net.Dialer) client.Option { - return client.SetOption(httpDialerKey{}, d) +func HTTPDialer(d *net.Dialer) options.Option { + return options.ContextOption(httpDialerKey{}, d) } type methodKey struct{} // Method pass method option to client Call -func Method(m string) client.CallOption { - return client.SetCallOption(methodKey{}, m) +func Method(m string) options.Option { + return options.ContextOption(methodKey{}, m) } type pathKey struct{} // Path spcecifies path option to client Call -func Path(p string) client.CallOption { - return client.SetCallOption(pathKey{}, p) +func Path(p string) options.Option { + return options.ContextOption(pathKey{}, p) } type bodyKey struct{} // Body specifies body option to client Call -func Body(b string) client.CallOption { - return client.SetCallOption(bodyKey{}, b) +func Body(b string) options.Option { + return options.ContextOption(bodyKey{}, b) } type errorMapKey struct{} -func ErrorMap(m map[string]interface{}) client.CallOption { - return client.SetCallOption(errorMapKey{}, m) +func ErrorMap(m map[string]interface{}) options.Option { + return options.ContextOption(errorMapKey{}, m) } type structTagsKey struct{} // StructTags pass tags slice option to client Call -func StructTags(tags []string) client.CallOption { - return client.SetCallOption(structTagsKey{}, tags) +func StructTags(tags []string) options.Option { + return options.ContextOption(structTagsKey{}, tags) } type metadataKey struct{} // Metadata pass metadata to client Call -func Metadata(md metadata.Metadata) client.CallOption { - return client.SetCallOption(metadataKey{}, md) +func Metadata(md metadata.Metadata) options.Option { + return options.ContextOption(metadataKey{}, md) } type cookieKey struct{} // Cookie pass cookie to client Call -func Cookie(cookies ...string) client.CallOption { - return client.SetCallOption(cookieKey{}, cookies) +func Cookie(cookies ...string) options.Option { + return options.ContextOption(cookieKey{}, cookies) } type headerKey struct{} // Header pass cookie to client Call -func Header(headers ...string) client.CallOption { - return client.SetCallOption(headerKey{}, headers) +func Header(headers ...string) options.Option { + return options.ContextOption(headerKey{}, headers) } diff --git a/request.go b/request.go index 0622422..47f3512 100644 --- a/request.go +++ b/request.go @@ -3,6 +3,7 @@ package http import ( "go.unistack.org/micro/v4/client" "go.unistack.org/micro/v4/codec" + "go.unistack.org/micro/v4/options" ) type httpRequest struct { @@ -13,7 +14,7 @@ type httpRequest struct { opts client.RequestOptions } -func newHTTPRequest(service, method string, request interface{}, contentType string, opts ...client.RequestOption) client.Request { +func newHTTPRequest(service, method string, request interface{}, contentType string, opts ...options.Option) client.Request { options := client.NewRequestOptions(opts...) if len(options.ContentType) == 0 { options.ContentType = contentType