kopia lustrzana https://github.com/snarfed/bridgy-fed
set User-Agent header globally
rodzic
ee7b36c28d
commit
1d36d31064
|
@ -87,7 +87,7 @@ def actor(domain):
|
|||
if tld in common.TLD_BLOCKLIST:
|
||||
error('', status=404)
|
||||
|
||||
mf2 = util.fetch_mf2(f'http://{domain}/', gateway=True, headers=common.HEADERS)
|
||||
mf2 = util.fetch_mf2(f'http://{domain}/', gateway=True)
|
||||
|
||||
hcard = mf2util.representative_hcard(mf2, mf2['url'])
|
||||
logger.info(f'Representative h-card: {json_dumps(hcard, indent=2)}')
|
||||
|
|
2
app.py
2
app.py
|
@ -34,5 +34,7 @@ app.wsgi_app = flask_util.ndb_context_middleware(
|
|||
|
||||
cache = Cache(app)
|
||||
|
||||
util.set_user_agent('Bridgy Fed (https://fed.brid.gy/)')
|
||||
|
||||
|
||||
import activitypub, add_webmention, logs, redirect, render, salmon, superfeedr, webfinger, webmention
|
||||
|
|
10
common.py
10
common.py
|
@ -22,9 +22,6 @@ DOMAIN_RE = r'([^/:]+\.[^/:]+)'
|
|||
ACCT_RE = r'(?:acct:)?([^@]+)@' + DOMAIN_RE
|
||||
TLD_BLOCKLIST = ('7z', 'asp', 'aspx', 'gif', 'html', 'ico', 'jpg', 'jpeg', 'js',
|
||||
'json', 'php', 'png', 'rar', 'txt', 'yaml', 'yml', 'zip')
|
||||
HEADERS = {
|
||||
'User-Agent': 'Bridgy Fed (https://fed.brid.gy/)',
|
||||
}
|
||||
XML_UTF8 = "<?xml version='1.0' encoding='UTF-8'?>\n"
|
||||
LINK_HEADER_RE = re.compile(r""" *< *([^ >]+) *> *; *rel=['"]([^'"]+)['"] *""")
|
||||
AS2_PUBLIC_AUDIENCE = 'https://www.w3.org/ns/activitystreams#Public'
|
||||
|
@ -76,8 +73,7 @@ def requests_post(url, **kwargs):
|
|||
|
||||
|
||||
def _requests_fn(fn, url, parse_json=False, **kwargs):
|
||||
"""Wraps requests.* and adds raise_for_status() and User-Agent."""
|
||||
kwargs.setdefault('headers', {}).update(HEADERS)
|
||||
"""Wraps requests.* and adds raise_for_status()."""
|
||||
resp = fn(url, gateway=True, **kwargs)
|
||||
|
||||
logger.info(f'Got {resp.status_code} headers: {resp.headers}')
|
||||
|
@ -206,9 +202,9 @@ def send_webmentions(activity_wrapped, proxy=None, **response_props):
|
|||
logger.info(f'Sending webmention from {wm_source} to {target}')
|
||||
|
||||
try:
|
||||
endpoint = webmention.discover(target, headers=HEADERS).endpoint
|
||||
endpoint = webmention.discover(target).endpoint
|
||||
if endpoint:
|
||||
webmention.send(endpoint, wm_source, target, headers=HEADERS)
|
||||
webmention.send(endpoint, wm_source, target)
|
||||
response.status = 'complete'
|
||||
logger.info('Success!')
|
||||
else:
|
||||
|
|
|
@ -151,8 +151,7 @@ class ActivityPubTest(testutil.TestCase):
|
|||
""", url='https://foo.com/', content_type=common.CONTENT_TYPE_HTML)
|
||||
|
||||
got = self.client.get('/foo.com')
|
||||
mock_get.assert_called_once_with('http://foo.com/', headers=common.HEADERS,
|
||||
stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://foo.com/')
|
||||
self.assertEqual(200, got.status_code)
|
||||
type = got.headers['Content-Type']
|
||||
self.assertTrue(type.startswith(common.CONTENT_TYPE_AS2), type)
|
||||
|
@ -187,8 +186,7 @@ class ActivityPubTest(testutil.TestCase):
|
|||
""")
|
||||
|
||||
got = self.client.get('/foo.com')
|
||||
mock_get.assert_called_once_with('http://foo.com/', headers=common.HEADERS,
|
||||
stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://foo.com/')
|
||||
self.assertEqual(400, got.status_code)
|
||||
self.assertIn('representative h-card', got.get_data(as_text=True))
|
||||
|
||||
|
@ -226,19 +224,17 @@ class ActivityPubTest(testutil.TestCase):
|
|||
|
||||
got = self.client.post('/foo.com/inbox', json=as2)
|
||||
self.assertEqual(200, got.status_code, got.get_data(as_text=True))
|
||||
mock_get.assert_called_once_with(
|
||||
'http://orig/post', headers=common.HEADERS, timeout=15, stream=True)
|
||||
|
||||
expected_headers = copy.deepcopy(common.HEADERS)
|
||||
expected_headers['Accept'] = '*/*'
|
||||
mock_post.assert_called_once_with(
|
||||
self.assert_req(mock_get, 'http://orig/post')
|
||||
self.assert_req(
|
||||
mock_post,
|
||||
'http://orig/webmention',
|
||||
headers={'Accept': '*/*'},
|
||||
allow_redirects=False,
|
||||
data={
|
||||
'source': 'http://localhost/render?source=http%3A%2F%2Fthis%2Freply&target=http%3A%2F%2Forig%2Fpost',
|
||||
'target': 'http://orig/post',
|
||||
},
|
||||
allow_redirects=False, timeout=15, stream=True,
|
||||
headers=expected_headers)
|
||||
)
|
||||
|
||||
resp = Response.get_by_id('http://this/reply http://orig/post')
|
||||
self.assertEqual('in', resp.direction)
|
||||
|
@ -256,9 +252,7 @@ class ActivityPubTest(testutil.TestCase):
|
|||
got = self.client.post('/foo.com/inbox', json=reply)
|
||||
self.assertEqual(200, got.status_code, got.get_data(as_text=True))
|
||||
|
||||
mock_head.assert_called_once_with(
|
||||
'http://this', allow_redirects=True, stream=True, timeout=15,
|
||||
headers=ANY)
|
||||
self.assert_req(mock_head, 'http://this', allow_redirects=True)
|
||||
mock_get.assert_not_called()
|
||||
mock_post.assert_not_called()
|
||||
self.assertEqual(0, Response.query().count())
|
||||
|
@ -278,19 +272,17 @@ class ActivityPubTest(testutil.TestCase):
|
|||
with self.client:
|
||||
got = self.client.post('/foo.com/inbox', json=as2)
|
||||
self.assertEqual(200, got.status_code, got.get_data(as_text=True))
|
||||
mock_get.assert_called_once_with(
|
||||
'http://target/', headers=common.HEADERS, timeout=15, stream=True)
|
||||
|
||||
expected_headers = copy.deepcopy(common.HEADERS)
|
||||
expected_headers['Accept'] = '*/*'
|
||||
mock_post.assert_called_once_with(
|
||||
self.assert_req(mock_get, 'http://target/')
|
||||
self.assert_req(
|
||||
mock_post,
|
||||
'http://target/webmention',
|
||||
headers={'Accept': '*/*'},
|
||||
allow_redirects=False,
|
||||
data={
|
||||
'source': 'http://localhost/render?source=http%3A%2F%2Fthis%2Fmention&target=http%3A%2F%2Ftarget%2F',
|
||||
'target': 'http://target/',
|
||||
},
|
||||
allow_redirects=False, timeout=15, stream=True,
|
||||
headers=expected_headers)
|
||||
)
|
||||
|
||||
resp = Response.get_by_id('http://this/mention http://target/')
|
||||
self.assertEqual('in', resp.direction)
|
||||
|
@ -312,12 +304,9 @@ class ActivityPubTest(testutil.TestCase):
|
|||
got = self.client.post('/foo.com/inbox', json=LIKE)
|
||||
self.assertEqual(200, got.status_code)
|
||||
|
||||
as2_headers = copy.deepcopy(common.HEADERS)
|
||||
as2_headers.update(common.CONNEG_HEADERS_AS2_HTML)
|
||||
mock_get.assert_has_calls((
|
||||
call('http://orig/actor', headers=as2_headers, stream=True, timeout=15),
|
||||
call('http://orig/post', headers=common.HEADERS, stream=True, timeout=15),
|
||||
))
|
||||
self.assert_req(mock_get, 'http://orig/actor',
|
||||
headers=common.CONNEG_HEADERS_AS2_HTML)
|
||||
self.assert_req(mock_get, 'http://orig/post')
|
||||
|
||||
args, kwargs = mock_post.call_args
|
||||
self.assertEqual(('http://orig/webmention',), args)
|
||||
|
@ -348,11 +337,8 @@ class ActivityPubTest(testutil.TestCase):
|
|||
got = self.client.post('/foo.com/inbox', json=FOLLOW_WRAPPED)
|
||||
self.assertEqual(200, got.status_code)
|
||||
|
||||
as2_headers = copy.deepcopy(common.HEADERS)
|
||||
as2_headers.update(common.CONNEG_HEADERS_AS2_HTML)
|
||||
mock_get.assert_has_calls((
|
||||
call(FOLLOW['actor'], headers=as2_headers, stream=True, timeout=15),
|
||||
))
|
||||
self.assert_req(mock_get, FOLLOW['actor'],
|
||||
headers=common.CONNEG_HEADERS_AS2_HTML)
|
||||
|
||||
# check AP Accept
|
||||
self.assertEqual(2, len(mock_post.call_args_list))
|
||||
|
|
|
@ -60,10 +60,7 @@ class SalmonTest(testutil.TestCase):
|
|||
))
|
||||
|
||||
# check webmention discovery
|
||||
self.expected_headers = copy.deepcopy(common.HEADERS)
|
||||
self.expected_headers['Accept'] = '*/*'
|
||||
mock_get.assert_called_once_with(
|
||||
'http://orig/post', headers=common.HEADERS, timeout=15, stream=True)
|
||||
self.assert_req(mock_get, 'http://orig/post')
|
||||
|
||||
def test_reply(self, mock_urlopen, mock_head, mock_get, mock_post):
|
||||
atom_reply = """\
|
||||
|
@ -85,11 +82,12 @@ class SalmonTest(testutil.TestCase):
|
|||
self.send_slap(mock_urlopen, mock_head, mock_get, mock_post, atom_reply)
|
||||
|
||||
# check webmention post
|
||||
mock_post.assert_called_once_with(
|
||||
self.assert_req(
|
||||
mock_post,
|
||||
'http://orig/webmention',
|
||||
data={'source': 'https://my/reply', 'target': 'http://orig/post'},
|
||||
allow_redirects=False, timeout=15, stream=True,
|
||||
headers=self.expected_headers)
|
||||
allow_redirects=False,
|
||||
headers={'Accept': '*/*'})
|
||||
|
||||
# check stored response
|
||||
resp = Response.get_by_id('https://my/reply http://orig/post')
|
||||
|
@ -115,14 +113,15 @@ class SalmonTest(testutil.TestCase):
|
|||
self.send_slap(mock_urlopen, mock_head, mock_get, mock_post, atom_like)
|
||||
|
||||
# check webmention post
|
||||
mock_post.assert_called_once_with(
|
||||
self.assert_req(
|
||||
mock_post,
|
||||
'http://orig/webmention',
|
||||
data={
|
||||
'source': 'http://localhost/render?source=https%3A%2F%2Fmy%2Flike&target=http%3A%2F%2Forig%2Fpost',
|
||||
'target': 'http://orig/post',
|
||||
},
|
||||
allow_redirects=False, timeout=15, stream=True,
|
||||
headers=self.expected_headers)
|
||||
allow_redirects=False,
|
||||
headers={'Accept': '*/*'})
|
||||
|
||||
# check stored response
|
||||
resp = Response.get_by_id('https://my/like http://orig/post')
|
||||
|
|
|
@ -108,8 +108,7 @@ class WebfingerTest(testutil.TestCase):
|
|||
got = self.client.get('/acct:foo.com', headers={'Accept': 'application/json'})
|
||||
self.assertEqual(200, got.status_code)
|
||||
self.assertEqual('application/jrd+json', got.headers['Content-Type'])
|
||||
mock_get.assert_called_once_with('http://foo.com/', headers=common.HEADERS,
|
||||
stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://foo.com/')
|
||||
|
||||
self.assertEqual(self.expected_webfinger, got.json)
|
||||
|
||||
|
@ -167,8 +166,7 @@ class WebfingerTest(testutil.TestCase):
|
|||
</body>
|
||||
""")
|
||||
got = self.client.get('/acct:foo.com')
|
||||
mock_get.assert_called_once_with('http://foo.com/', headers=common.HEADERS,
|
||||
stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://foo.com/')
|
||||
self.assertEqual(400, got.status_code)
|
||||
self.assertIn('representative h-card', got.get_data(as_text=True))
|
||||
|
||||
|
|
|
@ -25,7 +25,6 @@ from common import (
|
|||
CONTENT_TYPE_ATOM,
|
||||
CONTENT_TYPE_HTML,
|
||||
CONTENT_TYPE_MAGIC_ENVELOPE,
|
||||
HEADERS,
|
||||
)
|
||||
from models import Follower, MagicKey, Response
|
||||
import webmention
|
||||
|
@ -838,9 +837,7 @@ class WebmentionTest(testutil.TestCase):
|
|||
})
|
||||
self.assertEqual(200, got.status_code)
|
||||
|
||||
mock_get.assert_any_call(
|
||||
'http://orig/.well-known/webfinger?resource=acct:ryan@orig',
|
||||
headers=HEADERS, stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://orig/.well-known/webfinger?resource=acct:ryan@orig')
|
||||
self.assertEqual(('http://orig/@ryan/salmon',), mock_post.call_args[0])
|
||||
|
||||
def test_salmon_no_target_atom(self, mock_get, mock_post):
|
||||
|
@ -879,8 +876,7 @@ class WebmentionTest(testutil.TestCase):
|
|||
})
|
||||
self.assertEqual(200, got.status_code)
|
||||
|
||||
mock_get.assert_any_call('http://orig/atom/1', headers=HEADERS,
|
||||
stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://orig/atom/1')
|
||||
data = self.verify_salmon(mock_post)
|
||||
|
||||
def test_salmon_relative_atom_href_with_base(self, mock_get, mock_post):
|
||||
|
@ -900,6 +896,5 @@ class WebmentionTest(testutil.TestCase):
|
|||
})
|
||||
self.assertEqual(200, got.status_code)
|
||||
|
||||
mock_get.assert_any_call('http://orig/base/atom/1', headers=HEADERS,
|
||||
stream=True, timeout=util.HTTP_TIMEOUT)
|
||||
self.assert_req(mock_get, 'http://orig/base/atom/1')
|
||||
data = self.verify_salmon(mock_post)
|
||||
|
|
|
@ -34,11 +34,20 @@ class TestCase(unittest.TestCase, testutil.Asserts):
|
|||
"""Returns a mock requests call."""
|
||||
existing = kwargs.get('headers', {})
|
||||
if existing is not ANY:
|
||||
headers = copy.deepcopy(common.HEADERS)
|
||||
headers.update(existing)
|
||||
kwargs['headers'] = headers
|
||||
kwargs['headers'] = {
|
||||
'User-Agent': util.user_agent,
|
||||
**existing,
|
||||
}
|
||||
|
||||
kwargs.setdefault('timeout', util.HTTP_TIMEOUT)
|
||||
kwargs.setdefault('stream', True)
|
||||
|
||||
return call(url, **kwargs)
|
||||
|
||||
def assert_req(self, mock, url, **kwargs):
|
||||
"""Checks a mock requests call."""
|
||||
kwargs.setdefault('headers', {}).setdefault('User-Agent', 'Bridgy Fed (https://fed.brid.gy/)')
|
||||
kwargs.setdefault('stream', True)
|
||||
kwargs.setdefault('timeout', util.HTTP_TIMEOUT)
|
||||
|
||||
mock.assert_any_call(url, **kwargs)
|
||||
|
|
Ładowanie…
Reference in New Issue