Add transport dial timeout
This commit is contained in:
		| @@ -20,6 +20,7 @@ type Options struct { | ||||
| 	Wrappers       []Wrapper | ||||
| 	Retries        int | ||||
| 	RequestTimeout time.Duration | ||||
| 	DialTimeout    time.Duration | ||||
|  | ||||
| 	// Other options to be used by client implementations | ||||
| 	Options map[string]string | ||||
| @@ -49,6 +50,7 @@ func newOptions(options ...Option) Options { | ||||
| 		Codecs:         make(map[string]codec.NewCodec), | ||||
| 		Retries:        DefaultRetries, | ||||
| 		RequestTimeout: DefaultRequestTimeout, | ||||
| 		DialTimeout:    transport.DefaultDialTimeout, | ||||
| 	} | ||||
|  | ||||
| 	for _, o := range options { | ||||
| @@ -145,6 +147,13 @@ func RequestTimeout(d time.Duration) Option { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Transport dial timeout | ||||
| func DialTimeout(d time.Duration) Option { | ||||
| 	return func(o *Options) { | ||||
| 		o.DialTimeout = d | ||||
| 	} | ||||
| } | ||||
|  | ||||
| // Call Options | ||||
|  | ||||
| func WithSelectOption(so selector.SelectOption) CallOption { | ||||
|   | ||||
| @@ -70,7 +70,7 @@ func (r *rpcClient) call(ctx context.Context, address string, request Request, r | ||||
| 		return errors.InternalServerError("go.micro.client", err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	c, err := r.opts.Transport.Dial(address) | ||||
| 	c, err := r.opts.Transport.Dial(address, transport.WithTimeout(r.opts.DialTimeout)) | ||||
| 	if err != nil { | ||||
| 		return errors.InternalServerError("go.micro.client", fmt.Sprintf("Error sending request: %v", err)) | ||||
| 	} | ||||
| @@ -116,7 +116,7 @@ func (r *rpcClient) stream(ctx context.Context, address string, req Request) (St | ||||
| 		return nil, errors.InternalServerError("go.micro.client", err.Error()) | ||||
| 	} | ||||
|  | ||||
| 	c, err := r.opts.Transport.Dial(address, transport.WithStream()) | ||||
| 	c, err := r.opts.Transport.Dial(address, transport.WithStream(), transport.WithTimeout(r.opts.DialTimeout)) | ||||
| 	if err != nil { | ||||
| 		return nil, errors.InternalServerError("go.micro.client", fmt.Sprintf("Error sending request: %v", err)) | ||||
| 	} | ||||
|   | ||||
| @@ -276,17 +276,19 @@ func (h *httpTransportListener) Accept(fn func(Socket)) error { | ||||
| } | ||||
|  | ||||
| func (h *httpTransport) Dial(addr string, opts ...DialOption) (Client, error) { | ||||
| 	conn, err := net.Dial("tcp", addr) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	dopts := DialOptions{ | ||||
| 		Timeout: DefaultDialTimeout, | ||||
| 	} | ||||
|  | ||||
| 	var dopts DialOptions | ||||
|  | ||||
| 	for _, opt := range opts { | ||||
| 		opt(&dopts) | ||||
| 	} | ||||
|  | ||||
| 	conn, err := net.DialTimeout("tcp", addr, dopts.Timeout) | ||||
| 	if err != nil { | ||||
| 		return nil, err | ||||
| 	} | ||||
|  | ||||
| 	return &httpTransportClient{ | ||||
| 		ht:       h, | ||||
| 		addr:     addr, | ||||
|   | ||||
| @@ -1,5 +1,9 @@ | ||||
| package transport | ||||
|  | ||||
| import ( | ||||
| 	"time" | ||||
| ) | ||||
|  | ||||
| type Message struct { | ||||
| 	Header map[string]string | ||||
| 	Body   []byte | ||||
| @@ -36,6 +40,7 @@ type Options struct { | ||||
|  | ||||
| type DialOptions struct { | ||||
| 	Stream  bool | ||||
| 	Timeout time.Duration | ||||
|  | ||||
| 	// Other options to be used by broker implementations | ||||
| 	Options map[string]string | ||||
| @@ -47,6 +52,8 @@ type DialOption func(*DialOptions) | ||||
|  | ||||
| var ( | ||||
| 	DefaultTransport Transport = newHttpTransport([]string{}) | ||||
|  | ||||
| 	DefaultDialTimeout = time.Second * 5 | ||||
| ) | ||||
|  | ||||
| func WithStream() DialOption { | ||||
| @@ -55,6 +62,12 @@ func WithStream() DialOption { | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func WithTimeout(d time.Duration) DialOption { | ||||
| 	return func(o *DialOptions) { | ||||
| 		o.Timeout = d | ||||
| 	} | ||||
| } | ||||
|  | ||||
| func NewTransport(addrs []string, opt ...Option) Transport { | ||||
| 	return newHttpTransport(addrs, opt...) | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user