{"action":"closed","number":856,"pull_request":{"url":"https://api.github.com/repos/sferik/twitter/pulls/856","id":125825751,"html_url":"https://github.com/sferik/twitter/pull/856","diff_url":"https://github.com/sferik/twitter/pull/856.diff","patch_url":"https://github.com/sferik/twitter/pull/856.patch","issue_url":"https://api.github.com/repos/sferik/twitter/issues/856","number":856,"state":"closed","locked":false,"title":"[6-stable] Add TCP keepalive in Twitter::Streaming::Connection","user":{"login":"prograhamer","id":13635297,"avatar_url":"https://avatars1.githubusercontent.com/u/13635297?v=4","gravatar_id":"","url":"https://api.github.com/users/prograhamer","html_url":"https://github.com/prograhamer","followers_url":"https://api.github.com/users/prograhamer/followers","following_url":"https://api.github.com/users/prograhamer/following{/other_user}","gists_url":"https://api.github.com/users/prograhamer/gists{/gist_id}","starred_url":"https://api.github.com/users/prograhamer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prograhamer/subscriptions","organizations_url":"https://api.github.com/users/prograhamer/orgs","repos_url":"https://api.github.com/users/prograhamer/repos","events_url":"https://api.github.com/users/prograhamer/events{/privacy}","received_events_url":"https://api.github.com/users/prograhamer/received_events","type":"User","site_admin":false},"body":"Without correct TCP keepalive setup, the Twitter streaming client is prone to hang on long-lived connections. This is due to the nature of the protocol: a single request is made, then the client simply waits for data to read on a socket. Without keepalive, it may be indistinguishable to the client whether the connection has failed or there is simply no data to read.\r\n\r\nThese changes add the ability to set TCP keepalive providing the OS supports it. They also provide a set of sensible defaults to the keepalive for this implementation, while disabled by default.","created_at":"2017-06-15T13:48:31Z","updated_at":"2017-11-08T21:25:47Z","closed_at":"2017-11-08T21:25:47Z","merged_at":"2017-11-08T21:25:47Z","merge_commit_sha":"d9cde55a3972e2277331cf3a9102ed52427ee2ab","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":null,"commits_url":"https://api.github.com/repos/sferik/twitter/pulls/856/commits","review_comments_url":"https://api.github.com/repos/sferik/twitter/pulls/856/comments","review_comment_url":"https://api.github.com/repos/sferik/twitter/pulls/comments{/number}","comments_url":"https://api.github.com/repos/sferik/twitter/issues/856/comments","statuses_url":"https://api.github.com/repos/sferik/twitter/statuses/893a0723d7ccdca90389b0addc6a020d9bf3cb8b","head":{"label":"prograhamer:tcp-keepalive-6-stable","ref":"tcp-keepalive-6-stable","sha":"893a0723d7ccdca90389b0addc6a020d9bf3cb8b","user":{"login":"prograhamer","id":13635297,"avatar_url":"https://avatars1.githubusercontent.com/u/13635297?v=4","gravatar_id":"","url":"https://api.github.com/users/prograhamer","html_url":"https://github.com/prograhamer","followers_url":"https://api.github.com/users/prograhamer/followers","following_url":"https://api.github.com/users/prograhamer/following{/other_user}","gists_url":"https://api.github.com/users/prograhamer/gists{/gist_id}","starred_url":"https://api.github.com/users/prograhamer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prograhamer/subscriptions","organizations_url":"https://api.github.com/users/prograhamer/orgs","repos_url":"https://api.github.com/users/prograhamer/repos","events_url":"https://api.github.com/users/prograhamer/events{/privacy}","received_events_url":"https://api.github.com/users/prograhamer/received_events","type":"User","site_admin":false},"repo":{"id":94257512,"name":"twitter","full_name":"prograhamer/twitter","owner":{"login":"prograhamer","id":13635297,"avatar_url":"https://avatars1.githubusercontent.com/u/13635297?v=4","gravatar_id":"","url":"https://api.github.com/users/prograhamer","html_url":"https://github.com/prograhamer","followers_url":"https://api.github.com/users/prograhamer/followers","following_url":"https://api.github.com/users/prograhamer/following{/other_user}","gists_url":"https://api.github.com/users/prograhamer/gists{/gist_id}","starred_url":"https://api.github.com/users/prograhamer/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/prograhamer/subscriptions","organizations_url":"https://api.github.com/users/prograhamer/orgs","repos_url":"https://api.github.com/users/prograhamer/repos","events_url":"https://api.github.com/users/prograhamer/events{/privacy}","received_events_url":"https://api.github.com/users/prograhamer/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/prograhamer/twitter","description":"A Ruby interface to the Twitter API.","fork":true,"url":"https://api.github.com/repos/prograhamer/twitter","forks_url":"https://api.github.com/repos/prograhamer/twitter/forks","keys_url":"https://api.github.com/repos/prograhamer/twitter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/prograhamer/twitter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/prograhamer/twitter/teams","hooks_url":"https://api.github.com/repos/prograhamer/twitter/hooks","issue_events_url":"https://api.github.com/repos/prograhamer/twitter/issues/events{/number}","events_url":"https://api.github.com/repos/prograhamer/twitter/events","assignees_url":"https://api.github.com/repos/prograhamer/twitter/assignees{/user}","branches_url":"https://api.github.com/repos/prograhamer/twitter/branches{/branch}","tags_url":"https://api.github.com/repos/prograhamer/twitter/tags","blobs_url":"https://api.github.com/repos/prograhamer/twitter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/prograhamer/twitter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/prograhamer/twitter/git/refs{/sha}","trees_url":"https://api.github.com/repos/prograhamer/twitter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/prograhamer/twitter/statuses/{sha}","languages_url":"https://api.github.com/repos/prograhamer/twitter/languages","stargazers_url":"https://api.github.com/repos/prograhamer/twitter/stargazers","contributors_url":"https://api.github.com/repos/prograhamer/twitter/contributors","subscribers_url":"https://api.github.com/repos/prograhamer/twitter/subscribers","subscription_url":"https://api.github.com/repos/prograhamer/twitter/subscription","commits_url":"https://api.github.com/repos/prograhamer/twitter/commits{/sha}","git_commits_url":"https://api.github.com/repos/prograhamer/twitter/git/commits{/sha}","comments_url":"https://api.github.com/repos/prograhamer/twitter/comments{/number}","issue_comment_url":"https://api.github.com/repos/prograhamer/twitter/issues/comments{/number}","contents_url":"https://api.github.com/repos/prograhamer/twitter/contents/{+path}","compare_url":"https://api.github.com/repos/prograhamer/twitter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/prograhamer/twitter/merges","archive_url":"https://api.github.com/repos/prograhamer/twitter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/prograhamer/twitter/downloads","issues_url":"https://api.github.com/repos/prograhamer/twitter/issues{/number}","pulls_url":"https://api.github.com/repos/prograhamer/twitter/pulls{/number}","milestones_url":"https://api.github.com/repos/prograhamer/twitter/milestones{/number}","notifications_url":"https://api.github.com/repos/prograhamer/twitter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/prograhamer/twitter/labels{/name}","releases_url":"https://api.github.com/repos/prograhamer/twitter/releases{/id}","deployments_url":"https://api.github.com/repos/prograhamer/twitter/deployments","created_at":"2017-06-13T21:01:11Z","updated_at":"2017-08-01T14:38:06Z","pushed_at":"2017-06-20T19:07:16Z","git_url":"git://github.com/prograhamer/twitter.git","ssh_url":"git@github.com:prograhamer/twitter.git","clone_url":"https://github.com/prograhamer/twitter.git","svn_url":"https://github.com/prograhamer/twitter","homepage":"http://www.rubydoc.info/gems/twitter","size":19807,"stargazers_count":1,"watchers_count":1,"language":"Ruby","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":1,"default_branch":"master"}},"base":{"label":"sferik:6-stable","ref":"6-stable","sha":"85c1947f4a0a6b579a300fd3bf7a4aea066ee4e1","user":{"login":"sferik","id":10308,"avatar_url":"https://avatars1.githubusercontent.com/u/10308?v=4","gravatar_id":"","url":"https://api.github.com/users/sferik","html_url":"https://github.com/sferik","followers_url":"https://api.github.com/users/sferik/followers","following_url":"https://api.github.com/users/sferik/following{/other_user}","gists_url":"https://api.github.com/users/sferik/gists{/gist_id}","starred_url":"https://api.github.com/users/sferik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sferik/subscriptions","organizations_url":"https://api.github.com/users/sferik/orgs","repos_url":"https://api.github.com/users/sferik/repos","events_url":"https://api.github.com/users/sferik/events{/privacy}","received_events_url":"https://api.github.com/users/sferik/received_events","type":"User","site_admin":false},"repo":{"id":507,"name":"twitter","full_name":"sferik/twitter","owner":{"login":"sferik","id":10308,"avatar_url":"https://avatars1.githubusercontent.com/u/10308?v=4","gravatar_id":"","url":"https://api.github.com/users/sferik","html_url":"https://github.com/sferik","followers_url":"https://api.github.com/users/sferik/followers","following_url":"https://api.github.com/users/sferik/following{/other_user}","gists_url":"https://api.github.com/users/sferik/gists{/gist_id}","starred_url":"https://api.github.com/users/sferik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sferik/subscriptions","organizations_url":"https://api.github.com/users/sferik/orgs","repos_url":"https://api.github.com/users/sferik/repos","events_url":"https://api.github.com/users/sferik/events{/privacy}","received_events_url":"https://api.github.com/users/sferik/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/sferik/twitter","description":"A Ruby interface to the Twitter API.","fork":false,"url":"https://api.github.com/repos/sferik/twitter","forks_url":"https://api.github.com/repos/sferik/twitter/forks","keys_url":"https://api.github.com/repos/sferik/twitter/keys{/key_id}","collaborators_url":"https://api.github.com/repos/sferik/twitter/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/sferik/twitter/teams","hooks_url":"https://api.github.com/repos/sferik/twitter/hooks","issue_events_url":"https://api.github.com/repos/sferik/twitter/issues/events{/number}","events_url":"https://api.github.com/repos/sferik/twitter/events","assignees_url":"https://api.github.com/repos/sferik/twitter/assignees{/user}","branches_url":"https://api.github.com/repos/sferik/twitter/branches{/branch}","tags_url":"https://api.github.com/repos/sferik/twitter/tags","blobs_url":"https://api.github.com/repos/sferik/twitter/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/sferik/twitter/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/sferik/twitter/git/refs{/sha}","trees_url":"https://api.github.com/repos/sferik/twitter/git/trees{/sha}","statuses_url":"https://api.github.com/repos/sferik/twitter/statuses/{sha}","languages_url":"https://api.github.com/repos/sferik/twitter/languages","stargazers_url":"https://api.github.com/repos/sferik/twitter/stargazers","contributors_url":"https://api.github.com/repos/sferik/twitter/contributors","subscribers_url":"https://api.github.com/repos/sferik/twitter/subscribers","subscription_url":"https://api.github.com/repos/sferik/twitter/subscription","commits_url":"https://api.github.com/repos/sferik/twitter/commits{/sha}","git_commits_url":"https://api.github.com/repos/sferik/twitter/git/commits{/sha}","comments_url":"https://api.github.com/repos/sferik/twitter/comments{/number}","issue_comment_url":"https://api.github.com/repos/sferik/twitter/issues/comments{/number}","contents_url":"https://api.github.com/repos/sferik/twitter/contents/{+path}","compare_url":"https://api.github.com/repos/sferik/twitter/compare/{base}...{head}","merges_url":"https://api.github.com/repos/sferik/twitter/merges","archive_url":"https://api.github.com/repos/sferik/twitter/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/sferik/twitter/downloads","issues_url":"https://api.github.com/repos/sferik/twitter/issues{/number}","pulls_url":"https://api.github.com/repos/sferik/twitter/pulls{/number}","milestones_url":"https://api.github.com/repos/sferik/twitter/milestones{/number}","notifications_url":"https://api.github.com/repos/sferik/twitter/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/sferik/twitter/labels{/name}","releases_url":"https://api.github.com/repos/sferik/twitter/releases{/id}","deployments_url":"https://api.github.com/repos/sferik/twitter/deployments","created_at":"2008-02-14T02:20:50Z","updated_at":"2017-11-07T15:55:04Z","pushed_at":"2017-11-08T21:25:47Z","git_url":"git://github.com/sferik/twitter.git","ssh_url":"git@github.com:sferik/twitter.git","clone_url":"https://github.com/sferik/twitter.git","svn_url":"https://github.com/sferik/twitter","homepage":"http://www.rubydoc.info/gems/twitter","size":19808,"stargazers_count":3952,"watchers_count":3952,"language":"Ruby","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":1035,"mirror_url":null,"archived":false,"open_issues_count":95,"forks":1035,"open_issues":95,"watchers":3952,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/sferik/twitter/pulls/856"},"html":{"href":"https://github.com/sferik/twitter/pull/856"},"issue":{"href":"https://api.github.com/repos/sferik/twitter/issues/856"},"comments":{"href":"https://api.github.com/repos/sferik/twitter/issues/856/comments"},"review_comments":{"href":"https://api.github.com/repos/sferik/twitter/pulls/856/comments"},"review_comment":{"href":"https://api.github.com/repos/sferik/twitter/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/sferik/twitter/pulls/856/commits"},"statuses":{"href":"https://api.github.com/repos/sferik/twitter/statuses/893a0723d7ccdca90389b0addc6a020d9bf3cb8b"}},"author_association":"NONE","merged":true,"mergeable":null,"rebaseable":null,"mergeable_state":"unknown","merged_by":{"login":"sferik","id":10308,"avatar_url":"https://avatars1.githubusercontent.com/u/10308?v=4","gravatar_id":"","url":"https://api.github.com/users/sferik","html_url":"https://github.com/sferik","followers_url":"https://api.github.com/users/sferik/followers","following_url":"https://api.github.com/users/sferik/following{/other_user}","gists_url":"https://api.github.com/users/sferik/gists{/gist_id}","starred_url":"https://api.github.com/users/sferik/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sferik/subscriptions","organizations_url":"https://api.github.com/users/sferik/orgs","repos_url":"https://api.github.com/users/sferik/repos","events_url":"https://api.github.com/users/sferik/events{/privacy}","received_events_url":"https://api.github.com/users/sferik/received_events","type":"User","site_admin":false},"comments":0,"review_comments":0,"maintainer_can_modify":false,"commits":2,"additions":96,"deletions":2,"changed_files":2}}
{"actor":{"display_login":"sferik"}}