)]}'
{
  "commit": "da7c67f59526a02ef22f80fe91fd2960a6547e59",
  "tree": "ad8911e23ebfe02a037f2f9d9b91dc84b74bed23",
  "parents": [
    "b3f5034b15a7a6f065e92d0617f7a473d5d9dcfa"
  ],
  "author": {
    "name": "Russ Cox",
    "email": "rsc@golang.org",
    "time": "Wed Aug 26 13:09:28 2026 -0400"
  },
  "committer": {
    "name": "Russ Cox",
    "email": "rsc@golang.org",
    "time": "Fri Aug 28 14:42:09 2026 -0700"
  },
  "message": "net/http: abort in-flight response writes when the connection dies\n\nconnReader.handleReadErrorLocked already cancels the connection\u0027s context\nwhen a read from the client fails, but a handler blocked writing a\nresponse is left to discover the dead connection on its own, via the\nwrite failing. On Oracle Solaris that never happens: once a read has\nconsumed a socket\u0027s pending error, poll(2) reports the fd as POLLIN only,\nnever POLLOUT, POLLERR or POLLHUP, even though write(2) returns EPIPE\nimmediately. A handler blocked writing a large response therefore blocks\nforever, and with it the connection and anything waiting on it, such as\nhttptest.Server.Close.\n\nThat is what wedges TestTransportGzip/h1 on the solaris-amd64 builders:\nthe client closes the connection mid-response, the server\u0027s background\nread consumes the ECONNRESET and exits, and the handler\u0027s io.Copy of a\n1 MiB body never returns.\n\nUnblock the write instead of waiting for the poller. A read error other\nthan io.EOF or an expired read deadline means the connection is gone in\nboth directions, so a response write still in flight is pointless and is\nnow aborted with a write deadline. io.EOF is left alone, so a client that\nhalf closes can still receive a response.\n\nThe Solaris behavior is an OS bug; illumos fixed the same defect in 2014\n(illumos 4627, \"POLLHUP not generated for disconnected sockets\"). This\nchange also makes such a handler fail promptly rather than leak on any\nplatform where a peer dies without the write ever being reported ready.\n\nFixes #78438.\n\nChange-Id: Ibe70d19889d6f7a6dc274b1ee6325d1703efd9eb\nReviewed-on: https://go-review.googlesource.com/c/go/+/822364\nLUCI-TryBot-Result: golang-scoped@luci-project-accounts.iam.gserviceaccount.com \u003cgolang-scoped@luci-project-accounts.iam.gserviceaccount.com\u003e\nReviewed-by: Damien Neil \u003cdneil@google.com\u003e\nReviewed-by: David Chase \u003cdrchase@google.com\u003e\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "6068daa465a71fe36e2911dc0eb98a886adca7cf",
      "old_mode": 33188,
      "old_path": "src/net/http/serve_test.go",
      "new_id": "883099b61bf91f95be24e91568bc866a2767f779",
      "new_mode": 33188,
      "new_path": "src/net/http/serve_test.go"
    },
    {
      "type": "modify",
      "old_id": "7f86c6118b1b0eb26abdcf39e5c92b9a46719af6",
      "old_mode": 33188,
      "old_path": "src/net/http/server.go",
      "new_id": "0e9c9eb3a5447aa4afd3450ad5efffcc1ed3e73f",
      "new_mode": 33188,
      "new_path": "src/net/http/server.go"
    }
  ]
}
