feat: include znc-palaver version in user-agent
authorKyle Fuller <redacted>
Sun, 5 Apr 2020 13:35:11 +0000 (14:35 +0100)
committerKyle Fuller <redacted>
Sun, 5 Apr 2020 13:41:19 +0000 (14:41 +0100)
palaver.cpp
test/test_palaver.py

index aee901e27433ad771bab1475a86557e1e508362c..5a1d7493f620276307219ae8628e624d966178e6 100644 (file)
@@ -103,7 +103,8 @@ public:
                }
 
                mcsHeaders["Connection"] = "close";
-               mcsHeaders["User-Agent"] = "ZNC";
+               // as per https://tools.ietf.org/html/rfc7231#section-5.5.3
+               mcsHeaders["User-Agent"] = "znc-palaver/" + CString(PALAVER_VERSION) + " znc/" + CZNC::GetVersion();
 
                if (sMethod.Equals("GET") == false || sContent.length() > 0) {
                        mcsHeaders["Content-Length"] = CString(sContent.length());
index 8d7738e815a868d8340784b1b2fbc8c4b2ff35ca..1b2787807bd3dd79cd40bdacb7973f89ebac88a0 100644 (file)
@@ -10,19 +10,42 @@ from semantic_version import Version
 pytestmark = pytest.mark.asyncio
 
 
-async def requires_znc_version(znc_version):
+async def get_znc_version():
     proc = await asyncio.create_subprocess_shell(
         'znc --version',
         stdout=asyncio.subprocess.PIPE,
         stderr=asyncio.subprocess.PIPE)
 
     stdout, stderr = await proc.communicate()
-    version = stdout.decode('utf-8').split()[1]
+    return stdout.decode('utf-8').split()[1]
+
+
+async def requires_znc_version(znc_version):
+    actual_version = await get_znc_version()
 
-    if Version(znc_version) > Version(version):
+    if Version(znc_version) > Version(actual_version):
         pytest.skip('ZNC >= {} is required for this test, found {}'.format(znc_version, version))
 
 
+async def assert_user_agent(header):
+    header = header.decode('utf-8')
+    assert header.endswith('\r\n')
+
+    (name, value) = header.strip().split(': ')
+    assert name == 'User-Agent'
+
+    products = value.split(' ')
+    assert len(products) == 2
+
+    product1, product1_version = products[0].split('/')
+    assert product1 == 'znc-palaver'
+    assert Version(product1_version).major >= 1
+
+    product2, product2_version = products[1].split('/')
+    assert product2 == 'znc'
+    assert product2_version == await get_znc_version()
+
+
 async def setUp(event_loop):
     running_as_root = os.getuid() == 0
     allow_root = ' --allow-root' if running_as_root else ''
@@ -147,8 +170,7 @@ async def test_receiving_notification(event_loop):
         line = await reader.readline()
         assert line == b'Content-Type: application/json\r\n'
 
-        line = await reader.readline()
-        assert line == b'User-Agent: ZNC\r\n'
+        await assert_user_agent(await reader.readline())
 
         line = await reader.readline()
         assert line == b'\r\n'
@@ -212,8 +234,7 @@ async def test_receiving_notification_with_push_token(event_loop):
         line = await reader.readline()
         assert line == b'Content-Type: application/json\r\n'
 
-        line = await reader.readline()
-        assert line == b'User-Agent: ZNC\r\n'
+        await assert_user_agent(await reader.readline())
 
         line = await reader.readline()
         assert line == b'\r\n'
git clone https://git.99rst.org/PROJECT