Skip to main content

HTTP Reverse Proxy


import (
"context"
"errors"
"net/http"
"net/http/httputil"

"github.com/gin-gonic/gin"
"github.com/hhk7734/zapx.go"
"go.uber.org/zap"
)

func RouteWithHTTP(scheme string, host string, path string) gin.HandlerFunc {
return func(c *gin.Context) {
rp := &httputil.ReverseProxy{
Director: func(r *http.Request) {
// 요청을 원하는 경로로 변경
r.URL.Scheme = scheme
r.URL.Host = host
r.Host = host
},
ErrorHandler: func(w http.ResponseWriter, r *http.Request, err error) {
logger := zapx.Ctx(r.Context())
switch {
case errors.Is(err, context.Canceled):
// 클라이언트가 요청을 취소한 경우 외에 에러가 발생하는 경우가 있는지 확인 필요
logger.Warn("request canceled")
default:
logger.Error("proxy error", zap.Error(err))
c.Status(http.StatusBadGateway)
}
},
}
rp.ServeHTTP(c.Writer, c.Request)
}
}