doujiao2014 2018-08-21 09:39
浏览 163
已采纳

如何非破坏性地检查HTTP客户端是否已关闭连接?

I have a net/http Server serving a GET request (via ServeHTTP()) which can take a very long time to complete. Consequently, no client timeout is configured server side. However, the connected client may have shut down its connection to the server (typically due to a timeout on its side, but of course, other reasons are possible as well). I have no control over the clients.

How do I detect such a condition within ServeHTTP() without "disturbing" the connection?

  • I cannot send a series of 1xx response headers because it's not supported by ResponseWriter.WriteHeader() (also, it allows only one header to be set and does not return anything).
  • I cannot use ResponseWriter.Write() with zero-sized data, as that would send a header.

What other options do I have?

Edit: this is not a duplicate of how to close/abort a Golang http.Client POST prematurely because there the question is how to cancel a request from the client side while my question is about detecting such a cancellation from the server side.

  • 写回答

1条回答 默认 最新

  • dongtan8532 2018-08-21 10:30
    关注

    Interrogate the request context:

    For incoming server requests, the context is canceled when the client's connection closes, the request is canceled (with HTTP/2), or when the ServeHTTP method returns.

    var r *http.Request
    select {
        case <-r.Context().Done():
            // Client gave up
        default:
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 有了解d3和topogram.js库的吗?有偿请教
  • ¥100 任意维数的K均值聚类
  • ¥15 stamps做sbas-insar,时序沉降图怎么画
  • ¥15 unity第一人称射击小游戏,有demo,在原脚本的基础上进行修改以达到要求
  • ¥15 买了个传感器,根据商家发的代码和步骤使用但是代码报错了不会改,有没有人可以看看
  • ¥15 关于#Java#的问题,如何解决?
  • ¥15 加热介质是液体,换热器壳侧导热系数和总的导热系数怎么算
  • ¥100 嵌入式系统基于PIC16F882和热敏电阻的数字温度计
  • ¥15 cmd cl 0x000007b
  • ¥20 BAPI_PR_CHANGE how to add account assignment information for service line