This commit is contained in:
Lorenz Diener 2019-04-28 23:12:27 +02:00
pare 3eba3f8835
commit 09c03296db
S'han modificat 4 arxius amb 401 adicions i 17 eliminacions

Veure arxiu

@ -314,6 +314,7 @@ Toot dicts
'replies_count': # The number of replies to this status.
'card': # A preview card for links from the status, if present at time of delivery,
# as card dict.
'poll': # A poll dict if a poll is attached to this status.
}
Mention dicts
@ -355,7 +356,29 @@ Scheduled toot dicts
},
'media_attachments': # Array of media dicts for the attachments to the scheduled toot
}
Poll dicts
~~~~~~~~~~
.. _poll dict:
.. code-block:: python
# Returns the following dictionary:
mastodon.poll(id)
{
'id': # The polls ID
'expires_at': # The time at which the poll is set to expire
'expired': # Boolean denoting whether you can still vote in this poll
'multiple': # Boolean indicating whether it is allowed to vote for more than one option
'votes_count': # Total number of votes cast in this poll
'voted': # Boolean indicating whether the logged-in user has already voted in this poll
'options': # The poll options as a list of dicts, each option with a `title` and a
# `votes_count` field. `votes_count` can be None if the poll creator has
# chosen to hide vote totals until the poll expires and it hasn't yet.
'emojis': # List of emoji dicts for all emoji used in answer strings
}
Conversation dicts
~~~~~~~~~~~~~~~~~~
.. _conversation dict:
@ -797,13 +820,19 @@ These functions allow you to get information about single statuses.
.. automethod:: Mastodon.status_favourited_by
.. automethod:: Mastodon.status_card
Writing data: Scheduled statuses
Reading data: Scheduled statuses
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
These functions allow you to get information about scheduled statuses.
.. automethod:: Mastodon.scheduled_statuses
.. automethod:: Mastodon.scheduled_status
Reading data: Polls
~~~~~~~~~~~~~~~~~~~
This function allows you to get and refresh information about polls.
.. automethod:: Mastodon.poll
Reading data: Notifications
---------------------------
This function allows you to get information about a users notifications.
@ -913,6 +942,8 @@ interact with already posted statuses.
.. automethod:: Mastodon.status_post
.. automethod:: Mastodon.status_reply
.. automethod:: Mastodon.toot
.. _make_poll():
.. automethod:: Mastodon.make_poll
.. automethod:: Mastodon.status_reblog
.. automethod:: Mastodon.status_unreblog
.. automethod:: Mastodon.status_favourite
@ -932,6 +963,12 @@ scheduled statuses.
.. automethod:: Mastodon.scheduled_status_update
.. automethod:: Mastodon.scheduled_status_delete
Writing data: Polls
~~~~~~~~~~~~~~~~~~~
This function allows you to vote in polls.
.. automethod:: Mastodon.poll_vote
Writing data: Notifications
---------------------------
These functions allow you to clear all or some notifications.

Veure arxiu

