package http import ( "context" "fmt" "io/ioutil" "net/http" "time" "go.uber.org/zap" "furtuna-be/internal/common/logger" ) type HttpClient struct { Client *http.Client } func NewHttpClient() *HttpClient { return &HttpClient{ Client: &http.Client{}, } } func (c *HttpClient) Do(ctx context.Context, req *http.Request) (int, []byte, error) { start := time.Now() logger.ContextLogger(ctx).Info(fmt.Sprintf("Sending request: %v %v", req.Method, req.URL)) resp, err := c.Client.Do(req) if err != nil { logger.ContextLogger(ctx).Error(" Failed to send request:", zap.Error(err)) return 0, nil, err } logger.ContextLogger(ctx).Info(fmt.Sprintf("Received Response: : %v", resp.StatusCode)) defer resp.Body.Close() body, err := ioutil.ReadAll(resp.Body) if err != nil { logger.ContextLogger(ctx).Error(" Failed to read response:", zap.Error(err)) return 0, nil, err } logger.ContextLogger(ctx).Info(fmt.Sprintf("Latency : %v", time.Since(start))) return resp.StatusCode, body, nil }