【问题标题】:File server won't serve files over 32 KB文件服务器不会提供超过 32 KB 的文件
【发布时间】: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


【解决方案1】:

所以我发现了问题,结果证明它与函数本身无关,只是我调用它的地方。我在一个函数中调用它来创建网关代理,然后修改处理程序以添加其他内容,例如指标报告。我只需要在最后一次调用父函数时调用添加这些东西,它现在就可以工作了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-08
    • 1970-01-01
    • 2017-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-21
    • 1970-01-01
    相关资源
    最近更新 更多