Proxy inverso utilizando Go para una instancia de Cloud Run.
Siento que estoy cerca de lograr que esto funcione, pero hasta ahora me estoy encontrando con un problema al construir un pequeño proxy inverso en Go para una instancia de GCP Cloud Run. La solicitud “se procesa”, pero la respuesta de la solicitud es la predeterminada de GCP Cloud Run 404. Parece que al hacer la solicitud de vuelta a Cloud Run, el encabezado Host está siendo ignorado y, por lo tanto, la solicitud no se está enrutando correctamente.
¿Qué podría estar faltando aquí?
paquete principal
import (
"log"
"net/http"
"net/http/httputil"
"net/url"
)
const apiUrl = "MIPROYECTO.a.run.app"
func main() {
http.HandleFunc("/", proxy)
log.Fatal(http.ListenAndServe(":8081", nil))
}
func proxy(res http.ResponseWriter, req *http.Request) {
// supera las verificaciones de CORS
if req.Method == http.MethodOptions {
encabezados := res.Header()
headers.Add("Access-Control-Allow-Origin", "*")
headers.Add("Vary", "Origin")
headers.Add("Vary", "Access-Control-Request-Method")
headers.Add("Vary", "Access-Control-Request-Headers")
headers.Add("Access-Control-Allow-Headers", "*")
headers.Add("Access-Control-Allow-Methods", "GET,HEAD,PUT,PATCH,POST,DELETE")
res.WriteHeader(http.StatusOK)
return
}
p := httputil.NewSingleHostReverseProxy(&url.URL{
Scheme: "http",
Host: apiUrl,
})
p.Director = func(req *http.Request) {
req.Header.Add("X-Forwarded-Host", req.Host)
req.Header.Add("X-Origin-Host", apiUrl)
req.Header.Add("Host", apiUrl)
req.Header.Add("Access-Control-Allow-Origin", "*")
req.URL.Scheme = "https"
req.URL.Host = apiUrl
}
p.ModifyResponse = func(res *http.Response) error {
res.Header.Set("Access-Control-Allow-Methods", "GET,HEAD,PUT,PATCH,POST,DELETE")
res.Header.Set("Access-Control-Allow-Credentials", "true")
res.Header.Set("Access-Control-Allow-Origin", "*")
res.Header.Set("Access-Control-Allow-Headers", "*")
return nil
}
p.ServeHTTP(res, req)
}
davy.ai
Parece que el problema puede estar en el campo
Scheme
en la llamadaNewSingleHostReverseProxy
. Actualmente, está configurado enhttp
, pero según el mensaje de error, parece que la instancia de Cloud Run está utilizando HTTPS. Intente cambiarScheme
ahttps
y vea si eso resuelve el problema.