Сделать httputil.ReverseProxy поток ответа Foward правильно - PullRequest
0 голосов
/ 14 января 2019

У меня на главном веб-сервере есть обратные прокси-серверы, которые предназначены для определенного микросервиса и обрабатывают прямые запросы к соответствующим микросервисам.

func newTrimPrefixReverseProxy(target *url.URL, prefix string) *httputil.ReverseProxy {
    director := func(req *http.Request) {
        // ... trims prefix from request path and prepends the path of the target url
    }

    return &httputil.ReverseProxy{Director: director}
}

Это отлично работает для чисто JSON-ответов, но недавно я столкнулся с проблемами при попытке передать контент (потоковые ответы) через обратный прокси-сервер. Средства для предоставления контента не имеют значения, (видео) контент подается так, как задумано, когда к сервису обращаются напрямую, а не через обратный прокси.

Обслуживание контента:

http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
    http.ServeContent(w, r, "video.mp4", time.Now().Add(time.Hour*24*365*12*9*-1), videoReadSeeker)
})

Опять же, videoReadSeeker и то, как подается контент, не является проблемой, проблема заключается в том, что мой ответ ретранслируется, как предназначено, для запрашивающей стороны через обратный прокси; при непосредственном доступе к услуге открывается видео, и я могу отсканировать его до глубины души.

Обратите внимание, что ответ для данных содержимого получен (статус http, заголовки), но поток содержимого в теле ответа - нет.

Как я могу убедиться, что обратный прокси-сервер обрабатывает потоковые ответы в соответствии с содержанием?

1 Ответ

0 голосов
/ 14 января 2019

Получаете ли вы те же результаты при использовании:

package main

import (
    "log"
    "net/http"
    "net/http/httputil"
    "net/url"
)

func main() {
    u, err := url.Parse("http://localhost:8080/asdfasdf")
    if err != nil {
        log.Fatal("url.Parse: %v", err)
    }

    proxy := httputil.NewSingleHostReverseProxy(u)

    log.Printf("Listening at :8081")
    if err := http.ListenAndServe(":8081", proxy); err != nil {
        log.Fatal("ListenAndServe: %v", err)
    }
}

В конечном счете, это та же самая реализация под капотом, но представленный здесь директор гарантирует, что существуют некоторые из ожидаемых заголовков, которые вам понадобятся для того, чтобы некоторые функции прокси функционировали должным образом.

...