package obtencionCodigo import ( "bytes" "daemonService/internal/models/obtencionCodigos" "fmt" "io" "log" "net/http" "time" ) func CodigoEnviarSOAPRequest(s obtencionCodigos.CuisServiceModel, soapReq string) (*http.Response, []byte, error) { var resp *http.Response var bodyBytes []byte var lastErr error backoff := time.Second for i := 0; i < s.SOAPRetries; i++ { if i > 0 { log.Printf("Reintento %d después de %v debido a: %v", i, backoff, lastErr) time.Sleep(backoff) backoff *= 2 } req, err := http.NewRequest("POST", s.SOAPEndpoint, bytes.NewBufferString(soapReq)) if err != nil { lastErr = fmt.Errorf("error creando la solicitud: %w", err) continue } // Cabeceras SOAP comunes req.Header.Set("Content-Type", "text/xml; charset=utf-8") req.Header.Set("SOAPAction", "\"\"") //req.Header.Set("apikey", s.APIKey) req.Header.Set(s.TokenKey, s.TokenValue) // Crea un transporte que ignore la configuración de proxy transport := &http.Transport{ Proxy: nil, // Esto desactiva el uso de proxy } client := &http.Client{ Transport: transport, Timeout: 30 * time.Second, } log.Printf("Enviando solicitud a: %s", s.SOAPEndpoint) resp, err = client.Do(req) if err != nil { lastErr = fmt.Errorf("error enviando la solicitud: %w", err) continue } // El resto del código sigue igual... if resp.StatusCode != http.StatusOK { bodyBytes, _ = io.ReadAll(resp.Body) resp.Body.Close() lastErr = fmt.Errorf("respuesta no válida, código: %d, cuerpo: %s", resp.StatusCode, string(bodyBytes)) continue } bodyBytes, err = io.ReadAll(resp.Body) resp.Body.Close() if err != nil { lastErr = fmt.Errorf("error leyendo el cuerpo de la respuesta: %w", err) continue } return resp, bodyBytes, nil } return nil, nil, fmt.Errorf("fallo después de %d reintentos: %v", s.SOAPRetries, lastErr) } //func CodigoEnviarSOAPRequest(s obtencionCodigos.CuisServiceModel, soapReq string) (*http.Response, []byte, error) { // var resp *http.Response // var bodyBytes []byte // var lastErr error // // backoff := time.Second // for i := 0; i < s.SOAPRetries; i++ { // if i > 0 { // log.Printf("Reintento %d después de %v debido a: %v", i, backoff, lastErr) // time.Sleep(backoff) // backoff *= 2 // } // // req, err := http.NewRequest("POST", s.SOAPEndpoint, bytes.NewBufferString(soapReq)) // if err != nil { // lastErr = fmt.Errorf("error creando la solicitud: %w", err) // continue // } // // // Cabeceras SOAP comunes // req.Header.Set("Content-Type", "text/xml; charset=utf-8") // req.Header.Set("SOAPAction", "\"\"") // Agrega SOAPAction si es necesario // req.Header.Set("apikey", s.APIKey) // // // Opcional: imprime la solicitud para depuración // log.Printf("Enviando solicitud a: %s", s.SOAPEndpoint) // // client := &http.Client{Timeout: 30 * time.Second} // resp, err = client.Do(req) // if err != nil { // lastErr = fmt.Errorf("error enviando la solicitud: %w", err) // continue // } // // // Verifica el código de estado // if resp.StatusCode != http.StatusOK { // bodyBytes, _ = io.ReadAll(resp.Body) // resp.Body.Close() // lastErr = fmt.Errorf("respuesta no válida, código: %d, cuerpo: %s", // resp.StatusCode, string(bodyBytes)) // continue // } // // bodyBytes, err = io.ReadAll(resp.Body) // resp.Body.Close() // Siempre cerrar el cuerpo // if err != nil { // lastErr = fmt.Errorf("error leyendo el cuerpo de la respuesta: %w", err) // continue // } // // // Solicitud exitosa // return resp, bodyBytes, nil // } // // return nil, nil, fmt.Errorf("fallo después de %d reintentos: %v", s.SOAPRetries, lastErr) //} //func CodigoEnviarSOAPRequest(s obtencionCodigos.CuisServiceModel, soapReq string) (*http.Response, []byte, error) { // var resp *http.Response // var bodyBytes []byte // var err error // // backoff := time.Second // for i := 0; i < s.SOAPRetries; i++ { // if i > 0 { // time.Sleep(backoff) // backoff *= 2 // } // // req, err := http.NewRequest("POST", s.SOAPEndpoint, bytes.NewBufferString(soapReq)) // if err != nil { // continue // } // // req.Header.Set("Content-Type", "text/xml; charset=utf-8") // req.Header.Set("apikey", s.APIKey) // // client := &http.Client{Timeout: 30 * time.Second} // resp, err = client.Do(req) // if err != nil || resp.StatusCode != http.StatusOK { // continue // } // // bodyBytes, err = io.ReadAll(resp.Body) // if err != nil { // resp.Body.Close() // continue // } // // return resp, bodyBytes, nil // } // // return nil, nil, fmt.Errorf("fallo después de %d reintentos: %v", s.SOAPRetries, err) //}