{"action":"created","comment":{"url":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments/177274496","pull_request_review_id":107115409,"id":177274496,"diff_hunk":"@@ -1451,33 +1454,279 @@ failure.  If integrity protection is performed by QUIC, QUIC MUST abort the\n connection if the integrity check fails with a PROTOCOL_VIOLATION error code.\n \n \n+## Path Validation {#migrate-validate}\n+\n+Path validation is used by an endpoint to verify reachability of a peer over a\n+specific path.  That is, it tests reachability between a specific local address\n+and a specific peer address, where an address is the two-tuple of IP address and\n+port.  Path validation tests that packets can be both sent to and received from\n+a peer.\n+\n+Path validation is used during connection migration (see {{migration}}) by the\n+migrating endpoint to verify reachability of a peer from a new local address.\n+Path validation is also used by the peer to verify that the migrating endpoint\n+is able to receive packets sent to the its new address.  That is, that the\n+packets received from the migrating endpoint do not carry a spoofed source\n+address.\n+\n+Path validation can be used at any time by either endpoint.  For instance, an\n+endpoint might check that a peer is still in possession of its address after a\n+period of quiescence.\n+\n+Path validation is not designed as a NAT traversal mechanism. Though the\n+mechanism described here might be effective for the creation of NAT bindings\n+that support NAT traversal, the expectation is that one or other peer is able to\n+receive packets without first having sent a packet on that path. Effective NAT\n+traversal needs additional synchronization mechanisms that are not provided\n+here.\n+\n+An endpoint MAY bundle PATH_CHALLENGE and PATH_RESPONSE frames that are used for\n+path validation with other frames.  For instance, an endpoint may pad a packet\n+carrying a PATH_CHALLENGE for PMTU discovery, or an endpoint may bundle a\n+PATH_RESPONSE with its own PATH_CHALLENGE.\n+\n+\n+### Initiation\n+\n+To initiate path validation, an endpoint sends a PATH_CHALLENGE frame containing\n+a random payload that is hard to guess on the path to be validated.\n+\n+An endpoint MAY send additional PATH_CHALLENGE frames to handle packet loss.  An\n+endpoint SHOULD NOT send a PATH_CHALLENGE more frequently than it would an\n+Initial packet, ensuring that connection migration is no more load on a new path\n+than establishing a new connection.\n+\n+The endpoint MUST use fresh random data in every PATH_CHALLENGE frame so that it\n+can associate the peer's response with the causative PATH_CHALLENGE.\n+\n+\n+### Response\n+\n+On receiving a PATH_CHALLENGE frame, an endpoint MUST respond immediately by\n+echoing the data contained in the PATH_CHALLENGE frame in a PATH_RESPONSE frame,\n+with the following stipulation.  Since a PATH_CHALLENGE might be sent from a\n+spoofed address, an endpoint MAY limit the rate at which it sends PATH_RESPONSE\n+frames and MAY silently discard PATH_CHALLENGE frames that would cause it to\n+respond at a higher rate.\n+\n+To ensure that packets can be both sent to and received from the peer, the\n+PATH_RESPONSE MUST be sent on the same path as the triggering PATH_CHALLENGE:\n+from the same local address on which the PATH_CHALLENGE was received, to the\n+same remote address from which the PATH_CHALLENGE was received.\n+\n+\n+### Completion\n+\n+A new address is considered valid when a PATH_RESPONSE frame is received\n+containing data that was sent in a previous PATH_CHALLENGE. Receipt of an\n+acknowledgment for a packet containing a PATH_CHALLENGE frame is not adequate\n+validation, since the acknowledgment can be spoofed by a malicious client.\n+\n+For path validation to be successful, a PATH_RESPONSE frame MUST be received\n+from the same remote address to which the corresponding PATH_CHALLENGE was\n+sent. If a PATH_RESPONSE frame is received from a different remote address than\n+the one to which the PATH_CHALLENGE was sent, path validation is considered to\n+have failed, even if the data matches that sent in the PATH_CHALLENGE.\n+\n+Additionally, the PATH_RESPONSE frame MUST be received on the same local address\n+from which the corresponding PATH_CHALLENGE was sent.  If a PATH_RESPONSE frame\n+is received on a different local address than the one from which the\n+PATH_CHALLENGE was sent, path validation is considered to have failed, even if\n+the data matches that sent in the PATH_CHALLENGE.  Thus, the endpoint considers\n+the path to be valid when a PATH_RESPONSE frame is received on the same path\n+with the same payload as the PATH_CHALLENGE frame.\n+\n+\n+### Abandonment\n+\n+An endpoint SHOULD abandon path validation after sending some number of\n+PATH_CHALLENGE frames or after some time has passed.  When setting this timer,\n+implementations are cautioned that the new path could have a longer round-trip\n+time than the original.\n+\n+Note that the endpoint might receive packets containing other frames on the new\n+path, but a PATH_RESPONSE frame with appropriate data is required for path\n+validation to succeed.\n+\n+If path validation fails, the path is deemed unusable.  This does not\n+necessarily imply a failure of the connection - endpoints can continue sending\n+packets over other paths as appropriate.  If no paths are available, an endpoint\n+can wait for a new path to become available or close the connection.\n+\n+A path validation might be abandoned for other reasons besides\n+failure. Primarily, this happens if a connection migration to a new path is\n+initiated while a path validation on the old path is in progress.\n+\n+\n ## Connection Migration {#migration}\n \n-A QUIC connection can be identified using the Destination Connection ID included\n-in packets.  QUIC's consistent connection ID allows connections to survive\n-changes to the client's IP and/or port, such as those caused by client or server\n-migrating to a new network.  Connection migration allows a client to retain any\n-shared state with a connection when they move networks.  This includes state\n-that can be hard to recover such as outstanding requests, which might otherwise\n-be lost with no easy way to retry them.\n+QUIC allows connections to survive changes to endpoint addresses (that is, IP\n+address and/or port), such as those caused by a endpoint migrating to a new\n+network.  This section describes the process by which an endpoint migrates to a\n+new address.\n+\n+An endpoint MUST NOT initiate connection migration before the handshake is\n+finished and the endpoint has 1-RTT keys.\n+\n+This document limits migration of connections to new client addresses.\n+Migrating a connection to a new server address is left for future work. If a\n+client receives packets from a new server address, the client MAY discard these\n+packets.\n+\n+\n+### Probing a New Path\n+\n+An endpoint MAY probe for peer reachability from a new local address using path\n+validation {{migrate-validate}} prior to migrating the connection to the new\n+local address.  Failure of path validation simply means that the new path is not\n+usable for this connection.  Failure to validate a path does not cause the\n+connection to end unless there are no valid alternative paths available.\n+\n+An endpoint uses a new connection ID for probes sent from a new local address,\n+see {{migration-linkability}} for further discussion.\n+\n+Receiving a PATH_CHALLENGE frame from a peer indicates that the peer is probing\n+for reachability on a path. An endpoint sends a PATH_RESPONSE in response as per\n+{{migrate-validate}}.\n+\n+PATH_CHALLENGE, PATH_RESPONSE, and PADDING frames are \"probing\" frames. If an\n+endpoint has received packets containing only these frames from a given peer\n+address, it MUST NOT send other types of frames to that address.\n+\n+\n+### Initiating Connection Migration {#initiating-migration}\n \n-An endpoint that receives packets that contain a source IP address and port that\n-has not yet been used can start sending new packets with those as a destination\n-IP address and port.  Packets exchanged between endpoints can then follow the\n-new path.\n+A endpoint can migrate a connection to a new local address by sending packets\n+containing frames other than probing frames from that address.\n \n-Due to variations in path latency or packet reordering, packets from different\n-source addresses might be reordered.  The packet with the highest packet number\n-MUST be used to determine which path to use.  Endpoints also need to be prepared\n-to receive packets from an older source address.\n+Each endpoint validates its peer's address during connection establishment.\n+Therefore, a migrating endpoint can send to its peer knowing that the peer is\n+willing to receive at the peer's current address. Thus an endpoint can migrate\n+to a new local address without first validating the peer's address.\n \n-An endpoint MUST validate that its peer can receive packets at the new address\n-before sending any significant quantity of data to that address, or it risks\n-being used for denial of service.  See {{migrate-validate}} for details.\n+However, the new path might not support the endpoint's current sending\n+rate. Therefore, the endpoint resets its congestion controller, as described in\n+{{migration-cc}}.\n+\n+Receiving acknowledgments for this data serves as proof of the peer's\n+reachability from the new address.  Note that since acknowledgments may be\n+received on any path, return reachability on the new path is not\n+established. To establish return reachability on the new path, an endpoint MAY\n+concurrently initiate path validation {{migrate-validate}} on the new path.\n+\n+\n+### Responding to Connection Migration {#migration-response}\n+\n+Receiving a packet from a new peer address containing a non-probing frame\n+indicates that the peer has migrated to that address.\n+\n+In response to such a packet, an endpoint MUST start sending subsequent packets\n+to the new peer address and MUST initiate path validation ({{migrate-validate}})\n+to verify the peer's ownership of the unvalidated address.\n+\n+An endpoint MAY send data to an unvalidated peer address, but it MUST protect\n+against potential attacks as described in {{address-spoofing}} and\n+{{on-path-spoofing}}.  An endpoint MAY skip validation of a peer address if that\n+address has been seen recently.\n+\n+An endpoint only changes the address that it sends packets to in response to the\n+highest-numbered non-probing packet. This ensures that an endpoint does not send\n+packets to an old peer address in the case that it receives reordered packets.\n+\n+After changing the address to which it sends non-probing packets, an endpoint\n+could abandon any path validation for other addresses.\n+\n+Receiving a packet from a new peer address might be the result of a NAT\n+rebinding at the peer.\n+\n+After verifying a new client address, the server SHOULD send new address\n+validation tokens ({{address-validation}}) to the client.\n+\n+\n+#### Handling Address Spoofing by a Peer {#address-spoofing}\n+\n+It is possible that a peer is spoofing its source address to cause an endpoint\n+to send excessive amounts of data to an unwilling host.  If the endpoint sends\n+significantly more data than the spoofing peer, connection migration might be\n+used to amplify the volume of data that an attacker can generate toward a\n+victim.\n+\n+As described in {{migration-response}}, an endpoint is required to validate a\n+peer's new address to confirm the peer's possession of the new address.  Until a\n+peer's address is deemed valid, an endpoint MUST limit the rate at which it\n+sends data to this address.  The endpoint MUST NOT send more than a minimum\n+congestion window's worth of data per estimated round-trip time (as defined in\n+{{QUIC-RECOVERY}}).  In the absence of this limit, an endpoint risks being used\n+for a denial of service attack against an unsuspecting victim.  Note that since\n+the endpoint will not have any round-trip time measurements to this address, the\n+estimate SHOULD be the default initial value (see {{QUIC-RECOVERY}}).\n+\n+An endpoint SHOULD NOT apply this rate limit when the endpoint skips validation","path":"draft-ietf-quic-transport.md","position":239,"original_position":239,"commit_id":"3285b54e085d8165c773420dbe5a39cf6bbb311a","original_commit_id":"3285b54e085d8165c773420dbe5a39cf6bbb311a","user":{"login":"martinthomson","id":67641,"avatar_url":"https://avatars1.githubusercontent.com/u/67641?v=4","gravatar_id":"","url":"https://api.github.com/users/martinthomson","html_url":"https://github.com/martinthomson","followers_url":"https://api.github.com/users/martinthomson/followers","following_url":"https://api.github.com/users/martinthomson/following{/other_user}","gists_url":"https://api.github.com/users/martinthomson/gists{/gist_id}","starred_url":"https://api.github.com/users/martinthomson/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/martinthomson/subscriptions","organizations_url":"https://api.github.com/users/martinthomson/orgs","repos_url":"https://api.github.com/users/martinthomson/repos","events_url":"https://api.github.com/users/martinthomson/events{/privacy}","received_events_url":"https://api.github.com/users/martinthomson/received_events","type":"User","site_admin":false},"body":"Remove the \"SHOULD NOT\" (no interop requirement here).  Maybe:\r\n\r\nIf an endpoint skips validation of a peer address as described in {{migration-responses}}, it does not need to limit its sending rate.","created_at":"2018-03-27T00:26:30Z","updated_at":"2018-03-27T00:33:51Z","html_url":"https://github.com/quicwg/base-drafts/pull/1249#discussion_r177274496","pull_request_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments/177274496"},"html":{"href":"https://github.com/quicwg/base-drafts/pull/1249#discussion_r177274496"},"pull_request":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249"}}},"pull_request":{"url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249","id":177598721,"html_url":"https://github.com/quicwg/base-drafts/pull/1249","diff_url":"https://github.com/quicwg/base-drafts/pull/1249.diff","patch_url":"https://github.com/quicwg/base-drafts/pull/1249.patch","issue_url":"https://api.github.com/repos/quicwg/base-drafts/issues/1249","number":1249,"state":"open","locked":false,"title":"A more complete connection migration","user":{"login":"janaiyengar","id":11067604,"avatar_url":"https://avatars2.githubusercontent.com/u/11067604?v=4","gravatar_id":"","url":"https://api.github.com/users/janaiyengar","html_url":"https://github.com/janaiyengar","followers_url":"https://api.github.com/users/janaiyengar/followers","following_url":"https://api.github.com/users/janaiyengar/following{/other_user}","gists_url":"https://api.github.com/users/janaiyengar/gists{/gist_id}","starred_url":"https://api.github.com/users/janaiyengar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janaiyengar/subscriptions","organizations_url":"https://api.github.com/users/janaiyengar/orgs","repos_url":"https://api.github.com/users/janaiyengar/repos","events_url":"https://api.github.com/users/janaiyengar/events{/privacy}","received_events_url":"https://api.github.com/users/janaiyengar/received_events","type":"User","site_admin":false},"body":"Closes #880 and #1012.\r\n\r\nMoved #1012 here because unicorns are not nice.\r\n\r\nThis PR describes a more complete connection migration design, including:\r\n- Allowing an endpoint to probe alternate paths without having to use them for data.\r\n- Ensure that an endpoint validates peer ownership of a new address.\r\n","created_at":"2018-03-26T23:59:50Z","updated_at":"2018-03-27T00:33:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"610966914efaf31b0c239b91cd620f7e0f3bf044","assignee":null,"assignees":[],"requested_reviewers":[{"login":"MikeBishop","id":4273797,"avatar_url":"https://avatars0.githubusercontent.com/u/4273797?v=4","gravatar_id":"","url":"https://api.github.com/users/MikeBishop","html_url":"https://github.com/MikeBishop","followers_url":"https://api.github.com/users/MikeBishop/followers","following_url":"https://api.github.com/users/MikeBishop/following{/other_user}","gists_url":"https://api.github.com/users/MikeBishop/gists{/gist_id}","starred_url":"https://api.github.com/users/MikeBishop/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/MikeBishop/subscriptions","organizations_url":"https://api.github.com/users/MikeBishop/orgs","repos_url":"https://api.github.com/users/MikeBishop/repos","events_url":"https://api.github.com/users/MikeBishop/events{/privacy}","received_events_url":"https://api.github.com/users/MikeBishop/received_events","type":"User","site_admin":false},{"login":"ianswett","id":20072817,"avatar_url":"https://avatars1.githubusercontent.com/u/20072817?v=4","gravatar_id":"","url":"https://api.github.com/users/ianswett","html_url":"https://github.com/ianswett","followers_url":"https://api.github.com/users/ianswett/followers","following_url":"https://api.github.com/users/ianswett/following{/other_user}","gists_url":"https://api.github.com/users/ianswett/gists{/gist_id}","starred_url":"https://api.github.com/users/ianswett/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ianswett/subscriptions","organizations_url":"https://api.github.com/users/ianswett/orgs","repos_url":"https://api.github.com/users/ianswett/repos","events_url":"https://api.github.com/users/ianswett/events{/privacy}","received_events_url":"https://api.github.com/users/ianswett/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249/commits","review_comments_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249/comments","review_comment_url":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments{/number}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/issues/1249/comments","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/3285b54e085d8165c773420dbe5a39cf6bbb311a","head":{"label":"quicwg:migration3","ref":"migration3","sha":"3285b54e085d8165c773420dbe5a39cf6bbb311a","user":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"repo":{"id":73779599,"name":"base-drafts","full_name":"quicwg/base-drafts","owner":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quicwg/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":false,"url":"https://api.github.com/repos/quicwg/base-drafts","forks_url":"https://api.github.com/repos/quicwg/base-drafts/forks","keys_url":"https://api.github.com/repos/quicwg/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quicwg/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quicwg/base-drafts/teams","hooks_url":"https://api.github.com/repos/quicwg/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/quicwg/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/quicwg/base-drafts/events","assignees_url":"https://api.github.com/repos/quicwg/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/quicwg/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/quicwg/base-drafts/tags","blobs_url":"https://api.github.com/repos/quicwg/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quicwg/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quicwg/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/quicwg/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/quicwg/base-drafts/languages","stargazers_url":"https://api.github.com/repos/quicwg/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/quicwg/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/quicwg/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/quicwg/base-drafts/subscription","commits_url":"https://api.github.com/repos/quicwg/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/quicwg/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/quicwg/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/quicwg/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/quicwg/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quicwg/base-drafts/merges","archive_url":"https://api.github.com/repos/quicwg/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quicwg/base-drafts/downloads","issues_url":"https://api.github.com/repos/quicwg/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/quicwg/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/quicwg/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/quicwg/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quicwg/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/quicwg/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/quicwg/base-drafts/deployments","created_at":"2016-11-15T05:30:30Z","updated_at":"2018-03-26T19:30:29Z","pushed_at":"2018-03-26T23:59:51Z","git_url":"git://github.com/quicwg/base-drafts.git","ssh_url":"git@github.com:quicwg/base-drafts.git","clone_url":"https://github.com/quicwg/base-drafts.git","svn_url":"https://github.com/quicwg/base-drafts","homepage":"https://quicwg.github.io/","size":45326,"stargazers_count":218,"watchers_count":218,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":52,"mirror_url":null,"archived":false,"open_issues_count":121,"license":null,"forks":52,"open_issues":121,"watchers":218,"default_branch":"master"}},"base":{"label":"quicwg:master","ref":"master","sha":"a2e6c8b9d31179c84cdece343a7a3d9da8e99353","user":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"repo":{"id":73779599,"name":"base-drafts","full_name":"quicwg/base-drafts","owner":{"login":"quicwg","id":22631371,"avatar_url":"https://avatars3.githubusercontent.com/u/22631371?v=4","gravatar_id":"","url":"https://api.github.com/users/quicwg","html_url":"https://github.com/quicwg","followers_url":"https://api.github.com/users/quicwg/followers","following_url":"https://api.github.com/users/quicwg/following{/other_user}","gists_url":"https://api.github.com/users/quicwg/gists{/gist_id}","starred_url":"https://api.github.com/users/quicwg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/quicwg/subscriptions","organizations_url":"https://api.github.com/users/quicwg/orgs","repos_url":"https://api.github.com/users/quicwg/repos","events_url":"https://api.github.com/users/quicwg/events{/privacy}","received_events_url":"https://api.github.com/users/quicwg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/quicwg/base-drafts","description":" Internet-Drafts that make up the base QUIC specification","fork":false,"url":"https://api.github.com/repos/quicwg/base-drafts","forks_url":"https://api.github.com/repos/quicwg/base-drafts/forks","keys_url":"https://api.github.com/repos/quicwg/base-drafts/keys{/key_id}","collaborators_url":"https://api.github.com/repos/quicwg/base-drafts/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/quicwg/base-drafts/teams","hooks_url":"https://api.github.com/repos/quicwg/base-drafts/hooks","issue_events_url":"https://api.github.com/repos/quicwg/base-drafts/issues/events{/number}","events_url":"https://api.github.com/repos/quicwg/base-drafts/events","assignees_url":"https://api.github.com/repos/quicwg/base-drafts/assignees{/user}","branches_url":"https://api.github.com/repos/quicwg/base-drafts/branches{/branch}","tags_url":"https://api.github.com/repos/quicwg/base-drafts/tags","blobs_url":"https://api.github.com/repos/quicwg/base-drafts/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/quicwg/base-drafts/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/quicwg/base-drafts/git/refs{/sha}","trees_url":"https://api.github.com/repos/quicwg/base-drafts/git/trees{/sha}","statuses_url":"https://api.github.com/repos/quicwg/base-drafts/statuses/{sha}","languages_url":"https://api.github.com/repos/quicwg/base-drafts/languages","stargazers_url":"https://api.github.com/repos/quicwg/base-drafts/stargazers","contributors_url":"https://api.github.com/repos/quicwg/base-drafts/contributors","subscribers_url":"https://api.github.com/repos/quicwg/base-drafts/subscribers","subscription_url":"https://api.github.com/repos/quicwg/base-drafts/subscription","commits_url":"https://api.github.com/repos/quicwg/base-drafts/commits{/sha}","git_commits_url":"https://api.github.com/repos/quicwg/base-drafts/git/commits{/sha}","comments_url":"https://api.github.com/repos/quicwg/base-drafts/comments{/number}","issue_comment_url":"https://api.github.com/repos/quicwg/base-drafts/issues/comments{/number}","contents_url":"https://api.github.com/repos/quicwg/base-drafts/contents/{+path}","compare_url":"https://api.github.com/repos/quicwg/base-drafts/compare/{base}...{head}","merges_url":"https://api.github.com/repos/quicwg/base-drafts/merges","archive_url":"https://api.github.com/repos/quicwg/base-drafts/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/quicwg/base-drafts/downloads","issues_url":"https://api.github.com/repos/quicwg/base-drafts/issues{/number}","pulls_url":"https://api.github.com/repos/quicwg/base-drafts/pulls{/number}","milestones_url":"https://api.github.com/repos/quicwg/base-drafts/milestones{/number}","notifications_url":"https://api.github.com/repos/quicwg/base-drafts/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/quicwg/base-drafts/labels{/name}","releases_url":"https://api.github.com/repos/quicwg/base-drafts/releases{/id}","deployments_url":"https://api.github.com/repos/quicwg/base-drafts/deployments","created_at":"2016-11-15T05:30:30Z","updated_at":"2018-03-26T19:30:29Z","pushed_at":"2018-03-26T23:59:51Z","git_url":"git://github.com/quicwg/base-drafts.git","ssh_url":"git@github.com:quicwg/base-drafts.git","clone_url":"https://github.com/quicwg/base-drafts.git","svn_url":"https://github.com/quicwg/base-drafts","homepage":"https://quicwg.github.io/","size":45326,"stargazers_count":218,"watchers_count":218,"language":"Python","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":52,"mirror_url":null,"archived":false,"open_issues_count":121,"license":null,"forks":52,"open_issues":121,"watchers":218,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249"},"html":{"href":"https://github.com/quicwg/base-drafts/pull/1249"},"issue":{"href":"https://api.github.com/repos/quicwg/base-drafts/issues/1249"},"comments":{"href":"https://api.github.com/repos/quicwg/base-drafts/issues/1249/comments"},"review_comments":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249/comments"},"review_comment":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/quicwg/base-drafts/pulls/1249/commits"},"statuses":{"href":"https://api.github.com/repos/quicwg/base-drafts/statuses/3285b54e085d8165c773420dbe5a39cf6bbb311a"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"martinthomson"}}