about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--README.md6
-rw-r--r--src/scadere/listen.py15
-rw-r--r--tst/test_listen.py7
3 files changed, 18 insertions, 10 deletions
diff --git a/README.md b/README.md
index d1f40f4..ef8376b 100644
--- a/README.md
+++ b/README.md
@@ -41,8 +41,10 @@ where HOST defaults to localhost and PORT is selected randomly
 if not specified.
 
 Options:
-  -h, --help     show this help message and exit
-  -v, --version  show program's version number and exit
+  -h, --help            show this help message and exit
+  -v, --version         show program's version number and exit
+  -t TITLE, --title=TITLE
+                        title of Atom feeds
 ```
 
 ## Hacking
diff --git a/src/scadere/listen.py b/src/scadere/listen.py
index 2888524..28e30d7 100644
--- a/src/scadere/listen.py
+++ b/src/scadere/listen.py
@@ -244,7 +244,7 @@ async def write_xml(writer, http_version, application, func, *args):
         await writer.drain()
 
 
-async def handle(certs, base_url, reader, writer):
+async def handle(certs, base_url, reader, writer, title=None):
     """Handle HTTP request."""
     try:
         try:
@@ -278,6 +278,8 @@ async def handle(certs, base_url, reader, writer):
             assert len(lookup) == len(summaries)
             url_parts = urlsplit(urljoin(base_url, url.strip().decode()))
             domains = tuple(parse_qs(url_parts.query).get('domain', []))
+            if title is None:
+                title = certs.name
         except Exception:  # pragma: no cover
             await describe_status(writer, HTTPStatus.INTERNAL_SERVER_ERROR,
                                   http_version)
@@ -285,7 +287,7 @@ async def handle(certs, base_url, reader, writer):
 
         if url_parts.path == urlsplit(base_url).path:  # Atom feed
             await write_xml(writer, http_version, 'atom', unparsed_feed,
-                            base_url, certs.name, mtime, summaries, domains)
+                            base_url, title, mtime, summaries, domains)
         elif url_parts.path in lookup:  # accessible Atom entry's link/ID
             await write_xml(writer, http_version, 'xhtml', unparsed_page,
                             lookup.get(url_parts.path))
@@ -298,9 +300,10 @@ async def handle(certs, base_url, reader, writer):
         await writer.wait_closed()
 
 
-async def listen(certs, base_url, host, port):  # pragma: no cover
+async def listen(certs, title, base_url, host, port):  # pragma: no cover
     """Serve HTTP server for TLS certificate expirations' Atom feed."""
-    server = await start_server(partial(handle, certs, base_url), host, port)
+    server = await start_server(partial(handle, certs, base_url, title=title),
+                                host, port)
     async with server:
         print('Serving on', end=' ')
         print(*(socket.getsockname() for socket in server.sockets), sep=', ')
@@ -338,13 +341,15 @@ def main(prog='scadere-listen', arguments=argv[1:]):
                             formatter_class=GNUHelpFormatter)
     parser.add_argument('-v', '--version', action='version',
                         version=f'%(prog)s {__version__}')
+    parser.add_argument('-t', '--title', help='title of Atom feeds')
     parser.add_argument('certs', metavar='PATH', type=Path)
     parser.add_argument('base_url', metavar='URL', type=with_trailing_slash)
     parser.add_argument('netloc', metavar='[HOST][:PORT]', nargs='?',
                         type=NetLoc(None), default=('localhost', None))
 
     args = parser.parse_args(arguments)
-    run(listen(args.certs, args.base_url, *args.netloc))  # pragma: no cover
+    run(listen(args.certs, args.title,
+               args.base_url, *args.netloc))  # pragma: no cover
 
 
 if __name__ == '__main__':  # pragma: no cover
diff --git a/tst/test_listen.py b/tst/test_listen.py
index 49b9dd8..cf47ab7 100644
--- a/tst/test_listen.py
+++ b/tst/test_listen.py
@@ -221,12 +221,13 @@ def unique_netlocs(summaries):
 
 
 @given(urls().filter(is_base_url).filter(has_usual_path),
-       sets(certificates(), min_size=1).map(unique_netlocs))
+       sets(certificates(), min_size=1).map(unique_netlocs),
+       text().filter(printable))
 @settings(suppress_health_check=[HealthCheck.too_slow])
-async def test_content(base_url, certs):
+async def test_content(base_url, certs, title):
     base_path = urlsplit(base_url).path
     with tmp_cert_file(certs) as cert_file:
-        handler = partial(handle, cert_file, base_url)
+        handler = partial(handle, cert_file, base_url, title=title)
         await check_server(handler, check_feed, base_path)