当前位置: 首页 > 知识库问答 >
问题:

制作http.正确的ReverseProxy Foward响应流

丁和歌
2023-03-14

我的主web服务器中有反向代理,专门用于某个微服务,并将请求转发到相应的微服务。

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个答案

谷梁涵忍
2023-03-14

使用以下方法时,您是否会得到相同的结果:

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)
    }
}

最终,这些都是相同的引擎盖下的实现,但是这里提供的控制器确保存在一些预期的头文件,您将需要这些头文件来实现一些代理功能。

 类似资料:
  • 问题内容: 有没有办法确定内容的大小?我读了这个get-size-of-http-response-in- java问题,但可悲的是我在哪里工作,我无法访问CommonsIO :( 响应内容由单个复杂对象组成,因此我考虑将其写到临时文件中,然后检查该文件。在应用程序在生产环境中运行时,这不是我想做的诊断方法,因此,如果可能的话,请避免使用它。 PS我读了埃里克森的答案,但它提到了输入流,我想知道要

  • 假设您希望通过调用到来获取用户列表,但当前该表被截断,因此没有用户。对于这种情况,正确的反应是什么:或?

  • R之后 描述-函数调用包含HTTP响应分割漏洞。将未经初始化的用户提供的输入写入HTTP标头允许攻击者操纵浏览器呈现的HTTP响应,从而导致缓存中毒和跨站点脚本攻击。

  • 我编写了一个方法,该方法应该在utf-8中以字符串类型返回有效的正文,但在发出请求后,我在UTF-16中得到响应。postman中的内容类型头是application/json。我在stackoverflow中搜索任何可能的解决方法,但任何解决方案都无济于事,包括这个主题(.我如何更改它以获得有效的主体?Thanx!

  • 主要内容:HTTP响应完整格式HTTP响应完整格式 HTTP的响应也由三部分组成(响应行+响应头+响应体): 以下是一个实际的HTTP响应示例: ①报文协议及版本; ②状态码及状态描述; ③响应报文头,也是由多个属性组成; ④响应报文体,即我们真正要的“干货”。

  • 基本响应 当然,所有的路由及控制器必须返回某个类型的响应,并发送回用户的浏览器。Laravel 提供了几种不同的方法来返回响应。最基本的响应就是从路由或控制器简单的返回一个字符串: $router->get('/', function () { return 'Hello World'; }); 指定的字符串会被框架自动转换成 HTTP 响应。 响应对象 但是,对于大多数路由和控制器行为