@@ -577,7 +577,7 @@ func (c *Client) doSetAuth(ctx context.Context, req *http.Request) error {
577577 return nil
578578}
579579
580- func (c * Client ) doPre (req * http.Request ) (* http.Response , error ) {
580+ func (c * Client ) doMonitorPre (req * http.Request ) (* http.Response , error ) {
581581 for i := len (c .monitor ) - 1 ; i >= 0 ; i -- {
582582 if c .monitor [i ].pre != nil {
583583 resp , err := c .monitor [i ].pre (req )
@@ -589,7 +589,7 @@ func (c *Client) doPre(req *http.Request) (*http.Response, error) {
589589 return nil , nil
590590}
591591
592- func (c * Client ) doPost (req * http.Request , resp * http.Response , err error ) (* http.Response , error ) {
592+ func (c * Client ) doMonitorPost (req * http.Request , resp * http.Response , err error ) (* http.Response , error ) {
593593 for i := range c .monitor {
594594 if c .monitor [i ].post != nil {
595595 newResp := c .monitor [i ].post (req , resp , err )
@@ -615,7 +615,7 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
615615 req .Header = make (http.Header )
616616 }
617617
618- target , err := c .setReqTarget (req )
618+ targetForLog , err := c .setReqTarget (req )
619619 if err != nil {
620620 return nil , err
621621 }
@@ -626,16 +626,15 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
626626 return nil , err
627627 }
628628
629- if resp , err := c .doPre (req ); resp != nil || err != nil {
629+ if resp , err := c .doMonitorPre (req ); resp != nil || err != nil {
630630 return resp , err
631631 }
632632
633- target = c .setLoadBalanceTarget (req , target )
634633 req , spanStr , spanEndFunc := doSpan (req )
635634
636- resp , err := c .doLog (spanStr , req , target )
635+ resp , err := c .doLog (spanStr , req , targetForLog )
637636
638- resp , err = c .doPost (req , resp , err )
637+ resp , err = c .doMonitorPost (req , resp , err )
639638
640639 if spanEndFunc != nil {
641640 spanEndFunc ()
@@ -644,7 +643,12 @@ func (c *Client) Do(req *http.Request) (*http.Response, error) {
644643 return resp , err
645644}
646645
647- func (c * Client ) doWithRetry (req * http.Request , spanStr , target string ) (* http.Response , error ) {
646+ func (c * Client ) doWithRetry (req * http.Request , spanStr , targetForLog string ) (* http.Response , error ) {
647+ originalHost := req .URL .Hostname ()
648+ targetForLog = c .setLoadBalanceTarget (req , targetForLog , originalHost )
649+
650+ log .Debugf ("[%s] Sent req: %s %s" , spanStr , req .Method , targetForLog )
651+
648652 clonedBody := c .cloneBody (req )
649653 resp , err := c .do (req )
650654
@@ -653,22 +657,23 @@ func (c *Client) doWithRetry(req *http.Request, spanStr, target string) (*http.R
653657 _ = resp .Body .Close ()
654658 }
655659
660+ targetForLog = c .setLoadBalanceTarget (req , targetForLog , originalHost ) // Set target again
661+
656662 req .Body = clonedBody
657663 clonedBody = c .cloneBody (req )
658664
659665 time .Sleep (c .calcBackoff (retries ))
660- log .Debugf ("[%s] Send rty(%d): %s %s: err=%v" , spanStr , retries , req .Method , target , err )
666+ log .Debugf ("[%s] Send rty(%d): %s %s: err=%v" , spanStr , retries , req .Method , targetForLog , err )
661667 resp , err = c .do (req )
662668 }
663669
664670 return resp , err
665671}
666672
667- func (c * Client ) doLog (spanStr string , req * http.Request , target string ) (* http.Response , error ) {
668- log .Debugf ("[%s] Sent req: %s %s" , spanStr , req .Method , target )
669- resp , err := c .doWithRetry (req , spanStr , target )
673+ func (c * Client ) doLog (spanStr string , req * http.Request , targetForLog string ) (* http.Response , error ) {
674+ resp , err := c .doWithRetry (req , spanStr , targetForLog )
670675 if err != nil {
671- log .Debugf ("[%s] Fail req: %s %s" , spanStr , req .Method , target )
676+ log .Debugf ("[%s] Fail req: %s %s" , spanStr , req .Method , targetForLog )
672677 } else {
673678 log .Debugf ("[%s] Recv rsp: %s" , spanStr , resp .Status )
674679 }
@@ -1072,23 +1077,23 @@ var netLookupHost = func(ctx context.Context, host string) ([]string, error) {
10721077 return net .DefaultResolver .LookupHost (ctx , host )
10731078}
10741079
1075- func (c * Client ) setLoadBalanceTarget (req * http.Request , target string ) (targetOut string ) {
1080+ func (c * Client ) setLoadBalanceTarget (req * http.Request , target , originalHost string ) (targetOut string ) {
10761081 targetOut = target
10771082 if ! c .LoadBalanceRandom {
10781083 return
10791084 }
1080- if net .ParseIP (req . URL . Hostname () ) != nil {
1085+ if net .ParseIP (originalHost ) != nil {
10811086 log .Debugf ("Host %s is an IP address, not a hostname. Load balancing is not applied." , req .URL .Hostname ())
10821087 return // Do not apply load balancing if Host is an IP address.
10831088 }
10841089
1085- IPs , err := netLookupHost (req .Context (), req . URL . Hostname () )
1090+ IPs , err := netLookupHost (req .Context (), originalHost )
10861091 if err != nil {
1087- log .Debugf ("Failed to resolve host %s: %v" , req . URL . Hostname () , err )
1092+ log .Debugf ("Failed to resolve host %s: %v" , originalHost , err )
10881093 return
10891094 }
10901095 if len (IPs ) > 1 {
1091- log .Debugf ("Multiple IPs for %s: %v" , req . URL . Hostname () , IPs )
1096+ log .Debugf ("Multiple IPs for %s: %v" , originalHost , IPs )
10921097 if req .Host == "" { // MonitorPre maybe already change req.URL.Host. And set req.Host to the original Host.
10931098 req .Host = req .URL .Host // Set Host header to original Host. This is used for TLS SNI and other purposes.
10941099 }
@@ -1103,9 +1108,9 @@ func chooseIPFromList(IPs []string) string {
11031108 return IPs [index ] // Return the randomly chosen IP
11041109}
11051110
1106- // EnableLoadBalanceRandom enables load balancing by randomly choosing one of the IP addresses
1107- // returned by net.LookupHost for the target hostname.
1108- func (c * Client ) EnableLoadBalanceRandom () * Client {
1109- c .LoadBalanceRandom = true
1111+ // EnableLoadBalanceRandom enables or disables load balancing by random IP address.
1112+ // If enabled, the client will resolve the hostname and choose a random IP address from the list
1113+ func (c * Client ) EnableLoadBalanceRandom (enable bool ) * Client {
1114+ c .LoadBalanceRandom = enable
11101115 return c
11111116}
0 commit comments