Я создал небольшие запросы переадресации прокси на другой порт на той же машине и доставил результат обратно вызывающей стороне.
В моем случае результатом службы является простая html страница, содержащая ссылки , Поскольку обратный прокси-сервер работает на другом порту, чем служба, я должен настроить ссылки. Я попытался сделать это, используя пользовательскую реализацию Transport:
type transport struct {
http.RoundTripper
}
func (t *transport) RoundTrip(req *http.Request) (resp *http.Response, err error) {
resp, err = t.RoundTripper.RoundTrip(req)
if err != nil {
return nil, err
}
b, err := ioutil.ReadAll(resp.Body)
if err != nil {
return nil, err
}
err = resp.Body.Close()
if err != nil {
return nil, err
}
// This works
b = bytes.Replace(b, []byte("http://localhost:5000"), []byte("http://localhost:8080"), -1)
// This doesn't
b = bytes.Replace(b, []byte("api"), []byte("auth-api"), -1)
resp.Body = ioutil.NopCloser(bytes.NewReader(b))
resp.ContentLength = int64(len(b))
return resp, nil
}
. Вот как я инициализирую обратный прокси-сервер в обработчике запросов:
proxy := httputil.NewSingleHostReverseProxy(target)
proxy.Transport = &transport{http.DefaultTransport}
proxy.ServeHTTP(res, req)
Первая замена в моем коде работает , Но секунды приводят к нескольким дополнительным вызовам клиента (распознаваемым по нескольким попаданиям точки останова) и безрезультатным:
curl: (52) Empty reply from server
Если я раскомментирую
b = bytes.Replace(b, []byte("api"), []byte("auth-api"), -1)
, все работает просто отлично и имя хоста заменяется, как и ожидалось. Я так старался отлаживать, но не смог выяснить, в чем дело. Если я сохраню тело в файл после того, как замена будет сделана, все будет в порядке, и префикс также будет заменен. Он просто не может доставить его через ответ.