Home  >  Article  >  Backend Development  >  Go: ResponseController's deadline not respected

Go: ResponseController's deadline not respected

王林
王林forward
2024-02-09 12:09:08801browse

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)
}
$ 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
$ curl http://localhost:8080/
curl: (52) Empty reply from server

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!

Statement:
This article is reproduced at:stackoverflow.com. If there is any infringement, please contact admin@php.cn delete