Revert "cache outbound HTTP request responses, locally to each inbound request"

This reverts commit 30debfc8fa.

seemed promising, but broke in production. Saw a lot of `IncompleteRead`s on both GETs and POSTs. Rolled back for now.

```
('Connection broken: IncompleteRead(9172 bytes read, -4586 more expected)', IncompleteRead(9172 bytes read, -4586 more expected))
...
File "oauth_dropins/webutil/util.py", line 1673, in call
  resp = getattr((session or requests), fn)(url, *args, **kwargs)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests_cache/session.py", line 102, in get
  return self.request('GET', url, params=params, **kwargs)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests_cache/session.py", line 158, in request
  return super().request(method, url, *args, headers=headers, **kwargs)  # type: ignore
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests/sessions.py", line 589, in request
  resp = self.send(prep, **send_kwargs)
         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests_cache/session.py", line 205, in send
  response = self._send_and_cache(request, actions, cached_response, **kwargs)
             ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests_cache/session.py", line 233, in _send_and_cache
  self.cache.save_response(response, actions.cache_key, actions.expires)
File "requests_cache/backends/base.py", line 89, in save_response
  cached_response = CachedResponse.from_response(response, expires=expires)
                    ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests_cache/models/response.py", line 102, in from_response
  obj.raw = CachedHTTPResponse.from_response(response)
            ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests_cache/models/raw_response.py", line 69, in from_response
  _ = response.content  # This property reads, decodes, and stores response content
      ^^^^^^^^^^^^^^^^
File "requests/models.py", line 899, in content
  self._content = b"".join(self.iter_content(CONTENT_CHUNK_SIZE)) or b""
                  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "requests/models.py", line 818, in generate
  raise ChunkedEncodingError(e)
```
pull/920/head
Ryan Barrett 2024-03-08 13:24:28 -08:00
rodzic fa383df074
commit 95e46c5ebb
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
17 zmienionych plików z 207 dodań i 216 usunięć

Wyświetl plik

