登录
首页 >  Golang >  Go问答

Golang实现连续多部分响应的转发功能

来源:stackoverflow

时间:2024-02-16 22:15:23 203浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《Golang实现连续多部分响应的转发功能》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

我在flask-python上有一个服务器,它从相机读取帧并将它们放入多部分响应中,就像这里一样:

def get_feed():
    while true:
        ret, frame = server.get_frame()
        if not ret:
            try:
                frame = cv2.imread("data/misc/camera_error.jpg")
            except:
                frame = np.zeros(shape=(480, 640, 3), dtype=np.uint8)
        success, buffer = cv2.imencode(".jpg", 
                                       cv2.cvtcolor(
                                             frame,
                                             cv2.color_bgr2rgb)
                                       )
        buffer = buffer.tobytes()
        yield (b'--frame\r\n'
               b'content-type: image/jpeg\r\n\r\n' + buffer + b'\r\n')

@app.route('/')
def index():
    return response(get_feed(), mimetype='multipart/x-mixed-replace; boundary=frame')

我有 golang-server,它应该接受 get 请求,将其转发到 flask 并将请求转发到客户端。

func api_camera_shot(w http.ResponseWriter, r *http.Request) {
    resp, err := http.Get("http://" + *url here*)
    if err != nil {
        fmt.Println(resp)            // debug error
        fmt.Println(err)
        return
    }
    buffer, _ := ioutil.ReadAll(resp.Body)
    for name, values := range resp.Header {
        // Loop over all values for the name.
        for _, value := range values {
            w.Header().Set(name, value)
        }
    }
    _, _ = w.Write(buffer)
}

但它陷入无限循环并且不向客户端发送任何内容。据我了解, buffer, _ := ioutil.readall(resp.body) 无法读取整个正文,直到 而烧瓶中的 true 仍在运行并且没有响应。

如何转发这个连续的多部分请求而不卡住?


正确答案


偶尔,golang 有我现在使用的代理功能:

origin, _ := url.Parse("http://" + *url-here*)

    director := func(req *http.Request) {
        req.Header.Add("X-Forwarded-Host", req.Host)
        req.Header.Add("X-Origin-Host", origin.Host)
        req.URL.Scheme = "http"
        req.URL.Host = origin.Host
        req.URL.Path = "/"
    }

    proxy := &httputil.ReverseProxy{Director: director}
    router.Get("/api/camera/*", func(w http.ResponseWriter, r *http.Request) {
        proxy.ServeHTTP(w, r)
    })

以上就是《Golang实现连续多部分响应的转发功能》的详细内容,更多关于的资料请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>