set User-Agent header globally

pull/118/head
Ryan Barrett 2022-03-16 21:11:09 -07:00
rodzic ee7b36c28d
commit 1d36d31064
Nie znaleziono w bazie danych klucza dla tego podpisu
ID klucza GPG: 6BE31FDF4776E9D4
8 zmienionych plików z 52 dodań i 67 usunięć

Wyświetl plik

@ -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
Wyświetl plik

@ -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

Wyświetl plik

@ -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:

Wyświetl plik

@ -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))

Wyświetl plik

@ -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')

Wyświetl plik

@ -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))

Wyświetl plik

@ -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)

Wyświetl plik

@ -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)