@ -161,8 +161,9 @@ class Mastodon:
__DICT_VERSION_MENTION = "1.0.0"
__DICT_VERSION_MEDIA = "2.3.0"
__DICT_VERSION_ACCOUNT = "2.4.0"
__DICT_VERSION_STATUS = bigger_version(bigger_version(bigger_version(bigger_version("2.5.0",
__DICT_VERSION_MEDIA), __DICT_VERSION_ACCOUNT), __DICT_VERSION_APPLICATION), __DICT_VERSION_MENTION)
__DICT_VERSION_POLL = "2.8.0"
__DICT_VERSION_STATUS = bigger_version(bigger_version(bigger_version(bigger_version(bigger_version("2.8.0",
__DICT_VERSION_MEDIA), __DICT_VERSION_ACCOUNT), __DICT_VERSION_APPLICATION), __DICT_VERSION_MENTION), __DICT_VERSION_POLL)
__DICT_VERSION_INSTANCE = bigger_version("2.7.2", __DICT_VERSION_ACCOUNT)
__DICT_VERSION_HASHTAG = "2.3.4"
__DICT_VERSION_EMOJI = "2.1.0"
@ -826,6 +827,20 @@ class Mastodon:
url = '/api/v1/scheduled_statuses/{0}'.format(str(id))
return self.__api_request('GET', url)
###
# Reading data: Polls
###
@api_version("2.8.0", "2.8.0", __DICT_VERSION_POLL)
def poll(self, id):
"""
Fetch information about the poll with the given id
Returns a `poll dict`_.
"""
id = self.__unpack_id(id)
url = '/api/v1/polls/{0}'.format(str(id))
return self.__api_request('GET', url)
###
# Reading data: Notifications
###
@ -1367,11 +1382,11 @@ class Mastodon:
###
# Writing data: Statuses
###
@api_version("1.0.0", "2.7.0", __DICT_VERSION_STATUS)
@api_version("1.0.0", "2.8.0", __DICT_VERSION_STATUS)
def status_post(self, status, in_reply_to_id=None, media_ids=None,
sensitive=False, visibility=None, spoiler_text=None,
language=None, idempotency_key=None, content_type=None,
scheduled_at=None):
scheduled_at=None, poll=None):
"""
Post a status. Can optionally be in reply to another status and contain
media.
@ -1412,6 +1427,9 @@ class Mastodon:
(the time must be at least 5 minutes into the future). If this is passed,
status_post returns a `scheduled toot dict`_ instead.
Pass `poll` to attach a poll to the status. An appropriate object can be
constructed using `make_poll()`_
Specify `content_type` to set the content type of your post on Pleroma.
It accepts 'text/plain' (default), 'text/markdown', and 'text/html'.
This parameter is not supported on Mastodon servers, but will be
@ -1466,10 +1484,14 @@ class Mastodon:
if params_initial['content_type'] == None:
del params_initial['content_type']
params = self.__generate_params(params_initial, ['idempotency_key'])
return self.__api_request('POST', '/api/v1/statuses', params, headers = headers)
use_json = False
if not poll is None:
use_json = True
@api_version("1.0.0", "2.7.0", __DICT_VERSION_STATUS)
params = self.__generate_params(params_initial, ['idempotency_key'])
return self.__api_request('POST', '/api/v1/statuses', params, headers = headers, use_json = use_json)
@api_version("1.0.0", "2.8.0", __DICT_VERSION_STATUS)
def toot(self, status):
"""
Synonym for `status_post()`_ that only takes the status text as input.
@ -1480,10 +1502,10 @@ class Mastodon:
"""
return self.status_post(status)
@api_version("1.0.0", "2.7.0", __DICT_VERSION_STATUS)
@api_version("1.0.0", "2.8.0", __DICT_VERSION_STATUS)
def status_reply(self, to_status, status, media_ids=None, sensitive=False, visibility=None,
spoiler_text=None, language=None, idempotency_key=None, content_type=None,
scheduled_at=None, untag=False):
scheduled_at=None, poll=None, untag=False):
"""
Helper function - acts like status_post, but prepends the name of all
the users that are being replied to to the status text and retains
@ -1516,8 +1538,22 @@ class Mastodon:
return self.status_post(status, in_reply_to_id = to_status.id, media_ids = media_ids, sensitive = sensitive,
visibility = visibility, spoiler_text = spoiler_text, language = language,
idempotency_key = idempotency_key, content_type = content_type,
scheduled_at = scheduled_at)
scheduled_at = scheduled_at, poll = poll)
@api_version("2.8.0", "2.8.0", __DICT_VERSION_POLL)
def make_poll(self, options, expires_in, multiple=False, hide_totals=False):
"""
Generate a poll object that can be passed as the `poll` option when posting a status.
options is an array of strings with the poll options (Maximum, by default: 4),
expires_in is the time in seconds for which the poll should be open.
Set multiple to True to allow people to choose more than one answer. Set
hide_totals to True to hide the results of the poll until it has expired.
"""
poll_params = locals()
del poll_params["self"]
return poll_params
@api_version("1.0.0", "1.0.0", "1.0.0")
def status_delete(self, id):
"""
@ -1653,6 +1689,34 @@ class Mastodon:
url = '/api/v1/scheduled_statuses/{0}'.format(str(id))
self.__api_request('DELETE', url)
###
# Writing data: Polls
###
@api_version("2.8.0", "2.8.0", __DICT_VERSION_POLL)
def poll_vote(self, id, choices):
"""
Vote in the given poll.
`choices` is the index of the choice you wish to register a vote for
(i.e. its index in the corresponding polls `options` field. In case
of a poll that allows selection of more than one option, a list of
indices can be passed.
You can only submit choices for any given poll once in case of
single-option polls, or only once per option in case of multi-option
polls.
Returns the updated `poll dict`_
"""
id = self.__unpack_id(id)
if not isinstance(choices, list):
choices = [choices]
params = self.__generate_params(locals(), ['id'])
url = '/api/v1/polls/{0}/votes'.format(id)
self.__api_request('POST', url, params)
###
# Writing data: Notifications
###
@ -2480,7 +2544,7 @@ class Mastodon:
isotime = isotime[:-2] + ":" + isotime[-2:]
return isotime
def __api_request(self, method, endpoint, params={}, files={}, headers={}, access_token_override=None, do_ratelimiting=True):
def __api_request(self, method, endpoint, params={}, files={}, headers={}, access_token_override=None, do_ratelimiting=True, use_json = False):
"""
Internal API request helper.
"""
@ -2527,11 +2591,14 @@ class Mastodon:
try:
kwargs = dict(headers=headers, files=files,
timeout=self.request_timeout)
if method == 'GET':
kwargs['params'] = params
if use_json == False:
if method == 'GET':
kwargs['params'] = params
else:
kwargs['data'] = params
else:
kwargs['data'] = params
kwargs['json'] = params
response_object = self.session.request(
method, self.api_base_url + endpoint, **kwargs)
except Exception as e:

Veure arxiu

@ -0,0 +1,96 @@
interactions:
- request:
body: '{"poll": {"hide_totals": false, "multiple": false, "expires_in": 300, "options":
["four twenty", "sixty-nine"]}, "status": "nice"}'
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN_2]
Connection: [keep-alive]
Content-Length: ['130']
Content-Type: [application/json]
User-Agent: [python-requests/2.18.4]
method: POST
uri: http://localhost:3000/api/v1/statuses
response:
body: {string: '{"id":"102005835304968136","created_at":"2019-04-28T21:05:24.088Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"http://localhost/users/admin/statuses/102005835304968136","content":"\u003cp\u003enice\u003c/p\u003e","url":"http://localhost/@admin/102005835304968136","replies_count":0,"reblogs_count":0,"favourites_count":0,"favourited":false,"reblogged":false,"muted":false,"pinned":false,"reblog":null,"application":{"name":"Mastodon.py
test suite","website":null},"account":{"id":"1","username":"admin","acct":"admin","display_name":"","locked":false,"bot":false,"created_at":"2019-04-27T18:52:42.626Z","note":"\u003cp\u003e\u003c/p\u003e","url":"http://localhost/@admin","avatar":"http://localhost/avatars/original/missing.png","avatar_static":"http://localhost/avatars/original/missing.png","header":"http://localhost/headers/original/missing.png","header_static":"http://localhost/headers/original/missing.png","followers_count":0,"following_count":0,"statuses_count":25,"emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":{"id":"16","expires_at":"2019-04-28T21:10:24.070Z","expired":false,"multiple":false,"votes_count":0,"voted":true,"options":[{"title":"four
twenty","votes_count":0},{"title":"sixty-nine","votes_count":0}],"emojis":[]}}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"cb8935a9ac8d3dea6609462bbce81c7d"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [13adc429-bd63-4a6c-8afa-e52db1b58762]
X-Runtime: ['0.342656']
X-XSS-Protection: [1; mode=block]
content-length: ['1383']
status: {code: 200, message: OK}
- request:
body: choices%5B%5D=1
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
Content-Length: ['15']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [python-requests/2.18.4]
method: POST
uri: http://localhost:3000/api/v1/polls/16/votes
response:
body: {string: '{"id":"16","expires_at":"2019-04-28T21:10:24.070Z","expired":false,"multiple":false,"votes_count":1,"voted":true,"options":[{"title":"four
twenty","votes_count":0},{"title":"sixty-nine","votes_count":1}],"emojis":[]}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"96d62a6ad640c2c992e83b4bffc10c7b"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [d7715baa-8b11-47b3-bc72-401b22f6296c]
X-Runtime: ['0.167098']
X-XSS-Protection: [1; mode=block]
content-length: ['216']
status: {code: 200, message: OK}
- request:
body: choices%5B%5D=0
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
Content-Length: ['15']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [python-requests/2.18.4]
method: POST
uri: http://localhost:3000/api/v1/polls/16/votes
response:
body: {string: "{\"error\":\"\u30D0\u30EA\u30C7\u30FC\u30B7\u30E7\u30F3\u306B\u5931\u6557\u3057\u307E\u3057\u305F:
\u3053\u306E\u30A2\u30F3\u30B1\u30FC\u30C8\u306B\u306F\u6295\u7968\u6E08\u307F\u3067\u3059\"}"}
headers:
Cache-Control: [no-cache]
Content-Type: [application/json; charset=utf-8]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [846275ac-e205-4fb2-8132-edeef42a2ff2]
X-Runtime: ['0.101521']
X-XSS-Protection: [1; mode=block]
content-length: ['101']
status: {code: 422, message: Unprocessable Entity}
version: 1

Veure arxiu

@ -0,0 +1,184 @@
interactions:
- request:
body: '{"poll": {"hide_totals": false, "multiple": true, "expires_in": 300, "options":
["four twenty", "sixty-nine"]}, "status": "nice"}'
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN_2]
Connection: [keep-alive]
Content-Length: ['129']
Content-Type: [application/json]
User-Agent: [python-requests/2.18.4]
method: POST
uri: http://localhost:3000/api/v1/statuses
response:
body: {string: '{"id":"102005835265128615","created_at":"2019-04-28T21:05:23.464Z","in_reply_to_id":null,"in_reply_to_account_id":null,"sensitive":false,"spoiler_text":"","visibility":"public","language":"en","uri":"http://localhost/users/admin/statuses/102005835265128615","content":"\u003cp\u003enice\u003c/p\u003e","url":"http://localhost/@admin/102005835265128615","replies_count":0,"reblogs_count":0,"favourites_count":0,"favourited":false,"reblogged":false,"muted":false,"pinned":false,"reblog":null,"application":{"name":"Mastodon.py
test suite","website":null},"account":{"id":"1","username":"admin","acct":"admin","display_name":"","locked":false,"bot":false,"created_at":"2019-04-27T18:52:42.626Z","note":"\u003cp\u003e\u003c/p\u003e","url":"http://localhost/@admin","avatar":"http://localhost/avatars/original/missing.png","avatar_static":"http://localhost/avatars/original/missing.png","header":"http://localhost/headers/original/missing.png","header_static":"http://localhost/headers/original/missing.png","followers_count":0,"following_count":0,"statuses_count":25,"emojis":[],"fields":[]},"media_attachments":[],"mentions":[],"tags":[],"emojis":[],"card":null,"poll":{"id":"15","expires_at":"2019-04-28T21:10:23.457Z","expired":false,"multiple":true,"votes_count":0,"voted":true,"options":[{"title":"four
twenty","votes_count":0},{"title":"sixty-nine","votes_count":0}],"emojis":[]}}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"9b51d6b8d66f9e0eb1c833ed6f67df71"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [f11d8fa0-461a-446e-a0f5-20b81af7f6cc]
X-Runtime: ['0.157309']
X-XSS-Protection: [1; mode=block]
content-length: ['1382']
status: {code: 200, message: OK}
- request:
body: choices%5B%5D=1
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
Content-Length: ['15']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [python-requests/2.18.4]
method: POST
uri: http://localhost:3000/api/v1/polls/15/votes
response:
body: {string: '{"id":"15","expires_at":"2019-04-28T21:10:23.457Z","expired":false,"multiple":true,"votes_count":1,"voted":true,"options":[{"title":"four
twenty","votes_count":0},{"title":"sixty-nine","votes_count":1}],"emojis":[]}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"5b2a849b672ccadf70a2620d4dc1cacb"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [9bfef151-c9a3-44cc-94d4-6ed33e9e7c24]
X-Runtime: ['0.079564']
X-XSS-Protection: [1; mode=block]
content-length: ['215']
status: {code: 200, message: OK}
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
User-Agent: [python-requests/2.18.4]
method: GET
uri: http://localhost:3000/api/v1/polls/15
response:
body: {string: '{"id":"15","expires_at":"2019-04-28T21:10:23.457Z","expired":false,"multiple":true,"votes_count":1,"voted":true,"options":[{"title":"four
twenty","votes_count":0},{"title":"sixty-nine","votes_count":1}],"emojis":[]}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"5b2a849b672ccadf70a2620d4dc1cacb"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [f6a54825-bd65-49b0-a83f-39ef5124a362]
X-Runtime: ['0.043202']
X-XSS-Protection: [1; mode=block]
content-length: ['215']
status: {code: 200, message: OK}
- request:
body: choices%5B%5D=0
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
Content-Length: ['15']
Content-Type: [application/x-www-form-urlencoded]
User-Agent: [python-requests/2.18.4]
method: POST
uri: http://localhost:3000/api/v1/polls/15/votes
response:
body: {string: '{"id":"15","expires_at":"2019-04-28T21:10:23.457Z","expired":false,"multiple":true,"votes_count":2,"voted":true,"options":[{"title":"four
twenty","votes_count":1},{"title":"sixty-nine","votes_count":1}],"emojis":[]}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"567f9562c02e1a5533bf95d1d4bbdede"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [209f0950-c9c0-4ab8-978f-de3239546a97]
X-Runtime: ['0.062952']
X-XSS-Protection: [1; mode=block]
content-length: ['215']
status: {code: 200, message: OK}
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN]
Connection: [keep-alive]
User-Agent: [python-requests/2.18.4]
method: GET
uri: http://localhost:3000/api/v1/polls/15
response:
body: {string: '{"id":"15","expires_at":"2019-04-28T21:10:23.457Z","expired":false,"multiple":true,"votes_count":2,"voted":true,"options":[{"title":"four
twenty","votes_count":1},{"title":"sixty-nine","votes_count":1}],"emojis":[]}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"567f9562c02e1a5533bf95d1d4bbdede"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [7caa443c-5605-436f-bae1-f7088dc7db1d]
X-Runtime: ['0.037629']
X-XSS-Protection: [1; mode=block]
content-length: ['215']
status: {code: 200, message: OK}
- request:
body: null
headers:
Accept: ['*/*']
Accept-Encoding: ['gzip, deflate']
Authorization: [Bearer __MASTODON_PY_TEST_ACCESS_TOKEN_2]
Connection: [keep-alive]
Content-Length: ['0']
User-Agent: [python-requests/2.18.4]
method: DELETE
uri: http://localhost:3000/api/v1/statuses/102005835265128615
response:
body: {string: '{}'}
headers:
Cache-Control: ['max-age=0, private, must-revalidate']
Content-Type: [application/json; charset=utf-8]
ETag: [W/"6e856267241253766a52970611e7487c"]
Referrer-Policy: [strict-origin-when-cross-origin]
Transfer-Encoding: [chunked]
Vary: ['Accept-Encoding, Origin']
X-Content-Type-Options: [nosniff]
X-Download-Options: [noopen]
X-Frame-Options: [SAMEORIGIN]
X-Permitted-Cross-Domain-Policies: [none]
X-Request-Id: [9a5591f2-fbaa-4f0e-832f-86f5d1b8e6b1]
X-Runtime: ['0.044707']
X-XSS-Protection: [1; mode=block]
content-length: ['2']
status: {code: 200, message: OK}
version: 1