@ -479,19 +479,19 @@ class ActivityPub(User, Protocol):
def signed_get(url, from_user=None, **kwargs):
return signed_request(common.requests_get, url, from_user=from_user, **kwargs)
return signed_request(util.requests_get, url, from_user=from_user, **kwargs)
def signed_post(url, from_user, **kwargs):
assert from_user
return signed_request(common.requests_post, url, from_user=from_user, **kwargs)
return signed_request(util.requests_post, url, from_user=from_user, **kwargs)
def signed_request(fn, url, data=None, headers=None, from_user=None, **kwargs):
"""Wraps ``requests.*`` and adds HTTP Signature.
Args:
fn (callable): :func:`common.requests_get` or :func:`common.requests_post`
fn (callable): :func:`util.requests_get` or :func:`util.requests_post`
url (str):
data (dict): optional AS2 object
from_user (models.User): user to sign request as; optional. If not
@ -544,7 +544,7 @@ def signed_request(fn, url, data=None, headers=None, from_user=None, **kwargs):
logger.info(f'Got {resp.status_code} headers: {resp.headers}')
# handle GET redirects manually so that we generate a new HTTP signature
if resp.is_redirect and fn == common.requests_get:
if resp.is_redirect and fn == util.requests_get:
new_url = urljoin(url, resp.headers['Location'])
return signed_request(fn, new_url, data=data, headers=headers,
**kwargs)

Wyświetl plik

@ -109,7 +109,7 @@ class ATProto(User, Protocol):
if user:
return user.key.id()
return did.resolve_handle(handle, get_fn=common.requests_get)
return did.resolve_handle(handle, get_fn=util.requests_get)
def profile_id(self):
return f'at://{self.key.id()}/app.bsky.actor.profile/self'
@ -201,7 +201,7 @@ class ATProto(User, Protocol):
logger.info(f'Creating new did:plc for {user.key}')
did_plc = did.create_plc(user.handle_as('atproto'),
pds_url=cls.PDS_URL,
post_fn=common.requests_post)
post_fn=util.requests_post)
Object.get_or_create(did_plc.did, raw=did_plc.doc)
# TODO: move this to ATProto.get_or_create?
@ -355,7 +355,7 @@ class ATProto(User, Protocol):
# did:plc, did:web
if id.startswith('did:'):
try:
obj.raw = did.resolve(id, get_fn=common.requests_get)
obj.raw = did.resolve(id, get_fn=util.requests_get)
return True
except (ValueError, requests.RequestException) as e:
util.interpret_http_exception(e)
@ -421,7 +421,7 @@ class ATProto(User, Protocol):
for url in util.get_urls(o, 'image'):
if url not in blobs:
blob = AtpRemoteBlob.get_or_create(
url=url, get_fn=common.requests_get)
url=url, get_fn=util.requests_get)
blobs[url] = blob.as_object()
ret = bluesky.from_as1(cls.translate_ids(obj.as1), blobs=blobs)

Wyświetl plik

@ -17,7 +17,6 @@ from oauth_dropins.webutil.appengine_config import tasks_client
from oauth_dropins.webutil import appengine_info
from oauth_dropins.webutil.appengine_info import DEBUG
from oauth_dropins.webutil import flask_util
from requests_cache import CachedSession
logger = logging.getLogger(__name__)
@ -244,7 +243,7 @@ def webmention_endpoint_cache_key(url):
lock=threading.Lock())
def webmention_discover(url, **kwargs):
"""Thin caching wrapper around :func:`oauth_dropins.webutil.webmention.discover`."""
return webmention.discover(url, session=requests_session(), **kwargs)
return webmention.discover(url, **kwargs)
def add(seq, val):
@ -325,33 +324,3 @@ def create_task(queue, delay=None, **params):
msg = f'Added {queue} task {task.name} : {params}'
logger.info(msg)
return msg, 202
def requests_session():
if not hasattr(g, 'requests_session'):
g.session = CachedSession(
# more or less everything
allowable_codes=(200, 204, 205, 206,
300, 301, 303, 304, 308,
400, 401, 402, 403, 404, 405, 406, 408, 410, 411,
412, 413, 414, 415, 417, 422, 428, 429, 431, 451,
500, 501, 502, 503, 504, 511),
backend='memory', # BaseCache class
match_headers=('Accept',),
)
return g.session
def requests_get(*args, **kwargs):
return util.requests_get(*args, session=requests_session(), **kwargs)
def requests_post(*args, **kwargs):
return util.requests_post(*args, session=requests_session(), **kwargs)
def requests_head(*args, **kwargs):
return util.requests_head(*args, session=requests_session(), **kwargs)
def fetch_mf2(*args, **kwargs):
return util.fetch_mf2(*args, session=requests_session(), **kwargs)

Wyświetl plik

@ -88,7 +88,6 @@ pytz==2024.1
PyYAML==6.0.1
redis==5.0.3
requests==2.31.0
requests-cache==1.2.0
requests-oauthlib==1.3.1
rsa==4.9
sgmllib3k==1.0.0

Wyświetl plik

@ -299,9 +299,9 @@ AS2 = requests_response(AS2_OBJ, headers={
NOT_ACCEPTABLE = requests_response(status=406)
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests_cache.CachedSession.head')
@patch('requests.post')
@patch('requests.get')
@patch('requests.head')
class ActivityPubTest(TestCase):
def setUp(self):
@ -599,6 +599,7 @@ class ActivityPubTest(TestCase):
)
def _test_inbox_reply(self, reply, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/post')
mock_get.side_effect = (
(list(mock_get.side_effect) if mock_get.side_effect
else [self.as2_resp(ACTOR)])
@ -686,6 +687,7 @@ class ActivityPubTest(TestCase):
baj = self.make_user('fake:baj', cls=Fake, obj_id='fake:baj')
Follower.get_or_create(to=swentel, from_=baj, status='inactive')
mock_head.return_value = requests_response(url='http://target')
mock_get.return_value = self.as2_resp(ACTOR) # source actor
mock_post.return_value = requests_response()
@ -723,6 +725,7 @@ class ActivityPubTest(TestCase):
delivered_protocol='fake')
def test_repost_of_indieweb(self, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/orig')
mock_get.return_value = WEBMENTION_DISCOVERY
mock_post.return_value = requests_response() # webmention
@ -772,6 +775,7 @@ class ActivityPubTest(TestCase):
baj = self.make_user('fake:baj', cls=Fake, obj_id='fake:baj')
Follower.get_or_create(to=to, from_=baj, status='inactive')
mock_head.return_value = requests_response(url='http://target')
mock_get.return_value = self.as2_resp(NOTE_OBJECT)
got = self.post('/ap/sharedInbox', json=REPOST)
@ -830,6 +834,7 @@ class ActivityPubTest(TestCase):
Follower.get_or_create(to=self.make_user(ACTOR['id'], cls=ActivityPub),
from_=self.user)
mock_head.return_value = requests_response(url='http://target')
mock_get.return_value = self.as2_resp(ACTOR) # source actor
not_public = copy.deepcopy(NOTE)
@ -854,6 +859,7 @@ class ActivityPubTest(TestCase):
self.assertIsNone(Object.get_by_id('http://inst/foo'))
def test_inbox_like(self, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/post')
mock_get.side_effect = [
# source actor
self.as2_resp(LIKE_WITH_ACTOR['actor']),
@ -991,6 +997,7 @@ class ActivityPubTest(TestCase):
self.user.direct = False
self.user.put()
mock_head.return_value = requests_response(url='https://user.com/')
mock_get.side_effect = [
self.as2_resp(ACTOR), # source actor
WEBMENTION_DISCOVERY,
@ -1036,6 +1043,7 @@ class ActivityPubTest(TestCase):
def test_inbox_follow_use_instead_strip_www(self, mock_head, mock_get, mock_post):
self.make_user('www.user.com', cls=Web, use_instead=self.user.key)
mock_head.return_value = requests_response(url='https://www.user.com/')
mock_get.side_effect = [
# source actor
self.as2_resp(ACTOR),
@ -1067,6 +1075,7 @@ class ActivityPubTest(TestCase):
follower.follow.get().as2['url'])
def test_inbox_follow_web_brid_gy_subdomain(self, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/')
mock_get.side_effect = [
# source actor
self.as2_resp(ACTOR),
@ -1124,6 +1133,7 @@ class ActivityPubTest(TestCase):
from_=self.make_user(ACTOR['id'], cls=ActivityPub, obj_as2=ACTOR),
status='inactive')
mock_head.return_value = requests_response(url='https://user.com/')
mock_get.side_effect = [
test_web.ACTOR_HTML_RESP,
WEBMENTION_DISCOVERY,
@ -1137,6 +1147,7 @@ class ActivityPubTest(TestCase):
self.assertEqual('active', follower.key.get().status)
def test_inbox_undo_follow_doesnt_exist(self, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/')
mock_get.side_effect = [
self.as2_resp(ACTOR),
test_web.ACTOR_HTML_RESP,
@ -1148,6 +1159,7 @@ class ActivityPubTest(TestCase):
self.assertEqual(202, got.status_code)
def test_inbox_undo_follow_inactive(self, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/')
mock_get.side_effect = [
self.as2_resp(ACTOR),
test_web.ACTOR_HTML_RESP,
@ -1164,6 +1176,7 @@ class ActivityPubTest(TestCase):
self.assertEqual('inactive', follower.key.get().status)
def test_inbox_undo_follow_composite_object(self, mock_head, mock_get, mock_post):
mock_head.return_value = requests_response(url='https://user.com/')
mock_get.side_effect = [
self.as2_resp(ACTOR),
test_web.ACTOR_HTML_RESP,
@ -1807,7 +1820,7 @@ class ActivityPubUtilsTest(TestCase):
self.assertEqual('http://inst.com/@user',
ActivityPub.handle_to_id('@user@inst.com'))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_handle_to_id_fetch(self, mock_get):
mock_get.return_value = requests_response(test_webfinger.WEBFINGER)
self.assertEqual('http://localhost/user.com',
@ -1816,7 +1829,7 @@ class ActivityPubUtilsTest(TestCase):
mock_get,
'https://inst.com/.well-known/webfinger?resource=acct:user@inst.com')
@patch('requests_cache.CachedSession.get', return_value=requests_response({}))
@patch('requests.get', return_value=requests_response({}))
def test_handle_to_id_not_found(self, mock_get):
self.assertIsNone(ActivityPub.handle_to_id('@user@inst.com'))
self.assert_req(
@ -1977,7 +1990,7 @@ class ActivityPubUtilsTest(TestCase):
self.assertEqual(['https://masto.foo/@other'],
postprocess_as2(obj)['cc'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_signed_get_redirects_manually_with_new_sig_headers(self, mock_get):
mock_get.side_effect = [
requests_response(status=302, redirected_url='http://second',
@ -1990,7 +2003,7 @@ class ActivityPubUtilsTest(TestCase):
second = mock_get.call_args_list[1][1]
self.assertNotEqual(first['headers'], second['headers'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_signed_get_redirects_to_relative_url(self, mock_get):
mock_get.side_effect = [
# redirected URL is relative, we have to resolve it
@ -2011,7 +2024,7 @@ class ActivityPubUtilsTest(TestCase):
first['auth'].header_signer.sign(first['headers'], method='GET', path='/'),
second['auth'].header_signer.sign(second['headers'], method='GET', path='/'))
@patch('requests_cache.CachedSession.post', return_value=requests_response(status=200))
@patch('requests.post', return_value=requests_response(status=200))
def test_signed_post_from_user_is_activitypub_use_instance_actor(self, mock_post):
activitypub.signed_post('https://url', from_user=ActivityPub(id='http://fed'))
@ -2021,7 +2034,7 @@ class ActivityPubUtilsTest(TestCase):
rsa_key = kwargs['auth'].header_signer._rsa._key
self.assertEqual(instance_actor().private_pem(), rsa_key.exportKey())
@patch('requests_cache.CachedSession.post')
@patch('requests.post')
def test_signed_post_ignores_redirect(self, mock_post):
mock_post.side_effect = [
requests_response(status=302, redirected_url='http://second',
@ -2032,7 +2045,7 @@ class ActivityPubUtilsTest(TestCase):
mock_post.assert_called_once()
self.assertEqual(302, resp.status_code)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_direct(self, mock_get):
mock_get.return_value = AS2
obj = Object(id='http://orig')
@ -2043,7 +2056,7 @@ class ActivityPubUtilsTest(TestCase):
self.as2_req('http://orig'),
))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_direct_ld_content_type(self, mock_get):
mock_get.return_value = requests_response(AS2_OBJ, headers={
'Content-Type': 'application/ld+json; profile="https://www.w3.org/ns/activitystreams"',
@ -2056,7 +2069,7 @@ class ActivityPubUtilsTest(TestCase):
self.as2_req('http://orig'),
))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_via_html(self, mock_get):
mock_get.side_effect = [HTML_WITH_AS2, AS2]
obj = Object(id='http://orig')
@ -2068,7 +2081,7 @@ class ActivityPubUtilsTest(TestCase):
self.as2_req('http://as2', headers=as2.CONNEG_HEADERS),
))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_only_html(self, mock_get):
mock_get.return_value = HTML
@ -2076,7 +2089,7 @@ class ActivityPubUtilsTest(TestCase):
self.assertFalse(ActivityPub.fetch(obj))
self.assertIsNone(obj.as1)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_not_acceptable(self, mock_get):
mock_get.return_value = NOT_ACCEPTABLE
@ -2084,13 +2097,13 @@ class ActivityPubUtilsTest(TestCase):
self.assertFalse(ActivityPub.fetch(obj))
self.assertIsNone(obj.as1)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_ssl_error(self, mock_get):
mock_get.side_effect = requests.exceptions.SSLError
with self.assertRaises(BadGateway):
ActivityPub.fetch(Object(id='http://orig'))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_no_content(self, mock_get):
mock_get.return_value = self.as2_resp('')
@ -2099,7 +2112,7 @@ class ActivityPubUtilsTest(TestCase):
mock_get.assert_has_calls([self.as2_req('http://the/id')])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_fetch_not_json(self, mock_get):
mock_get.return_value = self.as2_resp('XYZ not JSON')
@ -2145,9 +2158,8 @@ class ActivityPubUtilsTest(TestCase):
def test_convert_actor_as2(self):
self.assert_equals(ACTOR, ActivityPub.convert(Object(as2=ACTOR)))
@patch('requests_cache.CachedSession.get')
def test_convert_actor_as1_from_user(self, mock_get):
mock_get.return_value = requests_response(test_web.ACTOR_HTML)
@patch('requests.get', return_value=requests_response(test_web.ACTOR_HTML))
def test_convert_actor_as1_from_user(self, _):
obj = Object(our_as1={
'objectType': 'person',
'id': 'https://user.com/',
@ -2305,7 +2317,7 @@ class ActivityPubUtilsTest(TestCase):
obj.as2['actor']['url'] = [obj.as2['actor'].pop('id')]
self.assertEqual('http://mas.to/inbox', ActivityPub.target_for(obj))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_target_for_object_fetch(self, mock_get):
mock_get.return_value = self.as2_resp(ACTOR)
@ -2316,7 +2328,7 @@ class ActivityPubUtilsTest(TestCase):
self.assertEqual('http://mas.to/inbox', ActivityPub.target_for(obj))
mock_get.assert_has_calls([self.as2_req('http://the/author')])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_target_for_author_is_object_id(self, mock_get):
mock_get.return_value = HTML
@ -2326,13 +2338,13 @@ class ActivityPubUtilsTest(TestCase):
# test is that we short circuit out instead of infinite recursion
self.assertIsNone(ActivityPub.target_for(obj))
@patch('requests_cache.CachedSession.post')
@patch('requests.post')
def test_send_blocklisted(self, mock_post):
self.assertFalse(ActivityPub.send(Object(as2=NOTE),
'https://fed.brid.gy/ap/sharedInbox'))
mock_post.assert_not_called()
@patch('requests_cache.CachedSession.post')
@patch('requests.post')
def test_send_convert_ids(self, mock_post):
mock_post.return_value = requests_response()

Wyświetl plik

@ -71,7 +71,7 @@ class ATProtoTest(TestCase):
return user
@patch('requests_cache.CachedSession.get', return_value=requests_response(DID_DOC))
@patch('requests.get', return_value=requests_response(DID_DOC))
def test_put_validates_id(self, mock_get):
for bad in (
'',
@ -94,7 +94,7 @@ class ATProtoTest(TestCase):
self.store_object(id='did:plc:user', raw=DID_DOC)
self.assertEqual('han.dull', ATProto(id='did:plc:user').handle)
@patch('requests_cache.CachedSession.get', return_value=requests_response(DID_DOC))
@patch('requests.get', return_value=requests_response(DID_DOC))
def test_get_or_create(self, _):
user = self.make_user('did:plc:user', cls=ATProto)
self.assertEqual('han.dull', user.key.get().handle)
@ -130,8 +130,7 @@ class ATProtoTest(TestCase):
@patch('dns.resolver.resolve', side_effect=dns.resolver.NXDOMAIN())
# resolving handle, HTTPS method, not found
@patch('requests_cache.CachedSession.get',
return_value=requests_response('', status=404))
@patch('requests.get', return_value=requests_response('', status=404))
def test_handle_to_id_not_found(self, *_):
self.assertIsNone(ATProto.handle_to_id('han.dull'))
@ -148,7 +147,7 @@ class ATProtoTest(TestCase):
got = ATProto.pds_for(Object(id='at://did:plc:user/co.ll/123'))
self.assertEqual('https://some.pds', got)
@patch('requests_cache.CachedSession.get', return_value=requests_response(DID_DOC))
@patch('requests.get', return_value=requests_response(DID_DOC))
def test_pds_for_fetch_did(self, mock_get):
got = ATProto.pds_for(Object(id='at://did:plc:user/co.ll/123'))
self.assertEqual('https://some.pds', got)
@ -180,7 +179,7 @@ class ATProtoTest(TestCase):
self.assertEqual('https://some.pds', got)
@patch('dns.resolver.resolve', side_effect=dns.resolver.NXDOMAIN())
@patch('requests_cache.CachedSession.get', side_effect=[
@patch('requests.get', side_effect=[
# resolving handle, HTTPS method
requests_response('did:plc:user', content_type='text/plain'),
# fetching DID doc
@ -219,8 +218,7 @@ class ATProtoTest(TestCase):
Object(id='at://foo')))
self.assertIsNone(ATProto.target_for(Object(id='fake:post')))
@patch('requests_cache.CachedSession.get',
return_value=requests_response({'foo': 'bar'}))
@patch('requests.get', return_value=requests_response({'foo': 'bar'}))
def test_fetch_did_plc(self, mock_get):
obj = Object(id='did:plc:123')
self.assertTrue(ATProto.fetch(obj))
@ -230,8 +228,7 @@ class ATProtoTest(TestCase):
self.req('https://plc.local/did:plc:123'),
))
@patch('requests_cache.CachedSession.get',
return_value=requests_response({'foo': 'bar'}))
@patch('requests.get', return_value=requests_response({'foo': 'bar'}))
def test_fetch_did_web(self, mock_get):
obj = Object(id='did:web:user.com')
self.assertTrue(ATProto.fetch(obj))
@ -241,8 +238,7 @@ class ATProtoTest(TestCase):
self.req('https://user.com/.well-known/did.json'),
))
@patch('requests_cache.CachedSession.get',
return_value=requests_response('not json'))
@patch('requests.get', return_value=requests_response('not json'))
def test_fetch_did_plc_not_json(self, mock_get):
obj = Object(id='did:web:user.com')
self.assertFalse(ATProto.fetch(obj))
@ -271,15 +267,17 @@ class ATProtoTest(TestCase):
)
@patch('dns.resolver.resolve', side_effect=dns.resolver.NXDOMAIN())
# resolve handle, HTTPS method
@patch('requests_cache.CachedSession.get',
return_value= requests_response('did:plc:abc', content_type='text/plain'))
# AppView getRecord
@patch('requests.get', return_value= requests_response({
'cid': 'bafy...',
'value': {'foo': 'bar'},
}))
def test_fetch_bsky_app_url(self, mock_get, _, __):
@patch('requests.get', side_effect=[
# resolving handle, HTTPS method
requests_response('did:plc:abc', content_type='text/plain'),
# AppView getRecord
requests_response({
'cid': 'bafy...',
'value': {'foo': 'bar'},
}),
])
def test_fetch_bsky_app_url(self, mock_get, _):
obj = Object(id='https://bsky.app/profile/han.dull/post/789')
self.assertTrue(ATProto.fetch(obj))
@ -371,7 +369,7 @@ class ATProtoTest(TestCase):
'image': [{'url': 'http://my/pic'}],
})))
@patch('requests_cache.CachedSession.get', return_value=requests_response(
@patch('requests.get', return_value=requests_response(
'blob contents', content_type='image/png'))
def test_convert_fetch_blobs_true(self, mock_get):
cid = CID.decode('bafkreicqpqncshdd27sgztqgzocd3zhhqnnsv6slvzhs5uz6f57cq6lmtq')
@ -418,8 +416,7 @@ class ATProtoTest(TestCase):
with self.assertRaises(BadRequest):
ATProto.convert(obj)
@patch('requests_cache.CachedSession.get',
return_value=requests_response('', status=404))
@patch('requests.get', return_value=requests_response('', status=404))
def test_web_url(self, mock_get):
user = self.make_user('did:plc:user', cls=ATProto)
self.assertEqual('https://bsky.app/profile/did:plc:user', user.web_url())
@ -427,8 +424,7 @@ class ATProtoTest(TestCase):
self.store_object(id='did:plc:user', raw=DID_DOC)
self.assertEqual('https://bsky.app/profile/han.dull', user.web_url())
@patch('requests_cache.CachedSession.get',
return_value=requests_response('', status=404))
@patch('requests.get', return_value=requests_response('', status=404))
def test_handle_or_id(self, mock_get):
user = self.make_user('did:plc:user', cls=ATProto)
self.assertIsNone(user.handle)
@ -438,8 +434,7 @@ class ATProtoTest(TestCase):
self.assertEqual('han.dull', user.handle)
self.assertEqual('han.dull', user.handle_or_id())
@patch('requests_cache.CachedSession.get',
return_value=requests_response('', status=404))
@patch('requests.get', return_value=requests_response('', status=404))
def test_handle_as(self, mock_get):
user = self.make_user('did:plc:user', cls=ATProto)
@ -450,7 +445,7 @@ class ATProtoTest(TestCase):
self.store_object(id='did:plc:user', raw=DID_DOC)
self.assertEqual('@han.dull@atproto.brid.gy', user.handle_as('activitypub'))
@patch('requests_cache.CachedSession.get', return_value=requests_response(DID_DOC))
@patch('requests.get', return_value=requests_response(DID_DOC))
def test_profile_id(self, mock_get):
self.assertEqual('at://did:plc:user/app.bsky.actor.profile/self',
self.make_user('did:plc:user', cls=ATProto).profile_id())
@ -458,7 +453,7 @@ class ATProtoTest(TestCase):
@patch('atproto.DEBUG', new=False)
@patch('google.cloud.dns.client.ManagedZone', autospec=True)
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests_cache.CachedSession.post',
@patch('requests.post',
return_value=requests_response('OK')) # create DID on PLC
def test_create_for(self, mock_post, mock_create_task, mock_zone):
mock_zone.return_value = zone = MagicMock()
@ -507,7 +502,7 @@ class ATProtoTest(TestCase):
@patch('google.cloud.dns.client.ManagedZone', autospec=True)
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests_cache.CachedSession.post',
@patch('requests.post',
return_value=requests_response('OK')) # create DID on PLC
def test_send_new_repo(self, mock_post, mock_create_task, _):
user = self.make_user(id='fake:user', cls=Fake)
@ -569,11 +564,11 @@ class ATProtoTest(TestCase):
self.assert_task(mock_create_task, 'atproto-commit',
'/queue/atproto-commit')
@patch('requests_cache.CachedSession.get', return_value=requests_response(
@patch('requests.get', return_value=requests_response(
'blob contents', content_type='image/png')) # image blob fetch
@patch('google.cloud.dns.client.ManagedZone', autospec=True)
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests_cache.CachedSession.post',
@patch('requests.post',
return_value=requests_response('OK')) # create DID on PLC
def test_send_new_repo_includes_user_profile(self, mock_post, mock_create_task,
_, __):
@ -854,8 +849,7 @@ class ATProtoTest(TestCase):
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests.get')
@patch('requests_cache.CachedSession.get', return_value=requests_response(DID_DOC))
def test_poll_notifications(self, _, mock_get, mock_create_task):
def test_poll_notifications(self, mock_get, mock_create_task):
user_a = self.make_user(id='fake:user-a', cls=Fake,
copies=[Target(uri='did:plc:a', protocol='atproto')])
user_b = self.make_user(id='fake:user-b', cls=Fake,
@ -919,6 +913,7 @@ class ATProtoTest(TestCase):
'reason': 'reply',
}],
}),
requests_response(DID_DOC),
requests_response({
'cursor': '...',
'notifications': [{
@ -947,8 +942,8 @@ class ATProtoTest(TestCase):
assert mock_get.call_args_list[0].kwargs['headers'].pop('Authorization')
self.assertEqual(expected_list_notifs, mock_get.call_args_list[0])
assert mock_get.call_args_list[1].kwargs['headers'].pop('Authorization')
self.assertEqual(expected_list_notifs, mock_get.call_args_list[1])
assert mock_get.call_args_list[2].kwargs['headers'].pop('Authorization')
self.assertEqual(expected_list_notifs, mock_get.call_args_list[2])
like_obj = Object.get_by_id('at://did:plc:d/app.bsky.feed.like/123')
self.assertEqual(like, like_obj.bsky)
@ -967,11 +962,7 @@ class ATProtoTest(TestCase):
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests.get')
@patch('requests_cache.CachedSession.get', return_value=requests_response({
**DID_DOC,
'id': 'did:plc:alice.com',
}))
def test_poll_posts(self, _, mock_get, mock_create_task):
def test_poll_posts(self, mock_get, mock_create_task):
user_a = self.make_user(id='fake:user-a', cls=Fake,
copies=[Target(uri='did:plc:a', protocol='atproto')])
user_b = self.make_user(id='fake:user-b', cls=Fake,
@ -1007,6 +998,10 @@ class ATProtoTest(TestCase):
'post': post_view,
}],
}),
requests_response({
**DID_DOC,
'id': 'did:plc:alice.com',
}),
requests_response({
'cursor': '...',
'feed': [],
@ -1042,6 +1037,7 @@ class ATProtoTest(TestCase):
})
self.assertEqual([
get_timeline,
self.req('https://alice.com/.well-known/did.json'),
get_timeline,
get_timeline,
], mock_get.call_args_list)

Wyświetl plik

@ -133,7 +133,7 @@ class ConvertTest(testutil.TestCase):
base_url='https://ap.brid.gy/')
self.assertEqual(404, resp.status_code)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_activitypub_to_web_fetch(self, mock_get):
mock_get.return_value = self.as2_resp(as2.from_as1(COMMENT))
url = 'https://user.com/bar?baz=baj&biff'
@ -147,7 +147,7 @@ class ConvertTest(testutil.TestCase):
mock_get.assert_has_calls((self.as2_req(url),))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_activitypub_to_web_fetch_fails(self, mock_get):
mock_get.side_effect = [requests_response('', status=405)]
@ -269,7 +269,7 @@ A ☕ reply
# self.assertEqual(f'https://ap.brid.gy/convert/web/https:/foo%3Fbar%23baz',
# resp.headers['Location'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_web_to_activitypub_object(self, mock_get):
mock_get.return_value = requests_response(HTML_NO_ID)
@ -282,7 +282,7 @@ A ☕ reply
self.assertEqual(200, resp.status_code)
self.assert_equals(COMMENT_AS2, resp.json, ignore=['to'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_web_to_activitypub_fetch(self, mock_get):
mock_get.return_value = requests_response(HTML) # protocol inference
url = 'https://user.com/bar?baz=baj&biff'
@ -294,7 +294,7 @@ A ☕ reply
self.assertEqual(200, resp.status_code)
self.assert_equals(COMMENT_AS2, resp.json, ignore=['to'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_web_to_activitypub_no_user(self, mock_get):
hcard = requests_response("""
<html>
@ -320,7 +320,7 @@ A ☕ reply
'attributedTo': 'https://web.brid.gy/nope.com',
}, resp.json, ignore=['to'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_web_to_activitypub_url_decode(self, mock_get):
"""https://github.com/snarfed/bridgy-fed/issues/581"""
mock_get.return_value = requests_response(HTML_NO_ID)

Wyświetl plik

@ -60,7 +60,7 @@ UNDO_FOLLOW = {
del UNDO_FOLLOW['object']['id']
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
class RemoteFollowTest(TestCase):
def setUp(self):
@ -133,8 +133,8 @@ class RemoteFollowTest(TestCase):
self.assertEqual('/web/user.com', got.headers['Location'])
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests.post')
@patch('requests.get')
class FollowTest(TestCase):
def setUp(self):
@ -146,9 +146,9 @@ class FollowTest(TestCase):
'state': '@foo@ba.r',
}
# IndieAuth endpoint discovery
@patch('requests.get', return_value=requests_response(''))
def test_start(self, _, __, ___):
def test_start(self, mock_get, _):
mock_get.return_value = requests_response('') # IndieAuth endpoint discovery
resp = self.client.post('/follow/start', data={
'me': 'https://alice.com',
'address': '@foo@ba.r',
@ -157,16 +157,17 @@ class FollowTest(TestCase):
self.assertTrue(resp.headers['Location'].startswith(indieauth.INDIEAUTH_URL),
resp.headers['Location'])
# indieauth endpoint discovery, token validation
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_address(self, _, __, mock_get, mock_post):
def test_callback_address(self, mock_get, mock_post):
mock_get.side_effect = (
requests_response(''), # indieauth https://alice.com fetch for user json
WEBFINGER,
self.as2_resp(FOLLOWEE),
self.as2_resp(FOLLOWEE),
)
mock_post.return_value = requests_response('OK') # AP Follow to inbox
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
state = util.encode_oauth_state(self.state)
resp = self.client.get(f'/follow/callback?code=my_code&state={state}',
@ -176,14 +177,14 @@ class FollowTest(TestCase):
self.req('https://ba.r/.well-known/webfinger?resource=acct:foo@ba.r'),
))
@patch('requests.get', return_value=requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_url(self, _, __, mock_get, mock_post):
def test_callback_url(self, mock_get, mock_post):
mock_get.side_effect = (
requests_response(''), # indieauth https://alice.com fetch for user json
self.as2_resp(FOLLOWEE),
self.as2_resp(FOLLOWEE),
)
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
@ -193,13 +194,15 @@ class FollowTest(TestCase):
base_url='https://fed.brid.gy/')
self.check('https://ba.r/actor', resp, FOLLOW_URL, mock_get, mock_post)
@patch('requests.get', return_value=requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_stored_followee_with_our_as1(self, _, __, mock_get, mock_post):
def test_callback_stored_followee_with_our_as1(self, mock_get, mock_post):
self.store_object(id='https://ba.r/id', our_as1=as2.to_as1(FOLLOWEE),
source_protocol='activitypub')
mock_get.side_effect = (
requests_response(''), # indieauth https://alice.com fetch for user json
)
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
@ -216,9 +219,7 @@ class FollowTest(TestCase):
self.check('https://ba.r/id', resp, follow_with_profile_link, mock_get,
mock_post, fetched_followee=False)
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_user_with_custom_username(self, _, __, mock_get, mock_post):
def test_callback_user_with_custom_username(self, mock_get, mock_post):
self.user.obj.clear()
self.user.obj.as2 = {
'type': 'Person',
@ -227,10 +228,14 @@ class FollowTest(TestCase):
self.user.obj.put()
mock_get.side_effect = (
requests_response(''), # indieauth https://alice.com fetch for user json
self.as2_resp(FOLLOWEE),
self.as2_resp(FOLLOWEE),
)
mock_post.return_value = requests_response('OK') # AP Follow to inbox
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
self.state['state'] = 'https://ba.r/actor'
state = util.encode_oauth_state(self.state)
@ -247,9 +252,7 @@ class FollowTest(TestCase):
},
})
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_composite_url_field(self, _, __, mock_get, mock_post):
def test_callback_composite_url_field(self, mock_get, mock_post):
"""https://console.cloud.google.com/errors/detail/CKmLytj-nPv9RQ;time=P30D?project=bridgy-federated"""
followee = {
**FOLLOWEE,
@ -262,10 +265,14 @@ class FollowTest(TestCase):
}],
}
mock_get.side_effect = (
requests_response(''), # indieauth https://alice.com fetch for user json
self.as2_resp(followee),
self.as2_resp(followee),
)
mock_post.return_value = requests_response('OK') # AP Follow to inbox
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
self.state['state'] = 'https://ba.r/actor'
state = util.encode_oauth_state(self.state)
@ -274,10 +281,10 @@ class FollowTest(TestCase):
self.check('https://ba.r/actor', resp, FOLLOW_URL, mock_get, mock_post)
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_bridged_account_error(self, _, __, mock_get, mock_post):
def test_callback_bridged_account_error(self, mock_get, mock_post):
mock_post.return_value = requests_response('me=https://alice.com')
mock_get.side_effect = [
requests_response(''), # indieauth https://alice.com fetch for user json
requests_response({ # webfinger
'subject': 'acct:bob.com@web.brid.gy',
'aliases': ['https://bob.com/'],
@ -299,10 +306,10 @@ class FollowTest(TestCase):
["@bob.com@web.brid.gy is a bridged account. Try following them on the web!"],
get_flashed_messages())
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_upgraded_bridged_account_error(self, _, __, mock_get, mock_post):
def test_callback_upgraded_bridged_account_error(self, mock_get, mock_post):
mock_post.return_value = requests_response('me=https://alice.com')
mock_get.side_effect = [
requests_response(''), # indieauth https://alice.com fetch for user json
requests_response({ # webfinger
'subject': 'acct:bob.com@bob.com',
'aliases': ['https://bob.com/'],
@ -373,26 +380,26 @@ class FollowTest(TestCase):
self.assertEqual('https://alice.com', session['indieauthed-me'])
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_missing_user(self, _, mock_get, mock_post):
def test_callback_missing_user(self, mock_get, mock_post):
self.user.key.delete()
mock_post.return_value = requests_response('me=https://alice.com')
state = util.encode_oauth_state(self.state)
resp = self.client.get(f'/follow/callback?code=my_code&state={state}')
self.assertEqual(400, resp.status_code)
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_user_use_instead(self, _, __, mock_get, mock_post):
def test_callback_user_use_instead(self, mock_get, mock_post):
user = self.make_user('www.alice.com', cls=Web,
obj_id='https://www.alice.com/')
self.user.use_instead = user.key
self.user.put()
mock_get.side_effect = (
requests_response(''),
self.as2_resp(FOLLOWEE),
self.as2_resp(FOLLOWEE),
)
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
@ -428,9 +435,7 @@ class FollowTest(TestCase):
followers,
ignore=['created', 'updated'])
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_url_composite_url(self, _, __, mock_get, mock_post):
def test_callback_url_composite_url(self, mock_get, mock_post):
followee = {
**FOLLOWEE,
'attachments': [{
@ -440,10 +445,12 @@ class FollowTest(TestCase):
}],
}
mock_get.side_effect = (
requests_response(''),
self.as2_resp(followee),
self.as2_resp(followee),
)
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Follow to inbox
)
@ -476,8 +483,11 @@ class FollowTest(TestCase):
}, base_url='https://fed.brid.gy/')
self.check('https://ba.r/actor', resp, FOLLOW_URL, mock_get, mock_post)
@patch('requests.get', return_value= requests_response(''))
def test_indieauthed_session_wrong_me(self, _, mock_get, mock_post):
def test_indieauthed_session_wrong_me(self, mock_get, mock_post):
mock_get.side_effect = (
requests_response(''), # IndieAuth endpoint discovery
)
with self.client.session_transaction(base_url='https://fed.brid.gy/') \
as ctx_session:
ctx_session['indieauthed-me'] = 'https://eve.com'
@ -490,8 +500,9 @@ class FollowTest(TestCase):
self.assertTrue(resp.headers['Location'].startswith(indieauth.INDIEAUTH_URL),
resp.headers['Location'])
@patch('requests.get', side_effect=requests.ConnectionError('foo'))
def test_start_homepage_fetch_fails(self, _, mock_get, mock_post):
def test_start_homepage_fetch_fails(self, mock_get, mock_post):
mock_get.side_effect = requests.ConnectionError('foo')
resp = self.client.post('/follow/start', data={
'me': 'https://alice.com',
'address': 'https://ba.r/actor',
@ -503,8 +514,8 @@ class FollowTest(TestCase):
get_flashed_messages())
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests.post')
@patch('requests.get')
class UnfollowTest(TestCase):
def setUp(self):
@ -523,9 +534,9 @@ class UnfollowTest(TestCase):
'state': self.follower.key.id(),
})
# IndieAuth endpoint discovery
@patch('requests.get', return_value= requests_response(''))
def test_start(self, _, mock_get, mock_post):
def test_start(self, mock_get, _):
mock_get.return_value = requests_response('') # IndieAuth endpoint discovery
resp = self.client.post('/unfollow/start', data={
'me': 'https://alice.com',
'key': self.follower.key.id(),
@ -534,11 +545,11 @@ class UnfollowTest(TestCase):
self.assertTrue(resp.headers['Location'].startswith(indieauth.INDIEAUTH_URL),
resp.headers['Location'])
# indieauth endpoint discovery, token validation
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback(self, _, __, mock_get, mock_post):
def test_callback(self, mock_get, mock_post):
# oauth-dropins indieauth https://alice.com fetch for user json
mock_get.return_value = requests_response('')
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Undo Follow to inbox
)
@ -546,9 +557,7 @@ class UnfollowTest(TestCase):
base_url='https://fed.brid.gy/')
self.check(resp, UNDO_FOLLOW, mock_get, mock_post)
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_last_follow_object_str(self, _, __, mock_get, mock_post):
def test_callback_last_follow_object_str(self, mock_get, mock_post):
to = self.follower.to.get()
to.obj = None
to.put()
@ -558,10 +567,13 @@ class UnfollowTest(TestCase):
obj.put()
mock_get.side_effect = (
# oauth-dropins indieauth https://alice.com fetch for user json
requests_response(''),
# actor fetch to discover inbox
self.as2_resp(FOLLOWEE),
)
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Undo Follow to inbox
)
@ -607,9 +619,7 @@ class UnfollowTest(TestCase):
self.assertEqual('https://alice.com', session['indieauthed-me'])
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_user_use_instead(self, _, __, mock_get, mock_post):
def test_callback_user_use_instead(self, mock_get, mock_post):
user = self.make_user('www.alice.com', cls=Web)
self.user.use_instead = user.key
self.user.put()
@ -620,7 +630,9 @@ class UnfollowTest(TestCase):
follow=Object(id=FOLLOW_ADDRESS['id'], as2=FOLLOW_ADDRESS).put(),
status='active')
mock_get.return_value = requests_response('')
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Undo Follow to inbox
)
@ -647,7 +659,7 @@ class UnfollowTest(TestCase):
}
del expected_undo['object']['id']
inbox_args, inbox_kwargs = mock_post.call_args
inbox_args, inbox_kwargs = mock_post.call_args_list[1]
self.assertEqual(('http://ba.r/inbox',), inbox_args)
self.assert_equals({
**expected_undo,
@ -668,9 +680,7 @@ class UnfollowTest(TestCase):
delivered=['http://ba.r/inbox'],
delivered_protocol='activitypub')
@patch('requests.get', return_value= requests_response(''))
@patch('requests.post', return_value=requests_response('me=https://alice.com'))
def test_callback_composite_url(self, _, __, mock_get, mock_post):
def test_callback_composite_url(self, mock_get, mock_post):
follower = self.follower.to.get().obj
follower.our_as1 = {
**as2.to_as1(FOLLOWEE),
@ -681,7 +691,10 @@ class UnfollowTest(TestCase):
}
follower.put()
# oauth-dropins indieauth https://alice.com fetch for user json
mock_get.return_value = requests_response('')
mock_post.side_effect = (
requests_response('me=https://alice.com'),
requests_response('OK'), # AP Undo Follow to inbox
)
@ -691,8 +704,9 @@ class UnfollowTest(TestCase):
get_flashed_messages())
self.check(resp, UNDO_FOLLOW, mock_get, mock_post)
@patch('requests.get', return_value= requests_response(''))
def test_indieauthed_session(self, _, mock_get, mock_post):
def test_indieauthed_session(self, mock_get, mock_post):
# oauth-dropins indieauth https://alice.com fetch for user json
mock_get.return_value = requests_response('')
mock_post.side_effect = (
requests_response('OK'), # AP Undo Follow to inbox
)
@ -707,8 +721,11 @@ class UnfollowTest(TestCase):
}, base_url='https://fed.brid.gy/')
self.check(resp, UNDO_FOLLOW, mock_get, mock_post)
@patch('requests.get', return_value= requests_response(''))
def test_indieauthed_session_wrong_me(self, _, mock_get, mock_post):
def test_indieauthed_session_wrong_me(self, mock_get, mock_post):
mock_get.side_effect = (
requests_response(''), # IndieAuth endpoint discovery
)
with self.client.session_transaction(base_url='https://fed.brid.gy/') \
as ctx_session:
ctx_session['indieauthed-me'] = 'https://eve.com'
@ -721,8 +738,9 @@ class UnfollowTest(TestCase):
self.assertTrue(resp.headers['Location'].startswith(indieauth.INDIEAUTH_URL),
resp.headers['Location'])
@patch('requests.get', side_effect=requests.ConnectionError('foo'))
def test_start_homepage_fetch_fails(self, _, mock_get, mock_post):
def test_start_homepage_fetch_fails(self, mock_get, mock_post):
mock_get.side_effect = requests.ConnectionError('foo')
resp = self.client.post('/unfollow/start', data={
'me': 'https://alice.com',
'key': self.follower.key.id(),

Wyświetl plik

@ -24,7 +24,7 @@ DID_DOC = {
class IntegrationTests(TestCase):
@patch('requests_cache.CachedSession.post')
@patch('requests.post')
@patch('requests.get')
@patch('common.ENABLED_BRIDGES', new=[('activitypub', 'atproto')])
def test_atproto_notify_reply_to_activitypub(self, mock_get, mock_post):

Wyświetl plik

@ -67,7 +67,7 @@ class UserTest(TestCase):
self.assert_entities_equal(same, user, ignore=['updated'])
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests_cache.CachedSession.post',
@patch('requests.post',
return_value=requests_response('OK')) # create DID on PLC
def test_get_or_create_propagate(self, mock_post, mock_create_task):
common.RUN_TASKS_INLINE = False
@ -108,8 +108,8 @@ class UserTest(TestCase):
mock_create_task.assert_called()
@patch.object(tasks_client, 'create_task')
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests.post')
@patch('requests.get')
def test_get_or_create_propagate_not_enabled(self, mock_get, mock_post,
mock_create_task):
mock_get.return_value = self.as2_resp(ACTOR)
@ -622,8 +622,7 @@ class ObjectTest(TestCase):
}
self.assert_equals('good', Object(our_as1=obj, atom='trigger').as1['id'])
@patch('requests_cache.CachedSession.get',
return_value=requests_response(DID_DOC))
@patch('requests.get', return_value=requests_response(DID_DOC))
def test_as1_from_bsky(self, mock_get):
like_bsky = {
'$type': 'app.bsky.feed.like',

Wyświetl plik

@ -400,7 +400,7 @@ class PagesTest(TestCase):
self.assertIn('Dr. Eve', got.text)
@patch.object(tasks_client, 'create_task', return_value=Task(name='my task'))
@patch('requests_cache.CachedSession.post',
@patch('requests.post',
return_value=requests_response('OK')) # create DID on PLC
def test_bridge_user(self, mock_post, mock_create_task):
common.RUN_TASKS_INLINE = False

Wyświetl plik

@ -112,26 +112,26 @@ class ProtocolTest(TestCase):
self.store_object(id='http://ba.d/obj')
self.assertIsNone(Protocol.for_id('http://ba.d/obj'))
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_for_id_activitypub_fetch(self, mock_get):
mock_get.return_value = self.as2_resp(ACTOR)
self.assertEqual(ActivityPub, Protocol.for_id('http://a.p/actor'))
self.assertIn(self.as2_req('http://a.p/actor'), mock_get.mock_calls)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_for_id_activitypub_fetch_fails(self, mock_get):
mock_get.return_value = requests_response('', status=403)
self.assertIsNone(Protocol.for_id('http://a.p/actor'))
self.assertIn(self.as2_req('http://a.p/actor'), mock_get.mock_calls)
mock_get.assert_called_once()
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_for_id_web_fetch(self, mock_get):
mock_get.return_value = ACTOR_HTML_RESP
self.assertEqual(Web, Protocol.for_id('http://web.site/'))
self.assertIn(self.req('http://web.site/'), mock_get.mock_calls)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_for_id_web_fetch_no_mf2(self, mock_get):
mock_get.return_value = requests_response('<html></html>')
self.assertIsNone(Protocol.for_id('http://web.site/'))
@ -270,7 +270,7 @@ class ProtocolTest(TestCase):
self.assertFalse(loaded.new)
self.assertEqual(['foo'], Fake.fetched)
@patch('requests_cache.CachedSession.get', return_value=ACTOR_HTML_RESP)
@patch('requests.get', return_value=ACTOR_HTML_RESP)
def test_load_remote_true_clear_our_as1(self, _):
self.store_object(id='https://fo.o', our_as1={'should': 'disappear'},
source_protocol='web')
@ -1558,8 +1558,8 @@ class ProtocolReceiveTest(TestCase):
self.assertEqual(1, len(followers))
self.assertEqual(self.alice.key, followers[0].to)
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests.post')
@patch('requests.get')
def test_skip_web_same_domain(self, mock_get, mock_post):
Web.fetchable = {
'http://x.com/alice': {},

Wyświetl plik

@ -94,7 +94,7 @@ class RedirectTest(testutil.TestCase):
self.assert_user(Web, 'user.com', direct=False)
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_as2_fetch_post(self, mock_get):
mock_get.side_effect = [
requests_response(REPOST_HTML),
@ -107,7 +107,7 @@ class RedirectTest(testutil.TestCase):
self.assert_equals(REPOST_AS2, resp.json)
self.assertEqual('Accept', resp.headers['Vary'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_as2_fetch_post_no_backlink(self, mock_get):
mock_get.side_effect = [
requests_response(
@ -121,7 +121,7 @@ class RedirectTest(testutil.TestCase):
self.assert_equals(REPOST_AS2, resp.json)
self.assertEqual('Accept', resp.headers['Vary'])
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_as2_no_user_fetch_homepage(self, mock_get):
mock_get.return_value = requests_response(ACTOR_HTML)
self.user.key.delete()

Wyświetl plik

@ -410,8 +410,8 @@ ACTIVITYPUB_GETS = [
]
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests.post')
@patch('requests.get')
class WebTest(TestCase):
def setUp(self):
super().setUp()
@ -2477,8 +2477,8 @@ http://this/404s
"Couldn't connect to https://orig.co/: "))
@patch('requests_cache.CachedSession.post')
@patch('requests_cache.CachedSession.get')
@patch('requests.post')
@patch('requests.get')
class WebUtilTest(TestCase):
def setUp(self):

Wyświetl plik

@ -321,7 +321,7 @@ class WebfingerTest(TestCase):
finally:
PROTOCOLS.pop('nohandle')
@patch('requests_cache.CachedSession.get')
@patch('requests.get')
def test_create_user(self, mock_get):
self.user.key.delete()
self.user.obj_key.delete()
@ -348,22 +348,20 @@ class WebfingerTest(TestCase):
got = self.client.get('/.well-known/webfinger?resource=acct%3A%40localhost')
self.assertEqual(400, got.status_code, got.get_data(as_text=True))
@patch('requests_cache.CachedSession.get', return_value=requests_response(
@patch('requests.get', return_value=requests_response(
WEBFINGER, content_type='application/jrd+json'))
def test_fetch(self, mock_get):
self.assertEqual(WEBFINGER, fetch('@foo@bar'))
self.assert_req(mock_get,
'https://bar/.well-known/webfinger?resource=acct:foo@bar')
@patch('requests_cache.CachedSession.get',
return_value=requests_response(WEBFINGER))
@patch('requests.get', return_value=requests_response(WEBFINGER))
def test_fetch_actor_url(self, mock_get):
self.assertEqual('http://localhost/user.com', fetch_actor_url('@foo@bar'))
self.assert_req(mock_get,
'https://bar/.well-known/webfinger?resource=acct:foo@bar')
@patch('requests_cache.CachedSession.get',
return_value=requests_response({'links': []}))
@patch('requests.get', return_value=requests_response({'links': []}))
def test_fetch_actor_url_not_found(self, mock_get):
self.assertIsNone(fetch_actor_url('@foo@bar'))
self.assert_req(mock_get,

14
web.py
Wyświetl plik

@ -243,7 +243,7 @@ class Web(User, Protocol):
root = domain.removeprefix("www.")
root_site = f'https://{root}/'
try:
resp = common.requests_get(root_site, gateway=False)
resp = util.requests_get(root_site, gateway=False)
if resp.ok and self.is_web_url(resp.url):
logger.info(f'{root_site} serves ok ; using {root} instead')
root_user = Web.get_or_create(root)
@ -261,7 +261,7 @@ class Web(User, Protocol):
self.redirects_error = None
try:
url = urljoin(self.web_url(), path)
resp = common.requests_get(url, gateway=False)
resp = util.requests_get(url, gateway=False)
domain_urls = ([f'https://{domain}/' for domain in common.DOMAINS] +
[common.host_url()])
expected = [urljoin(url, path) for url in domain_urls]
@ -398,7 +398,7 @@ class Web(User, Protocol):
if not endpoint:
return False
webmention.send(endpoint, source_url, url, session=common.requests_session())
webmention.send(endpoint, source_url, url)
return True
@classmethod
@ -435,8 +435,8 @@ class Web(User, Protocol):
else None)
try:
parsed = common.fetch_mf2(url, gateway=gateway, metaformats_hcard=True,
require_backlink=require_backlink)
parsed = util.fetch_mf2(url, gateway=gateway, metaformats_hcard=True,
require_backlink=require_backlink)
except ValueError as e:
error(str(e))
@ -492,7 +492,7 @@ class Web(User, Protocol):
if not isinstance(author, dict):
logger.info(f'Fetching full authorship for author {author}')
author = mf2util.find_author({'items': [entry]}, hentry=entry,
fetch_mf2_func=common.fetch_mf2)
fetch_mf2_func=util.fetch_mf2)
logger.info(f'Got: {author}')
if author:
props['author'] = util.trim_nulls([{
@ -671,7 +671,7 @@ def poll_feed_task():
headers['If-None-Match'] = user.feed_etag
if user.feed_last_modified:
headers['If-Modified-Since'] = user.feed_last_modified
resp = common.requests_get(url, headers=headers, gateway=True)
resp = util.requests_get(url, headers=headers, gateway=True)
content_type = resp.headers.get('Content-Type') or ''
type = FEED_TYPES.get(content_type.split(';')[0])

Wyświetl plik

@ -225,7 +225,7 @@ def fetch(addr):
return None
try:
resp = common.requests_get(
resp = util.requests_get(
f'https://{addr_domain}/.well-known/webfinger?resource={resource}')
except BaseException as e:
if util.is_connection_failure(e):