Go: ResponseController's deadline not respected

王林
Release: 2024-02-09 12:09:08
forward
804 people have browsed it

Go:不遵守 ResponseController 的截止日期

php editor Strawberry is here to introduce to you about "Go: Not complying with the deadline of ResponseController". In software development, ResponseController is a common controller used to handle response requests. However, sometimes developers may neglect to adhere to the ResponseController's deadline when writing code, which may lead to a series of problems. This article will explore this issue in detail and provide solutions to ensure the reliability and stability of your code.

Question content

I have some code where I try to cancel writing back to the client if the write takes too long. I think I can use http.responsecontroller to achieve this since it has a setwritedeadline method.

Unfortunately, in the code below, rw.write does not return an error after the deadline has passed.

Is there any other way to cancel writing?

package main

import (
    "log"
    "net/http"
    "time"
)

func main() {
    http.handlefunc("/", func(rw http.responsewriter, r *http.request) {
        log.println(r.method, r.url.path)

        rc := http.newresponsecontroller(rw)
        dl := time.now().add(3 * time.second)
        if err := rc.setwritedeadline(dl); err != nil {
            log.println(err)
            return
        }
        log.println("write deadline:", dl)

        var total int
        for _, b := range []byte("what!\n") {
            time.sleep(time.second)

            n, err := rw.write([]byte{b})
            if err != nil {
                log.println(err)
                return
            }

            total += n
            log.println("bytes written", n)
        }

        log.println(r.method, r.url.path, "write total", total)
    })

    http.listenandserve(":8080", nil)
}
Copy after login
$ go run main.go 
2023/04/26 12:24:40 get /
2023/04/26 12:24:40 write deadline: 2023-04-26 12:24:43.303884739 -0700 pdt m=+11.5891
16304
2023/04/26 12:24:41 bytes written 1
2023/04/26 12:24:42 bytes written 1
2023/04/26 12:24:43 bytes written 1
2023/04/26 12:24:44 bytes written 1
2023/04/26 12:24:45 bytes written 1
2023/04/26 12:24:46 bytes written 1
2023/04/26 12:24:46 get / write total 6
Copy after login
$ curl http://localhost:8080/
curl: (52) Empty reply from server
Copy after login

Solution

setwritedeadline Documentation says:

setwritedeadline Set the deadline for writing responses. Writing the response body after the deadline has passed will not block, but may succeed if the data is buffered.

The write to the response writer in the question succeeds because the small amount of data written by the application is buffered.

The "Empty reply from server" error from curl indicates that the deadline is respected when the server flushes the response to the underlying network connection when it returns from the handler.

Use setwritedeadline to prevent client slowness.

Use a context with a deadline to limit the time it takes the server to generate a response:

65bd46fc4 February

The above is the detailed content of Go: ResponseController's deadline not respected. For more information, please follow other related articles on the PHP Chinese website!

source:stackoverflow.com
Statement of this Website
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
Popular Tutorials
More>
Latest Downloads
More>
Web Effects
Website Source Code
Website Materials
Front End Template
About us Disclaimer Sitemap
php.cn:Public welfare online PHP training,Help PHP learners grow quickly!