Я пытаюсь создать обратный прокси-сервер, который принимает все запросы и перенаправляет их на целевой URL-адрес, например google.com или любой другой API. К сожалению, все цели возвращают такие ошибки, как страница не найдена или запрещенные ошибки.
func main() {
r := gin.Default()
eanAPI := api.NewEanAPI()
routers.InitRedirectRoutes(r, eanAPI)
port := os.Getenv("PORT")
if len(port) == 0 {
port = "8000"
}
r.Run(":" + port)
}
// InitRedirectRoutes initialize routes redirection.
func InitRedirectRoutes(r *gin.Engine, eanAPI api.EanAPI) {
r.POST("/*action", eanAPI.ReverseProxy)
r.GET("/*action", eanAPI.ReverseProxy)
}
type EanAPI interface {
ReverseProxy(ctx *gin.Context)
}
type eanAPI struct {
baseURL string
}
func NewEanAPI() EanAPI {
return &eanAPI{}
}
func (api *eanAPI) ReverseProxy(ctx *gin.Context) {
// proxy
forwardToHost := "http://httpbin.org/"
// I tried with "https://jsonplaceholder.typicode.com/"
"http://google.com"
reverseProxy := proxy.NewProxy(forwardToHost)
reverseProxy.Handle(ctx.Writer, ctx.Request, url.Parse(forwardToHost))
}
type Prox struct {
target *url.URL
proxy *httputil.ReverseProxy
}
func NewProxy(target string) *Prox {
url, _ := url.Parse(target)
fmt.Println("url", url)
return &Prox{target: url, proxy: httputil.NewSingleHostReverseProxy(url)}
}
func (p *Prox) Handle(w http.ResponseWriter, r *http.Request, origin *url.URL) {
w.Header().Set("Content-Type", "application/json; charset=utf-8")
w.Header().Set("X-Forwarded-Host", r.Host)
w.Header().Set("X-Origin-Host", origin.Host)
r.URL.Scheme = origin.Scheme
r.URL.Host = origin.Host
p.proxy.ServeHTTP(w, r)
}
Я потратил много дней, пытаясь установить соответствующие заголовки, но пока ничего не получилось. Я думаю, что заголовки были установлены неправильно, но я не знаю, как скопировать заголовки с клиента и добавить их в прокси.
Я использую прокси вместо перенаправления, потому что мне нужно поработать с телом запроса и ответа!
Заранее спасибо!
eanapi.ReverseProxy
не делает того, во что вы верите. Мне кажется, что он генерирует запрос на получение/отправку на удаленный сервер в форме/somethingaction
, эти URL-адреса не существуют на удаленном сервере. - person mh-cbon   schedule 17.09.2018