)]}'
{
  "commit": "130cf9133d11b79125d0a1e959822aea2f99d751",
  "tree": "d04c8b5b3ced58654a45fffe5713c8eea844e50b",
  "parents": [
    "782881b376f51b41332943befde7a94647dd37bd"
  ],
  "author": {
    "name": "Valentin Bartenev",
    "email": "vbart@nginx.com",
    "time": "Wed Feb 24 15:58:07 2016 +0300"
  },
  "committer": {
    "name": "Valentin Bartenev",
    "email": "vbart@nginx.com",
    "time": "Wed Feb 24 15:58:07 2016 +0300"
  },
  "message": "HTTP/2: implemented per request timeouts (closes #626).\n\nPreviously, there were only three timeouts used globally for the whole HTTP/2\nconnection:\n\n 1. Idle timeout for inactivity when there are no streams in processing\n    (the \"http2_idle_timeout\" directive);\n\n 2. Receive timeout for incomplete frames when there are no streams in\n    processing (the \"http2_recv_timeout\" directive);\n\n 3. Send timeout when there are frames waiting in the output queue\n    (the \"send_timeout\" directive on a server level).\n\nReaching one of these timeouts leads to HTTP/2 connection close.\n\nThis left a number of scenarios when a connection can get stuck without any\nprocessing and timeouts:\n\n 1. A client has sent the headers block partially so nginx starts processing\n    a new stream but cannot continue without the rest of HEADERS and/or\n    CONTINUATION frames;\n\n 2. When nginx waits for the request body;\n\n 3. All streams are stuck on exhausted connection or stream windows.\n\nThe first idea that was rejected was to detect when the whole connection\ngets stuck because of these situations and set the global receive timeout.\nThe disadvantage of such approach would be inconsistent behaviour in some\ntypical use cases.  For example, if a user never replies to the browser\u0027s\nquestion about where to save the downloaded file, the stream will be\neventually closed by a timeout.  On the other hand, this will not happen\nif there\u0027s some activity in other concurrent streams.\n\nNow almost all the request timeouts work like in HTTP/1.x connections, so\nthe \"client_header_timeout\", \"client_body_timeout\", and \"send_timeout\" are\nrespected.  These timeouts close the request.\n\nThe global timeouts work as before.\n\nPreviously, the c-\u003ewrite-\u003edelayed flag was abused to avoid setting timeouts on\nstream events.  Now, the \"active\" and \"ready\" flags are manipulated instead to\ncontrol the processing of individual streams.\n",
  "tree_diff": [
    {
      "type": "modify",
      "old_id": "5a39c118afd1347488955f80216d11d2c0ac1408",
      "old_mode": 33188,
      "old_path": "src/http/ngx_http_request.c",
      "new_id": "fd790e10bd594bc8795677ad9056d07e4255358f",
      "new_mode": 33188,
      "new_path": "src/http/ngx_http_request.c"
    },
    {
      "type": "modify",
      "old_id": "e4f824cfe2231d01937a7d8804758f241c8ea5ca",
      "old_mode": 33188,
      "old_path": "src/http/v2/ngx_http_v2.c",
      "new_id": "4c4a4e7a9155533d7fe5883aed53048b45c2be5f",
      "new_mode": 33188,
      "new_path": "src/http/v2/ngx_http_v2.c"
    },
    {
      "type": "modify",
      "old_id": "3e396ab54368dbe1db954d361ccb0119a02808a5",
      "old_mode": 33188,
      "old_path": "src/http/v2/ngx_http_v2_filter_module.c",
      "new_id": "caa835dec31b25f682665afada1cb50e0a6baaab",
      "new_mode": 33188,
      "new_path": "src/http/v2/ngx_http_v2_filter_module.c"
    }
  ]
}
