diff options
author | Nguyễn Gia Phong <cnx@loang.net> | 2025-06-16 15:28:30 +0900 |
---|---|---|
committer | Nguyễn Gia Phong <cnx@loang.net> | 2025-06-16 15:28:30 +0900 |
commit | 58ad9b49dfc393c41f86fda4632da1c934b062f4 (patch) | |
tree | 31c61cb6e48f2c207649ea866eac2cd31149ea7e | |
parent | c3d356c8b80659468a0a7429636a128c156509ae (diff) | |
download | scadere-58ad9b49dfc393c41f86fda4632da1c934b062f4.tar.gz |
Add option for feed title
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | src/scadere/listen.py | 15 | ||||
-rw-r--r-- | tst/test_listen.py | 7 |
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) |