我的主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状态、标头),但响应正文中的内容流未被接收。
如何确保反向代理按照内容的意图处理流响应?
使用以下方法时,您是否会得到相同的结果:
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 响应。 响应对象 但是,对于大多数路由和控制器行为