Skip to content

Commit 5743368

Browse files
authored
Setting the User-Agent header when making HTTP calls. (#38)
1 parent 1364ce6 commit 5743368

File tree

2 files changed

+30
-9
lines changed

2 files changed

+30
-9
lines changed

firebase_admin/db.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,16 +23,20 @@
2323
import collections
2424
import json
2525
import numbers
26+
import sys
2627

2728
import requests
2829
import six
2930
from six.moves import urllib
3031

32+
import firebase_admin
3133
from firebase_admin import utils
3234

3335
_DB_ATTRIBUTE = '_database'
3436
_INVALID_PATH_CHARACTERS = '[].#$'
3537
_RESERVED_FILTERS = ('$key', '$value', '$priority')
38+
_USER_AGENT = 'Firebase/HTTP/{0}/{1}.{2}/AdminPython'.format(
39+
firebase_admin.__version__, sys.version_info.major, sys.version_info.minor)
3640

3741

3842
def reference(path='/', app=None):
@@ -385,8 +389,7 @@ def _querystr(self):
385389
def get(self):
386390
"""Executes this Query and returns the results.
387391
388-
The results will be returned as a sorted list or an OrderedDict, except in the case of
389-
order-by-priority queries.
392+
The results will be returned as a sorted list or an OrderedDict.
390393
391394
Returns:
392395
object: Decoded JSON result of the Query.
@@ -551,7 +554,7 @@ def __init__(self, **kwargs):
551554
Keyword Args:
552555
url: Firebase Realtime Database URL.
553556
auth: An instance of requests.auth.AuthBase for authenticating outgoing HTTP requests.
554-
session: An HTTP session created using the the requests module.
557+
session: An HTTP session created using the requests module.
555558
auth_override: A dictionary representing auth variable overrides or None (optional).
556559
Defaults to empty dict, which provides admin privileges. A None value here provides
557560
un-authenticated guest privileges.
@@ -587,8 +590,11 @@ def from_app(cls, app):
587590
if auth_override is not None and not isinstance(auth_override, dict):
588591
raise ValueError('Invalid databaseAuthVariableOverride option: "{0}". Override '
589592
'value must be a dict or None.'.format(auth_override))
593+
594+
session = requests.Session()
595+
session.headers.update({'User-Agent': _USER_AGENT})
590596
return _Client(url='https://{0}'.format(parsed.netloc), auth=_OAuth(app),
591-
session=requests.Session(), auth_override=auth_override)
597+
session=session, auth_override=auth_override)
592598

593599
def request(self, method, urlpath, **kwargs):
594600
return self._do_request(method, urlpath, **kwargs).json()

tests/test_db.py

Lines changed: 20 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import collections
1717
import datetime
1818
import json
19+
import sys
1920

2021
import pytest
2122
from requests import adapters
@@ -148,6 +149,7 @@ def test_get_value(self, data):
148149
assert recorder[0].method == 'GET'
149150
assert recorder[0].url == 'https://test.firebaseio.com/test.json'
150151
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
152+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
151153

152154
@pytest.mark.parametrize('data', valid_values)
153155
def test_order_by_query(self, data):
@@ -233,7 +235,7 @@ def test_update_children_default(self):
233235
assert len(recorder) is 0
234236

235237
@pytest.mark.parametrize('update', [
236-
None, {}, {None:'foo'}, {'foo': None}, '', 'foo', 0, 1, list(), tuple()
238+
None, {}, {None:'foo'}, {'foo': None}, '', 'foo', 0, 1, list(), tuple(), _Object()
237239
])
238240
def test_set_invalid_update(self, update):
239241
ref = db.reference('/test')
@@ -253,6 +255,7 @@ def test_push(self, data):
253255
assert recorder[0].url == 'https://test.firebaseio.com/test.json'
254256
assert json.loads(recorder[0].body.decode()) == data
255257
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
258+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
256259

257260
def test_push_default(self):
258261
ref = db.reference('/test')
@@ -263,6 +266,7 @@ def test_push_default(self):
263266
assert recorder[0].url == 'https://test.firebaseio.com/test.json'
264267
assert json.loads(recorder[0].body.decode()) == ''
265268
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
269+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
266270

267271
def test_push_none_value(self):
268272
ref = db.reference('/test')
@@ -278,6 +282,7 @@ def test_delete(self):
278282
assert recorder[0].method == 'DELETE'
279283
assert recorder[0].url == 'https://test.firebaseio.com/test.json'
280284
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
285+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
281286

282287
def test_get_root_reference(self):
283288
ref = db.reference()
@@ -344,6 +349,7 @@ def test_get_value(self):
344349
assert recorder[0].method == 'GET'
345350
assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str
346351
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
352+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
347353

348354
def test_set_value(self):
349355
ref = db.reference('/test')
@@ -356,6 +362,7 @@ def test_set_value(self):
356362
assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str
357363
assert json.loads(recorder[0].body.decode()) == data
358364
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
365+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
359366

360367
def test_order_by_query(self):
361368
ref = db.reference('/test')
@@ -367,6 +374,7 @@ def test_order_by_query(self):
367374
assert recorder[0].method == 'GET'
368375
assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str
369376
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
377+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
370378

371379
def test_range_query(self):
372380
ref = db.reference('/test')
@@ -379,6 +387,7 @@ def test_range_query(self):
379387
assert recorder[0].method == 'GET'
380388
assert recorder[0].url == 'https://test.firebaseio.com/test.json?' + query_str
381389
assert recorder[0].headers['Authorization'] == 'Bearer mock-token'
390+
assert recorder[0].headers['User-Agent'] == db._USER_AGENT
382391

383392

384393
class TestDatabseInitialization(object):
@@ -407,7 +416,7 @@ def test_valid_db_url(self, url):
407416

408417
@pytest.mark.parametrize('url', [
409418
None, '', 'foo', 'http://test.firebaseio.com', 'https://google.com',
410-
True, False, 1, 0, dict(), list(), tuple(),
419+
True, False, 1, 0, dict(), list(), tuple(), _Object()
411420
])
412421
def test_invalid_db_url(self, url):
413422
firebase_admin.initialize_app(credentials.Base(), {'databaseURL' : url})
@@ -428,7 +437,8 @@ def test_valid_auth_override(self, override):
428437
encoded = json.dumps(override, separators=(',', ':'))
429438
assert ref._client._auth_override == 'auth_variable_override={0}'.format(encoded)
430439

431-
@pytest.mark.parametrize('override', ['', 'foo', 0, 1, True, False, list(), tuple()])
440+
@pytest.mark.parametrize('override', [
441+
'', 'foo', 0, 1, True, False, list(), tuple(), _Object()])
432442
def test_invalid_auth_override(self, override):
433443
firebase_admin.initialize_app(credentials.Base(), {
434444
'databaseURL' : 'https://test.firebaseio.com',
@@ -448,6 +458,11 @@ def test_app_delete(self):
448458
with pytest.raises(ValueError):
449459
db.reference()
450460

461+
def test_user_agent_format(self):
462+
expected = 'Firebase/HTTP/{0}/{1}.{2}/AdminPython'.format(
463+
firebase_admin.__version__, sys.version_info.major, sys.version_info.minor)
464+
assert db._USER_AGENT == expected
465+
451466

452467
@pytest.fixture(params=['foo', '$key', '$value'])
453468
def initquery(request):
@@ -472,7 +487,7 @@ class TestQuery(object):
472487
ref = db.Reference(path='foo')
473488

474489
@pytest.mark.parametrize('path', [
475-
'', None, '/', '/foo', 0, 1, True, False, dict(), list(), tuple(),
490+
'', None, '/', '/foo', 0, 1, True, False, dict(), list(), tuple(), _Object(),
476491
'$foo', '.foo', '#foo', '[foo', 'foo]', '$key', '$value', '$priority'
477492
])
478493
def test_invalid_path(self, path):
@@ -519,7 +534,7 @@ def test_multiple_limits(self):
519534
with pytest.raises(ValueError):
520535
query.limit_to_first(1)
521536

522-
@pytest.mark.parametrize('limit', [None, -1, 'foo', 1.2, list(), dict(), tuple()])
537+
@pytest.mark.parametrize('limit', [None, -1, 'foo', 1.2, list(), dict(), tuple(), _Object()])
523538
def test_invalid_limit(self, limit):
524539
query = self.ref.order_by_child('foo')
525540
with pytest.raises(ValueError):

0 commit comments

Comments
 (0)