)]}'
{
  "commit": "b1aa129518842fb7dc28e94c263456b2e3c9c6d3",
  "tree": "c52f01192ece8bb4cfade42b01e0f2272935a4f0",
  "parents": [
    "54e00f54b6a97379a301adf65157e56dce251ed2"
  ],
  "author": {
    "name": "Maxim Dounin",
    "email": "mdounin@mdounin.ru",
    "time": "Mon Sep 10 18:57:13 2018 +0300"
  },
  "committer": {
    "name": "Maxim Dounin",
    "email": "mdounin@mdounin.ru",
    "time": "Mon Sep 10 18:57:13 2018 +0300"
  },
  "message": "Lingering close changed to handle NGX_AGAIN.\n\nThe \"do { c-\u003erecv() } while (c-\u003eread-\u003eready)\" form used in the\nngx_http_lingering_close_handler() is not really correct, as for\nexample with SSL c-\u003eread-\u003eready may be still set when returning NGX_AGAIN\ndue to SSL_ERROR_WANT_WRITE.  Therefore the above might be an infinite loop.\n\nThis doesn\u0027t really matter in lingering close, as we shutdown write side\nof the socket anyway and also disable renegotiation (and even without shutdown\nand with renegotiation it requires using very large certificate chain and\ntuning socket buffers to trigger SSL_ERROR_WANT_WRITE).  But for the sake of\ncorrectness added an NGX_AGAIN check.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "979009158ce498dc579560210db5c68dd410fc05",
      "old_mode": 33188,
      "old_path": "src/http/ngx_http_request.c",
      "new_id": "d7e4d69f11cecec093f6a86e85a94773e290537a",
      "new_mode": 33188,
      "new_path": "src/http/ngx_http_request.c"
    }
  ]
}
