{"action":"closed","number":165,"pull_request":{"url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/165","id":46360120,"html_url":"https://github.com/noodlefrenzy/node-amqp10/pull/165","diff_url":"https://github.com/noodlefrenzy/node-amqp10/pull/165.diff","patch_url":"https://github.com/noodlefrenzy/node-amqp10/pull/165.patch","issue_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues/165","number":165,"state":"closed","locked":false,"title":"DOS attack when server requires SASL and client doesnt give creds","user":{"login":"danlangford","id":721364,"avatar_url":"https://avatars.githubusercontent.com/u/721364?v=3","gravatar_id":"","url":"https://api.github.com/users/danlangford","html_url":"https://github.com/danlangford","followers_url":"https://api.github.com/users/danlangford/followers","following_url":"https://api.github.com/users/danlangford/following{/other_user}","gists_url":"https://api.github.com/users/danlangford/gists{/gist_id}","starred_url":"https://api.github.com/users/danlangford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danlangford/subscriptions","organizations_url":"https://api.github.com/users/danlangford/orgs","repos_url":"https://api.github.com/users/danlangford/repos","events_url":"https://api.github.com/users/danlangford/events{/privacy}","received_events_url":"https://api.github.com/users/danlangford/received_events","type":"User","site_admin":false},"body":"my local QPID server requires SASL auth and i forgot to put my credentials in the connection string. the resulting infinite loop essentially performed a DOS attack on my server until it crashed.\r\n\r\nhere is the code:\r\n```javascript\r\nvar AMQPClient = require('amqp10');\r\nvar client = new AMQPClient();\r\nclient.connect('amqp://localhost/myqueue')\r\n  .then(function() {\r\n    client.receive(function (rx_err, message) {\r\n      // ... check for errors ...\r\n      console.log('Rx message: ');\r\n      console.log(JSON.parse(message.body));\r\n    });\r\n    return client.send(JSON.stringify({ key: \"Value\" }));\r\n  })\r\n  .catch(function(err) {\r\n    console.log(\"error: \" + err);\r\n  });\r\n```\r\n\r\n```\r\nnode app.js\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Sending Header 414d515000010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from START to HDR_SENT due to connected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Rx: 414d515003010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Server AMQP Version: 414d515003010000 vs 414d515000010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connection error:  Invalid AMQP version received: 414d515003010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Disconnected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from HDR_SENT to DISCONNECTING due to invalidVersion\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Disconnected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTING to DISCONNECTED due to terminated\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Sending Header 414d515000010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from START to HDR_SENT due to connected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Sending Header 414d515000010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from START to HDR_SENT due to connected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Rx: 414d515003010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Server AMQP Version: 414d515003010000 vs 414d515000010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connection error:  Invalid AMQP version received: 414d515003010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Disconnected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from HDR_SENT to DISCONNECTING due to invalidVersion\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Disconnected\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Transitioning from DISCONNECTING to DISCONNECTED due to terminated\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Rx: 414d515003010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-Connection Server AMQP Version: 414d515003010000 vs 414d515000010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Connection error:  Invalid AMQP version received: 414d515003010000\r\nTue, 29 Sep 2015 21:44:09 GMT amqp10-client Disconnected\r\n...\r\n(node) warning: possible EventEmitter memory leak detected. 11 Session.Mapped listeners added. Use emitter.setMaxListeners() to increase limit.\r\nTrace\r\n    at AMQPClient.addListener (events.js:179:15)\r\n    at AMQPClient._attemptReconnection (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/amqp_client.js:626:8)\r\n    at Connection.<anonymous> (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/amqp_client.js:211:12)\r\n    at Connection.emit (events.js:107:17)\r\n    at Connection._terminate (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/connection.js:551:8)\r\n    at Object.Connection.stateMachine.HDR_SENT.invalidVersion (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/connection.js:228:14)\r\n    at Object.event [as invalidVersion] (/Users/danlangford/Code/node-amqp/node_modules/amqp10/node_modules/stately.js/Stately.js:206:67)\r\n    at Connection._tryReceiveHeader (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/connection.js:391:21)\r\n    at Connection._receiveAny (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/connection.js:431:21)\r\n    at Connection._receiveData (/Users/danlangford/Code/node-amqp/node_modules/amqp10/lib/connection.js:363:8)\r\n...\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Transitioning from START to DISCONNECTED due to error\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Error from socket: Error: connect ECONNREFUSED\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-client Connection error:  { [Error: connect ECONNREFUSED]\r\n  code: 'ECONNREFUSED',\r\n  errno: 'ECONNREFUSED',\r\n  syscall: 'connect' }\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-client Disconnected\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-client Connecting to amqp://localhost/myqueue\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Connecting to localhost:5672 via straight-up sockets\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Transitioning from DISCONNECTED to START due to connect\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Transitioning from START to DISCONNECTED due to error\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-Connection Error from socket: Error: connect ECONNREFUSED\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-client Connection error:  { [Error: connect ECONNREFUSED]\r\n  code: 'ECONNREFUSED',\r\n  errno: 'ECONNREFUSED',\r\n  syscall: 'connect' }\r\nTue, 29 Sep 2015 21:54:37 GMT amqp10-client Disconnected\r\n```\r\n\r\nwhile the server did this:\r\n```\r\n...\r\n[Broker] MNG-1004 : JMX Management Ready\r\n[Broker] BRK-1004 : Qpid Broker Ready\r\n\r\n########################################################################\r\n#\r\n# Unhandled Exception java.lang.OutOfMemoryError: unable to create new native thread in Thread IoNetworkAcceptor - 0.0.0.0/0.0.0.0:5672\r\n#\r\n# Exiting\r\n#\r\n########################################################################\r\njava.lang.OutOfMemoryError: unable to create new native thread\r\n...\r\n```\r\n\r\nand crashed.\r\n\r\n(dont use those timestamps to assume length of time, i was piecing together logs )\r\n\r\ni traced the beginning of the confusion down to here:\r\n```javascript\r\nif (this.sasl) {\r\n      this.sasl.headerReceived(serverVersion);\r\n    } else {\r\n      debug('Server AMQP Version: ' + serverVersion.toString('hex') + ' vs ' + header.toString('hex'));\r\n      if (this.connSM.getMachineState() === 'START') {\r\n        this.connSM.headerReceived();\r\n      }\r\n\r\n      if (utils.bufferEquals(serverVersion, constants.amqpVersion)) {\r\n        this.connSM.validVersion();\r\n        this.connSM.sendOpen();\r\n      } else {\r\n        this.emit(Connection.ErrorReceived, 'Invalid AMQP version received: ' + serverVersion.toString('hex'));\r\n        this.connSM.invalidVersion();\r\n      }\r\n      this._receivedHeader = true;\r\n    }\r\n```\r\n\r\nyou see the logic says `if (this.sasl)` and `this.sasl` was only created if the url had a user in it like `amqps://user:pass@localhost/myqueue`. `this.sasl` does not exist so we fall down to the the `if (utils.bufferEquals(serverVersion, constants.amqpVersion)) ` which is false because the server sent a SASL version number. server responded `AMQP3100` we are testing against `AMQP0100`\r\n\r\nultimately the infinite loop is here\r\n```javascript\r\n    if (self._shouldReconnect()) {\r\n      self._attemptReconnection();\r\n    }\r\n```\r\n\r\nand i didnt see clearly the correct way to disable reconnects. \r\n\r\ni added a user name and password and im good to go HOWEVER im just grateful that i did not start by pointing it at a broker that is actually used. :-P\n\n<!-- Reviewable:start -->\n[<img src=\"https://reviewable.io/review_button.png\" height=40 alt=\"Review on Reviewable\"/>](https://reviewable.io/reviews/noodlefrenzy/node-amqp10/165)\n<!-- Reviewable:end -->\n","created_at":"2015-09-30T04:20:38Z","updated_at":"2015-09-30T11:40:02Z","closed_at":"2015-09-30T11:40:02Z","merged_at":"2015-09-30T11:40:02Z","merge_commit_sha":"870f2b2b45c1077bff2582f5dc87bd1b5ff91249","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/165/commits","review_comments_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/165/comments","review_comment_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/comments{/number}","comments_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues/165/comments","statuses_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/statuses/04a1f5f7d35c3852a0fbcd1f459181a4ccffad25","head":{"label":"danlangford:master","ref":"master","sha":"04a1f5f7d35c3852a0fbcd1f459181a4ccffad25","user":{"login":"danlangford","id":721364,"avatar_url":"https://avatars.githubusercontent.com/u/721364?v=3","gravatar_id":"","url":"https://api.github.com/users/danlangford","html_url":"https://github.com/danlangford","followers_url":"https://api.github.com/users/danlangford/followers","following_url":"https://api.github.com/users/danlangford/following{/other_user}","gists_url":"https://api.github.com/users/danlangford/gists{/gist_id}","starred_url":"https://api.github.com/users/danlangford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danlangford/subscriptions","organizations_url":"https://api.github.com/users/danlangford/orgs","repos_url":"https://api.github.com/users/danlangford/repos","events_url":"https://api.github.com/users/danlangford/events{/privacy}","received_events_url":"https://api.github.com/users/danlangford/received_events","type":"User","site_admin":false},"repo":{"id":43407074,"name":"node-amqp10","full_name":"danlangford/node-amqp10","owner":{"login":"danlangford","id":721364,"avatar_url":"https://avatars.githubusercontent.com/u/721364?v=3","gravatar_id":"","url":"https://api.github.com/users/danlangford","html_url":"https://github.com/danlangford","followers_url":"https://api.github.com/users/danlangford/followers","following_url":"https://api.github.com/users/danlangford/following{/other_user}","gists_url":"https://api.github.com/users/danlangford/gists{/gist_id}","starred_url":"https://api.github.com/users/danlangford/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/danlangford/subscriptions","organizations_url":"https://api.github.com/users/danlangford/orgs","repos_url":"https://api.github.com/users/danlangford/repos","events_url":"https://api.github.com/users/danlangford/events{/privacy}","received_events_url":"https://api.github.com/users/danlangford/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/danlangford/node-amqp10","description":"AMQP 1.0-compliant Node.js client.  Since AMQP 1.0 is such a large departure from 0.9.1, I've started a new project rather than fork from node-amqp or amqp.node.","fork":true,"url":"https://api.github.com/repos/danlangford/node-amqp10","forks_url":"https://api.github.com/repos/danlangford/node-amqp10/forks","keys_url":"https://api.github.com/repos/danlangford/node-amqp10/keys{/key_id}","collaborators_url":"https://api.github.com/repos/danlangford/node-amqp10/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/danlangford/node-amqp10/teams","hooks_url":"https://api.github.com/repos/danlangford/node-amqp10/hooks","issue_events_url":"https://api.github.com/repos/danlangford/node-amqp10/issues/events{/number}","events_url":"https://api.github.com/repos/danlangford/node-amqp10/events","assignees_url":"https://api.github.com/repos/danlangford/node-amqp10/assignees{/user}","branches_url":"https://api.github.com/repos/danlangford/node-amqp10/branches{/branch}","tags_url":"https://api.github.com/repos/danlangford/node-amqp10/tags","blobs_url":"https://api.github.com/repos/danlangford/node-amqp10/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/danlangford/node-amqp10/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/danlangford/node-amqp10/git/refs{/sha}","trees_url":"https://api.github.com/repos/danlangford/node-amqp10/git/trees{/sha}","statuses_url":"https://api.github.com/repos/danlangford/node-amqp10/statuses/{sha}","languages_url":"https://api.github.com/repos/danlangford/node-amqp10/languages","stargazers_url":"https://api.github.com/repos/danlangford/node-amqp10/stargazers","contributors_url":"https://api.github.com/repos/danlangford/node-amqp10/contributors","subscribers_url":"https://api.github.com/repos/danlangford/node-amqp10/subscribers","subscription_url":"https://api.github.com/repos/danlangford/node-amqp10/subscription","commits_url":"https://api.github.com/repos/danlangford/node-amqp10/commits{/sha}","git_commits_url":"https://api.github.com/repos/danlangford/node-amqp10/git/commits{/sha}","comments_url":"https://api.github.com/repos/danlangford/node-amqp10/comments{/number}","issue_comment_url":"https://api.github.com/repos/danlangford/node-amqp10/issues/comments{/number}","contents_url":"https://api.github.com/repos/danlangford/node-amqp10/contents/{+path}","compare_url":"https://api.github.com/repos/danlangford/node-amqp10/compare/{base}...{head}","merges_url":"https://api.github.com/repos/danlangford/node-amqp10/merges","archive_url":"https://api.github.com/repos/danlangford/node-amqp10/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/danlangford/node-amqp10/downloads","issues_url":"https://api.github.com/repos/danlangford/node-amqp10/issues{/number}","pulls_url":"https://api.github.com/repos/danlangford/node-amqp10/pulls{/number}","milestones_url":"https://api.github.com/repos/danlangford/node-amqp10/milestones{/number}","notifications_url":"https://api.github.com/repos/danlangford/node-amqp10/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/danlangford/node-amqp10/labels{/name}","releases_url":"https://api.github.com/repos/danlangford/node-amqp10/releases{/id}","created_at":"2015-09-30T02:30:06Z","updated_at":"2015-09-30T02:30:07Z","pushed_at":"2015-09-30T04:29:18Z","git_url":"git://github.com/danlangford/node-amqp10.git","ssh_url":"git@github.com:danlangford/node-amqp10.git","clone_url":"https://github.com/danlangford/node-amqp10.git","svn_url":"https://github.com/danlangford/node-amqp10","homepage":null,"size":2774,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"noodlefrenzy:master","ref":"master","sha":"3befc231c774641bd8b48f243e1d49dd81702c42","user":{"login":"noodlefrenzy","id":813544,"avatar_url":"https://avatars.githubusercontent.com/u/813544?v=3","gravatar_id":"","url":"https://api.github.com/users/noodlefrenzy","html_url":"https://github.com/noodlefrenzy","followers_url":"https://api.github.com/users/noodlefrenzy/followers","following_url":"https://api.github.com/users/noodlefrenzy/following{/other_user}","gists_url":"https://api.github.com/users/noodlefrenzy/gists{/gist_id}","starred_url":"https://api.github.com/users/noodlefrenzy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/noodlefrenzy/subscriptions","organizations_url":"https://api.github.com/users/noodlefrenzy/orgs","repos_url":"https://api.github.com/users/noodlefrenzy/repos","events_url":"https://api.github.com/users/noodlefrenzy/events{/privacy}","received_events_url":"https://api.github.com/users/noodlefrenzy/received_events","type":"User","site_admin":false},"repo":{"id":24899166,"name":"node-amqp10","full_name":"noodlefrenzy/node-amqp10","owner":{"login":"noodlefrenzy","id":813544,"avatar_url":"https://avatars.githubusercontent.com/u/813544?v=3","gravatar_id":"","url":"https://api.github.com/users/noodlefrenzy","html_url":"https://github.com/noodlefrenzy","followers_url":"https://api.github.com/users/noodlefrenzy/followers","following_url":"https://api.github.com/users/noodlefrenzy/following{/other_user}","gists_url":"https://api.github.com/users/noodlefrenzy/gists{/gist_id}","starred_url":"https://api.github.com/users/noodlefrenzy/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/noodlefrenzy/subscriptions","organizations_url":"https://api.github.com/users/noodlefrenzy/orgs","repos_url":"https://api.github.com/users/noodlefrenzy/repos","events_url":"https://api.github.com/users/noodlefrenzy/events{/privacy}","received_events_url":"https://api.github.com/users/noodlefrenzy/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/noodlefrenzy/node-amqp10","description":"AMQP 1.0-compliant Node.js client.  Since AMQP 1.0 is such a large departure from 0.9.1, I've started a new project rather than fork from node-amqp or amqp.node.","fork":false,"url":"https://api.github.com/repos/noodlefrenzy/node-amqp10","forks_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/forks","keys_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/keys{/key_id}","collaborators_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/teams","hooks_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/hooks","issue_events_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues/events{/number}","events_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/events","assignees_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/assignees{/user}","branches_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/branches{/branch}","tags_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/tags","blobs_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/git/refs{/sha}","trees_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/git/trees{/sha}","statuses_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/statuses/{sha}","languages_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/languages","stargazers_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/stargazers","contributors_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/contributors","subscribers_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/subscribers","subscription_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/subscription","commits_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/commits{/sha}","git_commits_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/git/commits{/sha}","comments_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/comments{/number}","issue_comment_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues/comments{/number}","contents_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/contents/{+path}","compare_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/compare/{base}...{head}","merges_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/merges","archive_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/downloads","issues_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues{/number}","pulls_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls{/number}","milestones_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/milestones{/number}","notifications_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/labels{/name}","releases_url":"https://api.github.com/repos/noodlefrenzy/node-amqp10/releases{/id}","created_at":"2014-10-07T16:13:45Z","updated_at":"2015-09-03T05:22:34Z","pushed_at":"2015-09-30T11:40:02Z","git_url":"git://github.com/noodlefrenzy/node-amqp10.git","ssh_url":"git@github.com:noodlefrenzy/node-amqp10.git","clone_url":"https://github.com/noodlefrenzy/node-amqp10.git","svn_url":"https://github.com/noodlefrenzy/node-amqp10","homepage":null,"size":2774,"stargazers_count":27,"watchers_count":27,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":true,"forks_count":9,"mirror_url":null,"open_issues_count":10,"forks":9,"open_issues":10,"watchers":27,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/165"},"html":{"href":"https://github.com/noodlefrenzy/node-amqp10/pull/165"},"issue":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues/165"},"comments":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/issues/165/comments"},"review_comments":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/165/comments"},"review_comment":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/pulls/165/commits"},"statuses":{"href":"https://api.github.com/repos/noodlefrenzy/node-amqp10/statuses/04a1f5f7d35c3852a0fbcd1f459181a4ccffad25"}},"merged":true,"mergeable":null,"mergeable_state":"unknown","merged_by":{"login":"mbroadst","id":312966,"avatar_url":"https://avatars.githubusercontent.com/u/312966?v=3","gravatar_id":"","url":"https://api.github.com/users/mbroadst","html_url":"https://github.com/mbroadst","followers_url":"https://api.github.com/users/mbroadst/followers","following_url":"https://api.github.com/users/mbroadst/following{/other_user}","gists_url":"https://api.github.com/users/mbroadst/gists{/gist_id}","starred_url":"https://api.github.com/users/mbroadst/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mbroadst/subscriptions","organizations_url":"https://api.github.com/users/mbroadst/orgs","repos_url":"https://api.github.com/users/mbroadst/repos","events_url":"https://api.github.com/users/mbroadst/events{/privacy}","received_events_url":"https://api.github.com/users/mbroadst/received_events","type":"User","site_admin":false},"comments":5,"review_comments":0,"commits":2,"additions":90,"deletions":1,"changed_files":2}}