登录
首页 >  Golang >  Go问答

限制 HTTP 响应中可读取的字节数

来源:stackoverflow

时间:2024-03-25 19:18:31 399浏览 收藏

限制 HTTP 响应中的可读取字节数对于防止服务器因恶意或错误配置的 URL 而超载至关重要。通过设置最大可读取字节数,可以控制从用户提供的 URL 读取的响应大小。此解决方案可确保服务器不会被指向大文件或故意尝试消耗资源的链接所压垮。

问题内容

我需要读取用户提供的 URL 的响应

我不希望他们通过指向大文件的链接使我的服务器超载。

我想最多读取 N 个字节,如果还有更多字节要读取,则返回错误。

我可以读取 N 个字节,但是我如何检测该文件不完整(假设远程文件正好是 N 个字节长的极端情况)?


解决方案


除了peter的回答之外,net/http包中还有一个现成的解决方案:http.MaxBytesReader()

func maxbytesreader(w responsewriter, r io.readcloser, n int64) io.readcloser

最初它是为了限制传入的请求主体的大小而“设计”的,但它也可以用于限制传入的响应主体。为此,只需为 responsewriter 参数传递 nil 即可。

使用示例:

{
    body := ioutil.nopcloser(bytes.newbuffer([]byte{0, 1, 2, 3, 4}))
    r := http.maxbytesreader(nil, body, 4)
    buf, err := ioutil.readall(r)
    fmt.println("when body is large:", buf, err)
}

{
    body := ioutil.nopcloser(bytes.newbuffer([]byte{0, 1, 2, 3, 4}))
    r := http.maxbytesreader(nil, body, 5)
    buf, err := ioutil.readall(r)
    fmt.println("when body is exact (ok):", buf, err)
}

{
    body := ioutil.nopcloser(bytes.newbuffer([]byte{0, 1, 2, 3, 4}))
    r := http.maxbytesreader(nil, body, 6)
    buf, err := ioutil.readall(r)
    fmt.println("when body is small (ok):", buf, err)
}

输出(在 Go Playground 上尝试):

When body is large: [0 1 2 3] http: request body too large
When body is exact (OK): [0 1 2 3 4] 
When body is small (OK): [0 1 2 3 4] 

好了,本文到此结束,带大家了解了《限制 HTTP 响应中可读取的字节数》,希望本文对你有所帮助!关注golang学习网公众号,给大家分享更多Golang知识!

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