【发布时间】:2019-12-25 02:20:10
【问题描述】:
我有一个在 docker 容器中运行的 go 程序。我已对其进行了设置,以便当您访问 localhost:8080(程序正在运行的端口)时,它会提供使用 swagger-ui 创建的文档文件。 index.html 文件出现,并在该文件中导入了一个 css 文件、一个 png 文件和两个 javascript 文件。 png 被正确导入(只有 628 字节);但是,其他三个文件无法正确提供(它们都是几百 KB)。我相信问题在于它们太大了,好像我删除了部分文件以使它们低于 32 KB,它们被正确提供。不过,我不确定如何增加此文件限制。
我查看了我的所有代码和相当多的 http 包,以查看可能设置此硬限制的位置,但在任何地方都找不到。
这是创建我的文件服务器并提供文件的代码
fs := http.FileServer(http.Dir(docRoot)) // docRoot is a config variable
for _, f := range files {
path := fmt.Sprintf("/%s", f.Name())
serveFile := func(w http.ResponseWriter, r *http.Request) {
if r.URL.Path == path || r.URL.Path == "/index.html" && path == "/" {
fs.ServeHTTP(w, r)
} else {
origHandler.ServeHTTP(w, r)
}
}
docHandler.HandleFunc(path, serveFile)
}
我认为会有一些 Handler.SetMaxSize() 或 ResponseWriter.SetMaxSize() 方法,但我在 http 包中找不到类似的东西。有谁知道如何增加这个硬限制或在哪里设置?
【问题讨论】:
-
没有大小限制。客户收到什么?它接收 32K 数据,还是什么也没有?我以前做过这样的事情,总是失败的一件事是媒体类型,因为 FileServer 没有设置 Content-Type。也许你有类似的问题?你试过 curl 吗?
-
客户端收到 200 响应,其中标头中的大小字段设置正确,但正文中没有数据。看起来内容类型也正确设置,
text/css; charset=utf-8用于 css,application/javascript用于 js。但是,在控制台中它也会打印一个错误net::ERR_CONTENT_LENGTH_MISMATCH 200 (OK),大概是因为内容长度设置正确但正文的长度为零。我已经在 Chrome/Safari/Firefox 上尝试过,所以我认为浏览器也不是问题。 -
当我为 css 文件卷曲时,我得到
curl: (18) transfer closed with 33002 bytes remaining to read。 33002 是它应该在正文中接收的数据长度,所以这似乎与我在浏览器中遇到的错误相同。 -
您是否尝试在 docker 容器外运行它?也许它会帮助诊断它出了什么问题。
-
有趣的是,当我这样做时它确实会返回数据,但每个文件只返回前 32KB 的数据。
标签: http go response swagger-ui fileserver