{"action":"created","comment":{"url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/comments/240404496","pull_request_review_id":183428745,"id":240404496,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI0MDQwNDQ5Ng==","diff_hunk":"@@ -81,14 +96,108 @@ def generate_new_sas_token(self):\n             token = _device_token_format.format(quoted_resource_uri, signature, str(expiry))\n \n         self.sas_token_str = str(token)\n+        self._schedule_token_update(self.token_renewal_interval - self.token_renewal_margin)\n+        self._notify_token_updated()\n+\n+    def set_token_renewal_interval(self, token_renewal_interval, token_renewal_margin):\n+        \"\"\"\n+        Update the token renewal interval for this authorization object.\n+        Thie method does not generate a new token and it does not cause the current\n+        token renewal timer to restart.\n+\n+        Two numbers define token renewal.\n+\n+        The first number is the interval.  This defines the amount of time that the token\n+        is valid.  The interval is encoded in the token as an offset from the current time,\n+        as based on the Unix epoch.  In other words, the expiry (se=) value in the token\n+        is the number of seconds after 00:00 on January 1, 1970 that the token expires.\n+\n+        The second number that defines the token renewal interval is the margin.  This is\n+        the number of seconds before expiration that we want to generate a new token.  Since\n+        the clocks on different computers can drift over time, they will all have different\n+        definitions of what \"current time\" is, so the margin needs to be set so there is a\n+        very small chance that there is no time overlap where one computer thinks the token\n+        is expired and another doesn't.\n+\n+        When the timer is set to renew the SAS token, the timer is set for\n+        (token_renewal_interval - token-renewal_margin) seconds in the future.  In this way,\n+        the token will be renewed close to it's expiration time, but not so close that\n+        we risk a problem caused by clock drift.\n+\n+        :param token_renewal_interval: The number of seconds, in the future, that\n+        you want the token to expire.\n+\n+        :param token_renewal_margin: The number of seconds, before the token expires,\n+        that you want the token renewal process to begin.\n+\n+        :returns: None\n+        \"\"\"\n+        logger.info(\n+            \"changing renewal interval for (%s,%s) to (%d,%d)\",\n+            self.device_id,\n+            self.module_id,\n+            token_renewal_interval,\n+            token_renewal_margin,\n+        )\n+        self.token_renewal_interval = token_renewal_interval\n+        self.token_renewal_margin = token_renewal_margin\n+\n+    def _cancel_token_update_timer(self):\n+        \"\"\"\n+        Cancel any future token update operations.  This is typically done as part of a\n+        teardown operation\n+        \"\"\"\n+        t = self._token_update_timer\n+        self._token_update_timer = None\n+        if t:\n+            logger.info(\"Canceling token update timer for (%s,%s)\", self.device_id, self.module_id)\n+            t.cancel()","path":"azure-iot-hub-devicesdk/azure/iot/hub/devicesdk/auth/base_renewable_token_authentication_provider.py","position":108,"original_position":108,"commit_id":"3a7ff869f9afb5efa3add94fbee2de6aa16ae166","original_commit_id":"3a7ff869f9afb5efa3add94fbee2de6aa16ae166","user":{"login":"pierreca","id":4979572,"node_id":"MDQ6VXNlcjQ5Nzk1NzI=","avatar_url":"https://avatars2.githubusercontent.com/u/4979572?v=4","gravatar_id":"","url":"https://api.github.com/users/pierreca","html_url":"https://github.com/pierreca","followers_url":"https://api.github.com/users/pierreca/followers","following_url":"https://api.github.com/users/pierreca/following{/other_user}","gists_url":"https://api.github.com/users/pierreca/gists{/gist_id}","starred_url":"https://api.github.com/users/pierreca/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pierreca/subscriptions","organizations_url":"https://api.github.com/users/pierreca/orgs","repos_url":"https://api.github.com/users/pierreca/repos","events_url":"https://api.github.com/users/pierreca/events{/privacy}","received_events_url":"https://api.github.com/users/pierreca/received_events","type":"User","site_admin":false},"body":">t.cancel() [](start = 12, length = 10)\r\n\r\ncan this raise an exception if the timer has already been cancelled? should we catch it?","created_at":"2018-12-10T22:23:12Z","updated_at":"2018-12-10T22:23:12Z","html_url":"https://github.com/Azure/azure-iot-sdk-python-preview/pull/33#discussion_r240404496","pull_request_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33","author_association":"CONTRIBUTOR","_links":{"self":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/comments/240404496"},"html":{"href":"https://github.com/Azure/azure-iot-sdk-python-preview/pull/33#discussion_r240404496"},"pull_request":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33"}}},"pull_request":{"url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33","id":237015368,"node_id":"MDExOlB1bGxSZXF1ZXN0MjM3MDE1MzY4","html_url":"https://github.com/Azure/azure-iot-sdk-python-preview/pull/33","diff_url":"https://github.com/Azure/azure-iot-sdk-python-preview/pull/33.diff","patch_url":"https://github.com/Azure/azure-iot-sdk-python-preview/pull/33.patch","issue_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/33","number":33,"state":"open","locked":false,"title":"add sas token renewal logic for shared key auth and iotedge auth","user":{"login":"BertKleewein","id":8028738,"node_id":"MDQ6VXNlcjgwMjg3Mzg=","avatar_url":"https://avatars0.githubusercontent.com/u/8028738?v=4","gravatar_id":"","url":"https://api.github.com/users/BertKleewein","html_url":"https://github.com/BertKleewein","followers_url":"https://api.github.com/users/BertKleewein/followers","following_url":"https://api.github.com/users/BertKleewein/following{/other_user}","gists_url":"https://api.github.com/users/BertKleewein/gists{/gist_id}","starred_url":"https://api.github.com/users/BertKleewein/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/BertKleewein/subscriptions","organizations_url":"https://api.github.com/users/BertKleewein/orgs","repos_url":"https://api.github.com/users/BertKleewein/repos","events_url":"https://api.github.com/users/BertKleewein/events{/privacy}","received_events_url":"https://api.github.com/users/BertKleewein/received_events","type":"User","site_admin":false},"body":"This adds code for the shared key and iotedge auth providers to automatically re-generate their sas tokens based on expiry timers.  In order to do this, several things needed to happen:\r\n1) The MQTT provider needed to have a reconnect() function.  This is how the upper layers send a new SAS token down to PAHO.\r\n2) The MQTT transport needed to have a callback function where the auth provider could notify the\r\ntransport that a new SAS token is available.  Since this operation requires the transport to reconnect, I needed to add a new trigger to the state machine.  There is currently no need to add a \"reconnecting\" state since \"reconnecting\" would behave exactly like \"connecting\".\r\n3) A timer needed to be added to the auth providers so they could automatically renew themselves, and a callback needed to be defined so they could notify the transport when this renewal happens.  \r\n4) A \"disconnect\" function needed to be added to the auth providers so they can cancel their update timers.  This is necessary because otherwise, a timer would prevent the auth object from being garbage collected at the right time.\r\n5) The transport disconnect function needs to call disconnect on the auth provider so the application can shut down after disconnect is called.  Tests also need to call disconnect on the auth provider for the same reason.","created_at":"2018-12-07T22:51:07Z","updated_at":"2018-12-10T22:23:12Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e196b6fb1058b0942c294fbc94e67486fccac016","assignee":null,"assignees":[],"requested_reviewers":[{"login":"cartertinney","id":3613133,"node_id":"MDQ6VXNlcjM2MTMxMzM=","avatar_url":"https://avatars3.githubusercontent.com/u/3613133?v=4","gravatar_id":"","url":"https://api.github.com/users/cartertinney","html_url":"https://github.com/cartertinney","followers_url":"https://api.github.com/users/cartertinney/followers","following_url":"https://api.github.com/users/cartertinney/following{/other_user}","gists_url":"https://api.github.com/users/cartertinney/gists{/gist_id}","starred_url":"https://api.github.com/users/cartertinney/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cartertinney/subscriptions","organizations_url":"https://api.github.com/users/cartertinney/orgs","repos_url":"https://api.github.com/users/cartertinney/repos","events_url":"https://api.github.com/users/cartertinney/events{/privacy}","received_events_url":"https://api.github.com/users/cartertinney/received_events","type":"User","site_admin":false},{"login":"olivakar","id":5783914,"node_id":"MDQ6VXNlcjU3ODM5MTQ=","avatar_url":"https://avatars1.githubusercontent.com/u/5783914?v=4","gravatar_id":"","url":"https://api.github.com/users/olivakar","html_url":"https://github.com/olivakar","followers_url":"https://api.github.com/users/olivakar/followers","following_url":"https://api.github.com/users/olivakar/following{/other_user}","gists_url":"https://api.github.com/users/olivakar/gists{/gist_id}","starred_url":"https://api.github.com/users/olivakar/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/olivakar/subscriptions","organizations_url":"https://api.github.com/users/olivakar/orgs","repos_url":"https://api.github.com/users/olivakar/repos","events_url":"https://api.github.com/users/olivakar/events{/privacy}","received_events_url":"https://api.github.com/users/olivakar/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33/commits","review_comments_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33/comments","review_comment_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/33/comments","statuses_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/statuses/3a7ff869f9afb5efa3add94fbee2de6aa16ae166","head":{"label":"Azure:bertk-sas","ref":"bertk-sas","sha":"3a7ff869f9afb5efa3add94fbee2de6aa16ae166","user":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":148676866,"node_id":"MDEwOlJlcG9zaXRvcnkxNDg2NzY4NjY=","name":"azure-iot-sdk-python-preview","full_name":"Azure/azure-iot-sdk-python-preview","private":false,"owner":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Azure/azure-iot-sdk-python-preview","description":"Azure IoT SDK for Python - v2.0.0 Preview","fork":false,"url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview","forks_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/forks","keys_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/teams","hooks_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/hooks","issue_events_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/events","assignees_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/tags","blobs_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/languages","stargazers_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/stargazers","contributors_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/contributors","subscribers_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/subscribers","subscription_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/subscription","commits_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/merges","archive_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/downloads","issues_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/labels{/name}","releases_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/deployments","created_at":"2018-09-13T17:57:54Z","updated_at":"2018-12-07T18:18:31Z","pushed_at":"2018-12-10T22:15:55Z","git_url":"git://github.com/Azure/azure-iot-sdk-python-preview.git","ssh_url":"git@github.com:Azure/azure-iot-sdk-python-preview.git","clone_url":"https://github.com/Azure/azure-iot-sdk-python-preview.git","svn_url":"https://github.com/Azure/azure-iot-sdk-python-preview","homepage":null,"size":508,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":5,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":5,"watchers":1,"default_branch":"master"}},"base":{"label":"Azure:master","ref":"master","sha":"e3c63a44aed2f2bd18b3f03d0587823c8f62c47c","user":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"repo":{"id":148676866,"node_id":"MDEwOlJlcG9zaXRvcnkxNDg2NzY4NjY=","name":"azure-iot-sdk-python-preview","full_name":"Azure/azure-iot-sdk-python-preview","private":false,"owner":{"login":"Azure","id":6844498,"node_id":"MDEyOk9yZ2FuaXphdGlvbjY4NDQ0OTg=","avatar_url":"https://avatars0.githubusercontent.com/u/6844498?v=4","gravatar_id":"","url":"https://api.github.com/users/Azure","html_url":"https://github.com/Azure","followers_url":"https://api.github.com/users/Azure/followers","following_url":"https://api.github.com/users/Azure/following{/other_user}","gists_url":"https://api.github.com/users/Azure/gists{/gist_id}","starred_url":"https://api.github.com/users/Azure/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Azure/subscriptions","organizations_url":"https://api.github.com/users/Azure/orgs","repos_url":"https://api.github.com/users/Azure/repos","events_url":"https://api.github.com/users/Azure/events{/privacy}","received_events_url":"https://api.github.com/users/Azure/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/Azure/azure-iot-sdk-python-preview","description":"Azure IoT SDK for Python - v2.0.0 Preview","fork":false,"url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview","forks_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/forks","keys_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/teams","hooks_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/hooks","issue_events_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/events{/number}","events_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/events","assignees_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/assignees{/user}","branches_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/branches{/branch}","tags_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/tags","blobs_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/refs{/sha}","trees_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/statuses/{sha}","languages_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/languages","stargazers_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/stargazers","contributors_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/contributors","subscribers_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/subscribers","subscription_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/subscription","commits_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/commits{/sha}","git_commits_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/git/commits{/sha}","comments_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/comments{/number}","issue_comment_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/comments{/number}","contents_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/contents/{+path}","compare_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/merges","archive_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/downloads","issues_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues{/number}","pulls_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls{/number}","milestones_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/milestones{/number}","notifications_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/labels{/name}","releases_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/releases{/id}","deployments_url":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/deployments","created_at":"2018-09-13T17:57:54Z","updated_at":"2018-12-07T18:18:31Z","pushed_at":"2018-12-10T22:15:55Z","git_url":"git://github.com/Azure/azure-iot-sdk-python-preview.git","ssh_url":"git@github.com:Azure/azure-iot-sdk-python-preview.git","clone_url":"https://github.com/Azure/azure-iot-sdk-python-preview.git","svn_url":"https://github.com/Azure/azure-iot-sdk-python-preview","homepage":null,"size":508,"stargazers_count":1,"watchers_count":1,"language":"Python","has_issues":false,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":5,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit","node_id":"MDc6TGljZW5zZTEz"},"forks":0,"open_issues":5,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33"},"html":{"href":"https://github.com/Azure/azure-iot-sdk-python-preview/pull/33"},"issue":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/33"},"comments":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/issues/33/comments"},"review_comments":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33/comments"},"review_comment":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/pulls/33/commits"},"statuses":{"href":"https://api.github.com/repos/Azure/azure-iot-sdk-python-preview/statuses/3a7ff869f9afb5efa3add94fbee2de6aa16ae166"}},"author_association":"MEMBER"}}
{"actor":{"display_login":"pierreca"}}