Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package python-CherryPy for openSUSE:Factory 
checked in at 2022-08-03 21:16:29
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/python-CherryPy (Old)
 and      /work/SRC/openSUSE:Factory/.python-CherryPy.new.1533 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "python-CherryPy"

Wed Aug  3 21:16:29 2022 rev:31 rq:992333 version:18.8.0

Changes:
--------
--- /work/SRC/openSUSE:Factory/python-CherryPy/python-CherryPy.changes  
2021-10-25 15:17:13.045667530 +0200
+++ 
/work/SRC/openSUSE:Factory/.python-CherryPy.new.1533/python-CherryPy.changes    
    2022-08-03 21:16:37.863431527 +0200
@@ -1,0 +2,13 @@
+Tue Aug  2 11:32:54 UTC 2022 - Otto Hollmann <otto.hollm...@suse.com>
+
+- Update to 18.8.0
+  * Dangerous characters received in a host header encoded using RFC 2047 are
+    now elided by default. Currently, dangerous characters are defined as CR
+    and LF. The original value is still available as
+    cherrypy.request.headers['Host'].raw if needed.
+- Changes from v18.7.0
+  * Drop support for Python 3.5.
+  * Fixed compatibility on Python 3.11.
+- Fix URL in spec file: cherrypy.org -> cherrypy.dev 
+
+-------------------------------------------------------------------

Old:
----
  CherryPy-18.6.1.tar.gz

New:
----
  CherryPy-18.8.0.tar.gz

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ python-CherryPy.spec ++++++
--- /var/tmp/diff_new_pack.nF9FUl/_old  2022-08-03 21:16:38.415432976 +0200
+++ /var/tmp/diff_new_pack.nF9FUl/_new  2022-08-03 21:16:38.419432987 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package python-CherryPy
 #
-# Copyright (c) 2021 SUSE LLC
+# Copyright (c) 2022 SUSE LLC
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -25,11 +25,11 @@
 %define skip_python2 1
 %{?!python_module:%define python_module() python-%{**} python3-%{**}}
 Name:           python-CherryPy
-Version:        18.6.1
+Version:        18.8.0
 Release:        0
 Summary:        Object-Oriented HTTP framework
 License:        BSD-3-Clause
-URL:            http://www.cherrypy.org
+URL:            https://www.cherrypy.dev
 Source:         
https://files.pythonhosted.org/packages/source/C/CherryPy/CherryPy-%{version}.tar.gz
 BuildRequires:  %{python_module setuptools_scm}
 BuildRequires:  %{python_module setuptools}
@@ -45,7 +45,7 @@
 BuildRequires:  alts
 %else
 Requires(post): update-alternatives
-Requires(postun): update-alternatives
+Requires(postun):update-alternatives
 %endif
 Recommends:     python-Routes >= 2.3.1
 Recommends:     python-flup

++++++ CherryPy-18.6.1.tar.gz -> CherryPy-18.8.0.tar.gz ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.appveyor.yml 
new/CherryPy-18.8.0/.appveyor.yml
--- old/CherryPy-18.6.1/.appveyor.yml   2019-11-28 17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/.appveyor.yml   2022-07-17 21:43:48.000000000 +0200
@@ -2,7 +2,6 @@
   matrix:
   - PYTHON: "C:\\Python37-x64"
   - PYTHON: "C:\\Python36-x64"
-  - PYTHON: "C:\\Python35-x64"
 
 init:
 - "chcp 65001"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.circleci/config.yml 
new/CherryPy-18.8.0/.circleci/config.yml
--- old/CherryPy-18.6.1/.circleci/config.yml    2021-03-23 01:12:07.000000000 
+0100
+++ new/CherryPy-18.8.0/.circleci/config.yml    2022-07-17 21:43:48.000000000 
+0200
@@ -15,17 +15,17 @@
         ' >> $BASH_ENV
 
     - run: |-
-        for py_ver in 3.7.0 3.6.4 3.5.4 pypy3.5-6.0.0
+        for py_ver in 3.7.0 3.6.4
         do
           pyenv install "$py_ver" &
         done
         wait
-    - run: pyenv global 3.7.0 3.6.4 3.5.4 pypy3.5-6.0.0
+    - run: pyenv global 3.7.0 3.6.4
 
     - run: python3 -m pip install --upgrade pip wheel
     - run: python3 -m pip install tox tox-pyenv
     - checkout
-    - run: tox -e py35,py36,py37 -- -p no:sugar  # , pypy3
+    - run: tox -e py36,py37 -- -p no:sugar
     - store_test_results:
         path: .test-results
     - store_artifacts:
@@ -38,7 +38,7 @@
     steps:
     - checkout
     - run: pip install tox
-    - run: tox -e py35,py36,py37
+    - run: tox -e py36,py37
     - store_test_results:
         path: .test-results
     - store_artifacts:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.github/CONTRIBUTING.rst 
new/CherryPy-18.8.0/.github/CONTRIBUTING.rst
--- old/CherryPy-18.6.1/.github/CONTRIBUTING.rst        2019-02-28 
17:09:17.000000000 +0100
+++ new/CherryPy-18.8.0/.github/CONTRIBUTING.rst        2022-06-22 
02:20:54.000000000 +0200
@@ -28,5 +28,5 @@
 
 Also
 ----
-See `Contributing <https://docs.cherrypy.org/en/latest/contribute.html>`_ in
+See `Contributing <https://docs.cherrypy.dev/en/latest/contribute.html>`_ in
 the docs.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.github/SUPPORT.rst 
new/CherryPy-18.8.0/.github/SUPPORT.rst
--- old/CherryPy-18.6.1/.github/SUPPORT.rst     2019-11-28 17:56:28.000000000 
+0100
+++ new/CherryPy-18.8.0/.github/SUPPORT.rst     2022-06-22 02:20:54.000000000 
+0200
@@ -9,7 +9,7 @@
 -----------------
 
 If you have a question and cannot find an answer for it in issues or the
-the `documentation <http://docs.cherrypy.org/en/latest/>`__, `please
+the `documentation <http://docs.cherrypy.dev/en/latest/>`__, `please
 create an issue <https://github.com/cherrypy/cherrypy/issues/new>`__.
 
 Questions and their answers have great value for the community, and a
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.github/patchback.yml 
new/CherryPy-18.8.0/.github/patchback.yml
--- old/CherryPy-18.6.1/.github/patchback.yml   1970-01-01 01:00:00.000000000 
+0100
+++ new/CherryPy-18.8.0/.github/patchback.yml   2022-06-22 02:20:54.000000000 
+0200
@@ -0,0 +1,5 @@
+---
+backport_branch_prefix: patchback/backports/
+backport_label_prefix: backport-
+target_branch_prefix: maint/
+...
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.pre-commit-config.yaml 
new/CherryPy-18.8.0/.pre-commit-config.yaml
--- old/CherryPy-18.6.1/.pre-commit-config.yaml 2019-11-03 15:14:38.000000000 
+0100
+++ new/CherryPy-18.8.0/.pre-commit-config.yaml 2022-07-17 22:36:36.000000000 
+0200
@@ -1,5 +1,5 @@
 repos:
--   repo: git://github.com/pre-commit/pre-commit-hooks
+-   repo: https://github.com/pre-commit/pre-commit-hooks.git
     rev: v1.1.1
     hooks:
     -   id: trailing-whitespace
@@ -28,7 +28,7 @@
         exclude: cherrypy/test/test.pem
     -   id: requirements-txt-fixer
 
--   repo: git://github.com/chewse/pre-commit-mirrors-pydocstyle
+-   repo: https://github.com/chewse/pre-commit-mirrors-pydocstyle.git
     rev: v2.1.1
     hooks:
     -   id: pydocstyle
@@ -50,12 +50,21 @@
                 test|tutorial
             )
 
--   repo: git://github.com/Lucas-C/pre-commit-hooks
-    rev: v1.1.1
+-   repo: https://github.com/Lucas-C/pre-commit-hooks.git
+    rev: v1.1.12
     hooks:
     -   id: remove-tabs
 
--   repo: git://github.com/Lucas-C/pre-commit-hooks-lxml
-    rev: v1.0.2
+-   repo: https://github.com/Lucas-C/pre-commit-hooks-lxml.git
+    rev: v1.1.0
     hooks:
     -   id: forbid-html-img-without-alt-text
+
+- repo: https://github.com/adrienverge/yamllint.git
+  rev: v1.27.1
+  hooks:
+  - id: yamllint
+    files: \.(yaml|yml)$
+    types: [file, yaml]
+    args:
+    - --strict
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.readthedocs.yml 
new/CherryPy-18.8.0/.readthedocs.yml
--- old/CherryPy-18.6.1/.readthedocs.yml        2019-02-28 17:09:17.000000000 
+0100
+++ new/CherryPy-18.8.0/.readthedocs.yml        2022-07-17 22:36:36.000000000 
+0200
@@ -3,6 +3,6 @@
 python:
   version: 3.6
   extra_requirements:
-    - docs
-    - testing
+  - docs
+  - testing
   pip_install: true
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.travis.yml 
new/CherryPy-18.8.0/.travis.yml
--- old/CherryPy-18.6.1/.travis.yml     2021-03-23 01:12:07.000000000 +0100
+++ new/CherryPy-18.8.0/.travis.yml     2022-06-22 02:20:54.000000000 +0200
@@ -73,15 +73,9 @@
   python: 3.9
   after_failure: skip
 python:
-- 3.5
 - 3.7-dev
-- &pypy3 pypy3.5-5.10.0
 jobs:
   fast_finish: true
-  allow_failures:
-  # TODO: fix tests
-  - python: *pypy3
-  - env: TOXENV=pre-commit-pep257
   include:
   - <<: *lint_python_base
     env: TOXENV=pre-commit
@@ -105,12 +99,6 @@
   - <<: *pure_python_base_priority
     python: nightly
   - <<: *osx_python_base
-    python: 3.5
-    env:
-    - PYTHON_VERSION=3.5.5
-    - *env_pyenv
-    - *env_path
-  - <<: *osx_python_base
     python: *mainstream_python
     env:
     - PYTHON_VERSION=3.6.5
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/.yamllint 
new/CherryPy-18.8.0/.yamllint
--- old/CherryPy-18.6.1/.yamllint       2021-03-23 01:12:07.000000000 +0100
+++ new/CherryPy-18.8.0/.yamllint       2022-07-17 22:36:36.000000000 +0200
@@ -1,2 +1,4 @@
-indentation:
-  indent-sequences: false
+rules:
+  indentation:
+    level: error
+    indent-sequences: false
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/CHANGES.rst 
new/CherryPy-18.8.0/CHANGES.rst
--- old/CherryPy-18.6.1/CHANGES.rst     2021-07-04 00:29:29.000000000 +0200
+++ new/CherryPy-18.8.0/CHANGES.rst     2022-07-17 22:36:36.000000000 +0200
@@ -1,3 +1,18 @@
+v18.8.0
+-------
+
+* :issue:`1974`: Dangerous characters received in a host header
+  encoded using RFC 2047 are now elided by default. Currently,
+  dangerous characters are defined as CR and LF. The original
+  value is still available as ``cherrypy.request.headers['Host'].raw``
+  if needed.
+
+v18.7.0
+-------
+
+* :pr:`1923`: Drop support for Python 3.5.
+* :pr:`1945`: Fixed compatibility on Python 3.11.
+
 v18.6.1
 -------
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/CherryPy.egg-info/PKG-INFO 
new/CherryPy-18.8.0/CherryPy.egg-info/PKG-INFO
--- old/CherryPy-18.6.1/CherryPy.egg-info/PKG-INFO      2021-07-04 
00:33:32.000000000 +0200
+++ new/CherryPy-18.8.0/CherryPy.egg-info/PKG-INFO      2022-07-17 
22:39:51.000000000 +0200
@@ -1,19 +1,17 @@
 Metadata-Version: 2.1
 Name: CherryPy
-Version: 18.6.1
+Version: 18.8.0
 Summary: Object-Oriented HTTP framework
-Home-page: https://www.cherrypy.org
+Home-page: https://www.cherrypy.dev
 Author: CherryPy Team
-Author-email: t...@cherrypy.org
-License: UNKNOWN
+Author-email: t...@cherrypy.dev
 Project-URL: CI: AppVeyor, https://ci.appveyor.com/project/cherrypy/cherrypy
 Project-URL: CI: Travis, https://travis-ci.org/cherrypy/cherrypy
 Project-URL: CI: Circle, https://circleci.com/gh/cherrypy/cherrypy
-Project-URL: Docs: RTD, https://docs.cherrypy.org
+Project-URL: Docs: RTD, https://docs.cherrypy.dev
 Project-URL: GitHub: issues, https://github.com/cherrypy/cherrypy/issues
 Project-URL: GitHub: repo, https://github.com/cherrypy/cherrypy
 Project-URL: Tidelift: funding, 
https://tidelift.com/subscription/pkg/pypi-cherrypy?utm_source=pypi-cherrypy&utm_medium=referral&utm_campaign=pypi
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Intended Audience :: Developers
@@ -23,10 +21,6 @@
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: Implementation
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: Jython
@@ -38,7 +32,7 @@
 Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
 Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server
 Classifier: Topic :: Software Development :: Libraries :: Application 
Frameworks
-Requires-Python: >=3.5
+Requires-Python: >=3.6
 Provides-Extra: docs
 Provides-Extra: json
 Provides-Extra: routes_dispatcher
@@ -48,6 +42,10 @@
 Provides-Extra: xcgi
 License-File: LICENSE.md
 
+.. image:: 
https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg
+   :target: 
https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md
+   :alt: SWUbanner
+
 .. image:: https://img.shields.io/pypi/v/cherrypy.svg
    :target: https://pypi.org/project/cherrypy
 
@@ -64,7 +62,7 @@
 
 
 .. image:: https://readthedocs.org/projects/cherrypy/badge/?version=latest
-  :target: https://docs.cherrypy.org/en/latest/?badge=latest
+  :target: https://docs.cherrypy.dev/en/latest/?badge=latest
 
 .. image:: https://img.shields.io/badge/StackOverflow-CherryPy-blue.svg
    :target: https://stackoverflow.com/questions/tagged/cheroot+or+cherrypy
@@ -101,7 +99,7 @@
    :target: https://codecov.io/gh/cherrypy/cherrypy
    :alt: codecov
 
-Welcome to the GitHub repository of `CherryPy <https://cherrypy.org/>`_!
+Welcome to the GitHub repository of `CherryPy <https://cherrypy.dev>`_!
 
 CherryPy is a pythonic, object-oriented HTTP framework.
 
@@ -134,7 +132,7 @@
 
 While CherryPy is one of the easiest and most intuitive frameworks out
 there, the prerequisite for understanding the `CherryPy
-documentation <https://docs.cherrypy.org/en/latest/>`_ is that you have
+documentation <https://docs.cherrypy.dev>`_ is that you have
 a general understanding of Python and web development.
 Additionally:
 
@@ -145,7 +143,7 @@
 
 If the docs are insufficient to address your needs, the CherryPy
 community has several `avenues for support
-<https://docs.cherrypy.org/en/latest/support.html>`_.
+<https://docs.cherrypy.dev/en/latest/support.html>`_.
 
 For Enterprise
 --------------
@@ -162,8 +160,6 @@
 ------------
 
 Please follow the `contribution guidelines
-<https://docs.cherrypy.org/en/latest/contribute.html>`_.
+<https://docs.cherrypy.dev/en/latest/contribute.html>`_.
 And by all means, absorb the `Zen of
 CherryPy <https://github.com/cherrypy/cherrypy/wiki/The-Zen-of-CherryPy>`_.
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/CherryPy.egg-info/SOURCES.txt 
new/CherryPy-18.8.0/CherryPy.egg-info/SOURCES.txt
--- old/CherryPy-18.6.1/CherryPy.egg-info/SOURCES.txt   2021-07-04 
00:33:32.000000000 +0200
+++ new/CherryPy-18.8.0/CherryPy.egg-info/SOURCES.txt   2022-07-17 
22:39:51.000000000 +0200
@@ -25,6 +25,7 @@
 .github/PULL_REQUEST_TEMPLATE.md
 .github/SUPPORT.rst
 .github/config.yml
+.github/patchback.yml
 .test-results/pytest/.gitignore
 CherryPy.egg-info/PKG-INFO
 CherryPy.egg-info/SOURCES.txt
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/CherryPy.egg-info/entry_points.txt 
new/CherryPy-18.8.0/CherryPy.egg-info/entry_points.txt
--- old/CherryPy-18.6.1/CherryPy.egg-info/entry_points.txt      2021-07-04 
00:33:32.000000000 +0200
+++ new/CherryPy-18.8.0/CherryPy.egg-info/entry_points.txt      2022-07-17 
22:39:51.000000000 +0200
@@ -1,3 +1,2 @@
 [console_scripts]
 cherryd = cherrypy.__main__:run
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/LICENSE.md 
new/CherryPy-18.8.0/LICENSE.md
--- old/CherryPy-18.6.1/LICENSE.md      2019-11-28 17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/LICENSE.md      2022-07-17 21:43:48.000000000 +0200
@@ -1,4 +1,4 @@
-Copyright ?? 2004-2019, CherryPy Team (t...@cherrypy.org)
+Copyright ?? 2004-2019, CherryPy Team (t...@cherrypy.dev)
 
 All rights reserved.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/PKG-INFO new/CherryPy-18.8.0/PKG-INFO
--- old/CherryPy-18.6.1/PKG-INFO        2021-07-04 00:33:32.356855900 +0200
+++ new/CherryPy-18.8.0/PKG-INFO        2022-07-17 22:39:51.372314200 +0200
@@ -1,19 +1,17 @@
 Metadata-Version: 2.1
 Name: CherryPy
-Version: 18.6.1
+Version: 18.8.0
 Summary: Object-Oriented HTTP framework
-Home-page: https://www.cherrypy.org
+Home-page: https://www.cherrypy.dev
 Author: CherryPy Team
-Author-email: t...@cherrypy.org
-License: UNKNOWN
+Author-email: t...@cherrypy.dev
 Project-URL: CI: AppVeyor, https://ci.appveyor.com/project/cherrypy/cherrypy
 Project-URL: CI: Travis, https://travis-ci.org/cherrypy/cherrypy
 Project-URL: CI: Circle, https://circleci.com/gh/cherrypy/cherrypy
-Project-URL: Docs: RTD, https://docs.cherrypy.org
+Project-URL: Docs: RTD, https://docs.cherrypy.dev
 Project-URL: GitHub: issues, https://github.com/cherrypy/cherrypy/issues
 Project-URL: GitHub: repo, https://github.com/cherrypy/cherrypy
 Project-URL: Tidelift: funding, 
https://tidelift.com/subscription/pkg/pypi-cherrypy?utm_source=pypi-cherrypy&utm_medium=referral&utm_campaign=pypi
-Platform: UNKNOWN
 Classifier: Development Status :: 5 - Production/Stable
 Classifier: Environment :: Web Environment
 Classifier: Intended Audience :: Developers
@@ -23,10 +21,6 @@
 Classifier: License :: OSI Approved :: BSD License
 Classifier: Programming Language :: Python
 Classifier: Programming Language :: Python :: 3
-Classifier: Programming Language :: Python :: 3.5
-Classifier: Programming Language :: Python :: 3.6
-Classifier: Programming Language :: Python :: 3.7
-Classifier: Programming Language :: Python :: 3.8
 Classifier: Programming Language :: Python :: Implementation
 Classifier: Programming Language :: Python :: Implementation :: CPython
 Classifier: Programming Language :: Python :: Implementation :: Jython
@@ -38,7 +32,7 @@
 Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Application
 Classifier: Topic :: Internet :: WWW/HTTP :: WSGI :: Server
 Classifier: Topic :: Software Development :: Libraries :: Application 
Frameworks
-Requires-Python: >=3.5
+Requires-Python: >=3.6
 Provides-Extra: docs
 Provides-Extra: json
 Provides-Extra: routes_dispatcher
@@ -48,6 +42,10 @@
 Provides-Extra: xcgi
 License-File: LICENSE.md
 
+.. image:: 
https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg
+   :target: 
https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md
+   :alt: SWUbanner
+
 .. image:: https://img.shields.io/pypi/v/cherrypy.svg
    :target: https://pypi.org/project/cherrypy
 
@@ -64,7 +62,7 @@
 
 
 .. image:: https://readthedocs.org/projects/cherrypy/badge/?version=latest
-  :target: https://docs.cherrypy.org/en/latest/?badge=latest
+  :target: https://docs.cherrypy.dev/en/latest/?badge=latest
 
 .. image:: https://img.shields.io/badge/StackOverflow-CherryPy-blue.svg
    :target: https://stackoverflow.com/questions/tagged/cheroot+or+cherrypy
@@ -101,7 +99,7 @@
    :target: https://codecov.io/gh/cherrypy/cherrypy
    :alt: codecov
 
-Welcome to the GitHub repository of `CherryPy <https://cherrypy.org/>`_!
+Welcome to the GitHub repository of `CherryPy <https://cherrypy.dev>`_!
 
 CherryPy is a pythonic, object-oriented HTTP framework.
 
@@ -134,7 +132,7 @@
 
 While CherryPy is one of the easiest and most intuitive frameworks out
 there, the prerequisite for understanding the `CherryPy
-documentation <https://docs.cherrypy.org/en/latest/>`_ is that you have
+documentation <https://docs.cherrypy.dev>`_ is that you have
 a general understanding of Python and web development.
 Additionally:
 
@@ -145,7 +143,7 @@
 
 If the docs are insufficient to address your needs, the CherryPy
 community has several `avenues for support
-<https://docs.cherrypy.org/en/latest/support.html>`_.
+<https://docs.cherrypy.dev/en/latest/support.html>`_.
 
 For Enterprise
 --------------
@@ -162,8 +160,6 @@
 ------------
 
 Please follow the `contribution guidelines
-<https://docs.cherrypy.org/en/latest/contribute.html>`_.
+<https://docs.cherrypy.dev/en/latest/contribute.html>`_.
 And by all means, absorb the `Zen of
 CherryPy <https://github.com/cherrypy/cherrypy/wiki/The-Zen-of-CherryPy>`_.
-
-
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/README.rst 
new/CherryPy-18.8.0/README.rst
--- old/CherryPy-18.6.1/README.rst      2021-07-03 23:52:38.000000000 +0200
+++ new/CherryPy-18.8.0/README.rst      2022-07-17 21:43:48.000000000 +0200
@@ -1,3 +1,7 @@
+.. image:: 
https://raw.githubusercontent.com/vshymanskyy/StandWithUkraine/main/banner-direct.svg
+   :target: 
https://github.com/vshymanskyy/StandWithUkraine/blob/main/docs/README.md
+   :alt: SWUbanner
+
 .. image:: https://img.shields.io/pypi/v/cherrypy.svg
    :target: https://pypi.org/project/cherrypy
 
@@ -14,7 +18,7 @@
 
 
 .. image:: https://readthedocs.org/projects/cherrypy/badge/?version=latest
-  :target: https://docs.cherrypy.org/en/latest/?badge=latest
+  :target: https://docs.cherrypy.dev/en/latest/?badge=latest
 
 .. image:: https://img.shields.io/badge/StackOverflow-CherryPy-blue.svg
    :target: https://stackoverflow.com/questions/tagged/cheroot+or+cherrypy
@@ -51,7 +55,7 @@
    :target: https://codecov.io/gh/cherrypy/cherrypy
    :alt: codecov
 
-Welcome to the GitHub repository of `CherryPy <https://cherrypy.org/>`_!
+Welcome to the GitHub repository of `CherryPy <https://cherrypy.dev>`_!
 
 CherryPy is a pythonic, object-oriented HTTP framework.
 
@@ -84,7 +88,7 @@
 
 While CherryPy is one of the easiest and most intuitive frameworks out
 there, the prerequisite for understanding the `CherryPy
-documentation <https://docs.cherrypy.org/en/latest/>`_ is that you have
+documentation <https://docs.cherrypy.dev>`_ is that you have
 a general understanding of Python and web development.
 Additionally:
 
@@ -95,7 +99,7 @@
 
 If the docs are insufficient to address your needs, the CherryPy
 community has several `avenues for support
-<https://docs.cherrypy.org/en/latest/support.html>`_.
+<https://docs.cherrypy.dev/en/latest/support.html>`_.
 
 For Enterprise
 --------------
@@ -112,6 +116,6 @@
 ------------
 
 Please follow the `contribution guidelines
-<https://docs.cherrypy.org/en/latest/contribute.html>`_.
+<https://docs.cherrypy.dev/en/latest/contribute.html>`_.
 And by all means, absorb the `Zen of
 CherryPy <https://github.com/cherrypy/cherrypy/wiki/The-Zen-of-CherryPy>`_.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/_cpdispatch.py 
new/CherryPy-18.8.0/cherrypy/_cpdispatch.py
--- old/CherryPy-18.6.1/cherrypy/_cpdispatch.py 2019-03-26 22:05:39.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/_cpdispatch.py 2022-07-17 21:43:48.000000000 
+0200
@@ -206,12 +206,8 @@
     def test_callable_spec(callable, args, kwargs):  # noqa: F811
         return None
 else:
-    getargspec = inspect.getargspec
-    # Python 3 requires using getfullargspec if
-    # keyword-only arguments are present
-    if hasattr(inspect, 'getfullargspec'):
-        def getargspec(callable):
-            return inspect.getfullargspec(callable)[:4]
+    def getargspec(callable):
+        return inspect.getfullargspec(callable)[:4]
 
 
 class LateParamPageHandler(PageHandler):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/_cperror.py 
new/CherryPy-18.8.0/cherrypy/_cperror.py
--- old/CherryPy-18.6.1/cherrypy/_cperror.py    2019-11-28 17:56:28.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/_cperror.py    2022-07-17 21:43:48.000000000 
+0200
@@ -466,7 +466,7 @@
         <pre id="traceback">%(traceback)s</pre>
     <div id="powered_by">
       <span>
-        Powered by <a href="http://www.cherrypy.org";>CherryPy %(version)s</a>
+        Powered by <a href="http://www.cherrypy.dev";>CherryPy %(version)s</a>
       </span>
     </div>
     </body>
@@ -532,7 +532,8 @@
                     return result
             else:
                 # Load the template from this path.
-                template = io.open(error_page, newline='').read()
+                with io.open(error_page, newline='') as f:
+                    template = f.read()
         except Exception:
             e = _format_exception(*_exc_info())[-1]
             m = kwargs['message']
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/_cpmodpy.py 
new/CherryPy-18.8.0/cherrypy/_cpmodpy.py
--- old/CherryPy-18.6.1/cherrypy/_cpmodpy.py    2019-11-28 17:56:28.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/_cpmodpy.py    2022-07-17 21:43:48.000000000 
+0200
@@ -339,11 +339,8 @@
                                      }
 
         mpconf = os.path.join(os.path.dirname(__file__), 'cpmodpy.conf')
-        f = open(mpconf, 'wb')
-        try:
+        with open(mpconf, 'wb') as f:
             f.write(conf_data)
-        finally:
-            f.close()
 
         response = read_process(self.apache_path, '-k start -f %s' % mpconf)
         self.ready = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/_cprequest.py 
new/CherryPy-18.8.0/cherrypy/_cprequest.py
--- old/CherryPy-18.6.1/cherrypy/_cprequest.py  2019-11-28 17:56:28.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/_cprequest.py  2022-07-17 22:36:36.000000000 
+0200
@@ -169,7 +169,7 @@
 def response_namespace(k, v):
     """Attach response attributes declared in config."""
     # Provides config entries to set default response headers
-    # http://cherrypy.org/ticket/889
+    # http://cherrypy.dev/ticket/889
     if k[:8] == 'headers.':
         cherrypy.serving.response.headers[k.split('.', 1)[1]] = v
     else:
@@ -252,7 +252,7 @@
     The query component of the Request-URI, a string of information to be
     interpreted by the resource. The query portion of a URI follows the
     path component, and is separated by a '?'. For example, the URI
-    'http://www.cherrypy.org/wiki?a=3&b=4' has the query component,
+    'http://www.cherrypy.dev/wiki?a=3&b=4' has the query component,
     'a=3&b=4'."""
 
     query_string_encoding = 'utf8'
@@ -742,6 +742,9 @@
             if self.protocol >= (1, 1):
                 msg = "HTTP/1.1 requires a 'Host' request header."
                 raise cherrypy.HTTPError(400, msg)
+        else:
+            headers['Host'] = httputil.SanitizedHost(dict.get(headers, 'Host'))
+
         host = dict.get(headers, 'Host')
         if not host:
             host = self.local.name or self.local.ip
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/lib/auth_digest.py 
new/CherryPy-18.8.0/cherrypy/lib/auth_digest.py
--- old/CherryPy-18.6.1/cherrypy/lib/auth_digest.py     2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/lib/auth_digest.py     2022-07-17 
21:43:48.000000000 +0200
@@ -101,13 +101,12 @@
     """
     def get_ha1(realm, username):
         result = None
-        f = open(filename, 'r')
-        for line in f:
-            u, r, ha1 = line.rstrip().split(':')
-            if u == username and r == realm:
-                result = ha1
-                break
-        f.close()
+        with open(filename, 'r') as f:
+            for line in f:
+                u, r, ha1 = line.rstrip().split(':')
+                if u == username and r == realm:
+                    result = ha1
+                    break
         return result
 
     return get_ha1
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/lib/covercp.py 
new/CherryPy-18.8.0/cherrypy/lib/covercp.py
--- old/CherryPy-18.6.1/cherrypy/lib/covercp.py 2019-11-28 17:56:28.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/lib/covercp.py 2022-07-17 21:43:48.000000000 
+0200
@@ -334,9 +334,10 @@
         yield '</body></html>'
 
     def annotated_file(self, filename, statements, excluded, missing):
-        source = open(filename, 'r')
+        with open(filename, 'r') as source:
+            lines = source.readlines()
         buffer = []
-        for lineno, line in enumerate(source.readlines()):
+        for lineno, line in enumerate(lines):
             lineno += 1
             line = line.strip('\n\r')
             empty_the_buffer = True
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/lib/httputil.py 
new/CherryPy-18.8.0/cherrypy/lib/httputil.py
--- old/CherryPy-18.6.1/cherrypy/lib/httputil.py        2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/lib/httputil.py        2022-07-17 
22:36:36.000000000 +0200
@@ -516,3 +516,33 @@
 
     def __repr__(self):
         return 'httputil.Host(%r, %r, %r)' % (self.ip, self.port, self.name)
+
+
+class SanitizedHost(str):
+    r"""
+    Wraps a raw host header received from the network in
+    a sanitized version that elides dangerous characters.
+
+    >>> SanitizedHost('foo\nbar')
+    'foobar'
+    >>> SanitizedHost('foo\nbar').raw
+    'foo\nbar'
+
+    A SanitizedInstance is only returned if sanitization was performed.
+
+    >>> isinstance(SanitizedHost('foobar'), SanitizedHost)
+    False
+    """
+    dangerous = re.compile(r'[\n\r]')
+
+    def __new__(cls, raw):
+        sanitized = cls._sanitize(raw)
+        if sanitized == raw:
+            return raw
+        instance = super().__new__(cls, sanitized)
+        instance.raw = raw
+        return instance
+
+    @classmethod
+    def _sanitize(cls, raw):
+        return cls.dangerous.sub('', raw)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/lib/reprconf.py 
new/CherryPy-18.8.0/cherrypy/lib/reprconf.py
--- old/CherryPy-18.6.1/cherrypy/lib/reprconf.py        2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/lib/reprconf.py        2022-07-17 
21:43:48.000000000 +0200
@@ -163,11 +163,8 @@
             #     fp = open(filename)
             # except IOError:
             #     continue
-            fp = open(filename)
-            try:
+            with open(filename) as fp:
                 self._read(fp, filename)
-            finally:
-                fp.close()
 
     def as_dict(self, raw=False, vars=None):
         """Convert an INI file to a dictionary"""
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/lib/sessions.py 
new/CherryPy-18.8.0/cherrypy/lib/sessions.py
--- old/CherryPy-18.6.1/cherrypy/lib/sessions.py        2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/lib/sessions.py        2022-07-17 
21:43:48.000000000 +0200
@@ -516,11 +516,8 @@
         if path is None:
             path = self._get_file_path()
         try:
-            f = open(path, 'rb')
-            try:
+            with open(path, 'rb') as f:
                 return pickle.load(f)
-            finally:
-                f.close()
         except (IOError, EOFError):
             e = sys.exc_info()[1]
             if self.debug:
@@ -531,11 +528,8 @@
     def _save(self, expiration_time):
         assert self.locked, ('The session was saved without being locked.  '
                              "Check your tools' priority levels.")
-        f = open(self._get_file_path(), 'wb')
-        try:
+        with open(self._get_file_path(), 'wb') as f:
             pickle.dump((self._data, expiration_time), f, self.pickle_protocol)
-        finally:
-            f.close()
 
     def _delete(self):
         assert self.locked, ('The session deletion without being locked.  '
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/process/plugins.py 
new/CherryPy-18.8.0/cherrypy/process/plugins.py
--- old/CherryPy-18.6.1/cherrypy/process/plugins.py     2021-07-03 
23:52:38.000000000 +0200
+++ new/CherryPy-18.8.0/cherrypy/process/plugins.py     2022-07-17 
21:43:48.000000000 +0200
@@ -436,7 +436,8 @@
         if self.finalized:
             self.bus.log('PID %r already written to %r.' % (pid, self.pidfile))
         else:
-            open(self.pidfile, 'wb').write(ntob('%s\n' % pid, 'utf8'))
+            with open(self.pidfile, 'wb') as f:
+                f.write(ntob('%s\n' % pid, 'utf8'))
             self.bus.log('PID %r written to %r.' % (pid, self.pidfile))
             self.finalized = True
     start.priority = 70
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/helper.py 
new/CherryPy-18.8.0/cherrypy/test/helper.py
--- old/CherryPy-18.6.1/cherrypy/test/helper.py 2019-11-28 17:56:28.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/test/helper.py 2022-07-17 21:43:48.000000000 
+0200
@@ -505,7 +505,8 @@
 
     def get_pid(self):
         if self.daemonize:
-            return int(open(self.pid_file, 'rb').read())
+            with open(self.pid_file, 'rb') as f:
+                return int(f.read())
         return self._proc.pid
 
     def join(self):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/logtest.py 
new/CherryPy-18.8.0/cherrypy/test/logtest.py
--- old/CherryPy-18.6.1/cherrypy/test/logtest.py        2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/logtest.py        2022-07-17 
21:43:48.000000000 +0200
@@ -97,7 +97,8 @@
 
     def emptyLog(self):
         """Overwrite self.logfile with 0 bytes."""
-        open(self.logfile, 'wb').write('')
+        with open(self.logfile, 'wb') as f:
+            f.write('')
 
     def markLog(self, key=None):
         """Insert a marker line into the log and set self.lastmarker."""
@@ -105,10 +106,11 @@
             key = str(time.time())
         self.lastmarker = key
 
-        open(self.logfile, 'ab+').write(
-            b'%s%s\n'
-            % (self.markerPrefix, key.encode('utf-8'))
-        )
+        with open(self.logfile, 'ab+') as f:
+            f.write(
+                b'%s%s\n'
+                % (self.markerPrefix, key.encode('utf-8'))
+            )
 
     def _read_marked_region(self, marker=None):
         """Return lines from self.logfile in the marked region.
@@ -122,20 +124,23 @@
         logfile = self.logfile
         marker = marker or self.lastmarker
         if marker is None:
-            return open(logfile, 'rb').readlines()
+            with open(logfile, 'rb') as f:
+                return f.readlines()
 
         if isinstance(marker, str):
             marker = marker.encode('utf-8')
         data = []
         in_region = False
-        for line in open(logfile, 'rb'):
-            if in_region:
-                if line.startswith(self.markerPrefix) and marker not in line:
-                    break
-                else:
-                    data.append(line)
-            elif marker in line:
-                in_region = True
+        with open(logfile, 'rb') as f:
+            for line in f:
+                if in_region:
+                    if (line.startswith(self.markerPrefix)
+                            and marker not in line):
+                        break
+                    else:
+                        data.append(line)
+                elif marker in line:
+                    in_region = True
         return data
 
     def assertInLog(self, line, marker=None):
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/modfastcgi.py 
new/CherryPy-18.8.0/cherrypy/test/modfastcgi.py
--- old/CherryPy-18.6.1/cherrypy/test/modfastcgi.py     2019-02-28 
17:09:17.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/modfastcgi.py     2022-07-17 
21:43:48.000000000 +0200
@@ -14,7 +14,7 @@
 
 1. Apache processes Range headers automatically; CherryPy's truncated
     output is then truncated again by Apache. See test_core.testRanges.
-    This was worked around in http://www.cherrypy.org/changeset/1319.
+    This was worked around in http://www.cherrypy.dev/changeset/1319.
 2. Apache does not allow custom HTTP methods like CONNECT as per the spec.
     See test_core.testHTTPMethods.
 3. Max request header and body settings do not work with Apache.
@@ -112,15 +112,12 @@
             fcgiconf = os.path.join(curdir, fcgiconf)
 
         # Write the Apache conf file.
-        f = open(fcgiconf, 'wb')
-        try:
+        with open(fcgiconf, 'wb') as f:
             server = repr(os.path.join(curdir, 'fastcgi.pyc'))[1:-1]
             output = self.template % {'port': self.port, 'root': curdir,
                                       'server': server}
             output = output.replace('\r\n', '\n')
             f.write(output)
-        finally:
-            f.close()
 
         result = read_process(APACHE_PATH, '-k start -f %s' % fcgiconf)
         if result:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/modfcgid.py 
new/CherryPy-18.8.0/cherrypy/test/modfcgid.py
--- old/CherryPy-18.6.1/cherrypy/test/modfcgid.py       2019-02-28 
17:09:17.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/modfcgid.py       2022-07-17 
21:43:48.000000000 +0200
@@ -14,7 +14,7 @@
 
 1. Apache processes Range headers automatically; CherryPy's truncated
     output is then truncated again by Apache. See test_core.testRanges.
-    This was worked around in http://www.cherrypy.org/changeset/1319.
+    This was worked around in http://www.cherrypy.dev/changeset/1319.
 2. Apache does not allow custom HTTP methods like CONNECT as per the spec.
     See test_core.testHTTPMethods.
 3. Max request header and body settings do not work with Apache.
@@ -101,15 +101,12 @@
             fcgiconf = os.path.join(curdir, fcgiconf)
 
         # Write the Apache conf file.
-        f = open(fcgiconf, 'wb')
-        try:
+        with open(fcgiconf, 'wb') as f:
             server = repr(os.path.join(curdir, 'fastcgi.pyc'))[1:-1]
             output = self.template % {'port': self.port, 'root': curdir,
                                       'server': server}
             output = ntob(output.replace('\r\n', '\n'))
             f.write(output)
-        finally:
-            f.close()
 
         result = read_process(APACHE_PATH, '-k start -f %s' % fcgiconf)
         if result:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/modpy.py 
new/CherryPy-18.8.0/cherrypy/test/modpy.py
--- old/CherryPy-18.6.1/cherrypy/test/modpy.py  2019-02-28 17:09:17.000000000 
+0100
+++ new/CherryPy-18.8.0/cherrypy/test/modpy.py  2022-07-17 21:43:48.000000000 
+0200
@@ -15,7 +15,7 @@
 
 1. Apache processes Range headers automatically; CherryPy's truncated
     output is then truncated again by Apache. See test_core.testRanges.
-    This was worked around in http://www.cherrypy.org/changeset/1319.
+    This was worked around in http://www.cherrypy.dev/changeset/1319.
 2. Apache does not allow custom HTTP methods like CONNECT as per the spec.
     See test_core.testHTTPMethods.
 3. Max request header and body settings do not work with Apache.
@@ -107,13 +107,10 @@
         if not os.path.isabs(mpconf):
             mpconf = os.path.join(curdir, mpconf)
 
-        f = open(mpconf, 'wb')
-        try:
+        with open(mpconf, 'wb') as f:
             f.write(self.template %
                     {'port': self.port, 'modulename': modulename,
                      'host': self.host})
-        finally:
-            f.close()
 
         result = read_process(APACHE_PATH, '-k start -f %s' % mpconf)
         if result:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/modwsgi.py 
new/CherryPy-18.8.0/cherrypy/test/modwsgi.py
--- old/CherryPy-18.6.1/cherrypy/test/modwsgi.py        2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/modwsgi.py        2022-07-17 
21:43:48.000000000 +0200
@@ -11,7 +11,7 @@
 
 1. Apache processes Range headers automatically; CherryPy's truncated
     output is then truncated again by Apache. See test_core.testRanges.
-    This was worked around in http://www.cherrypy.org/changeset/1319.
+    This was worked around in http://www.cherrypy.dev/changeset/1319.
 2. Apache does not allow custom HTTP methods like CONNECT as per the spec.
     See test_core.testHTTPMethods.
 3. Max request header and body settings do not work with Apache.
@@ -109,14 +109,11 @@
         if not os.path.isabs(mpconf):
             mpconf = os.path.join(curdir, mpconf)
 
-        f = open(mpconf, 'wb')
-        try:
+        with open(mpconf, 'wb') as f:
             output = (self.template %
                       {'port': self.port, 'testmod': modulename,
                        'curdir': curdir})
             f.write(output)
-        finally:
-            f.close()
 
         result = read_process(APACHE_PATH, '-k start -f %s' % mpconf)
         if result:
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_auth_basic.py 
new/CherryPy-18.8.0/cherrypy/test/test_auth_basic.py
--- old/CherryPy-18.6.1/cherrypy/test/test_auth_basic.py        2019-02-28 
17:09:17.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_auth_basic.py        2022-07-17 
21:43:48.000000000 +0200
@@ -1,4 +1,4 @@
-# This file is part of CherryPy <http://www.cherrypy.org/>
+# This file is part of CherryPy <http://www.cherrypy.dev/>
 # -*- coding: utf-8 -*-
 # vim:ts=4:sw=4:expandtab:fileencoding=utf-8
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_auth_digest.py 
new/CherryPy-18.8.0/cherrypy/test/test_auth_digest.py
--- old/CherryPy-18.6.1/cherrypy/test/test_auth_digest.py       2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_auth_digest.py       2022-07-17 
21:43:48.000000000 +0200
@@ -1,4 +1,4 @@
-# This file is part of CherryPy <http://www.cherrypy.org/>
+# This file is part of CherryPy <http://www.cherrypy.dev/>
 # -*- coding: utf-8 -*-
 # vim:ts=4:sw=4:expandtab:fileencoding=utf-8
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_core.py 
new/CherryPy-18.8.0/cherrypy/test/test_core.py
--- old/CherryPy-18.6.1/cherrypy/test/test_core.py      2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_core.py      2022-07-17 
21:43:48.000000000 +0200
@@ -586,9 +586,8 @@
     def testFavicon(self):
         # favicon.ico is served by staticfile.
         icofilename = os.path.join(localDir, '../favicon.ico')
-        icofile = open(icofilename, 'rb')
-        data = icofile.read()
-        icofile.close()
+        with open(icofilename, 'rb') as icofile:
+            data = icofile.read()
 
         self.getPage('/favicon.ico')
         self.assertBody(data)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_encoding.py 
new/CherryPy-18.8.0/cherrypy/test/test_encoding.py
--- old/CherryPy-18.6.1/cherrypy/test/test_encoding.py  2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_encoding.py  2022-07-17 
21:43:48.000000000 +0200
@@ -46,7 +46,7 @@
                 #  any part which is unicode (even ascii), the response
                 #  should not fail.
                 cherrypy.response.cookie['candy'] = 'bar'
-                cherrypy.response.cookie['candy']['domain'] = 'cherrypy.org'
+                cherrypy.response.cookie['candy']['domain'] = 'cherrypy.dev'
                 cherrypy.response.headers[
                     'Some-Header'] = 'My d\xc3\xb6g has fleas'
                 cherrypy.response.headers[
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_logging.py 
new/CherryPy-18.8.0/cherrypy/test/test_logging.py
--- old/CherryPy-18.6.1/cherrypy/test/test_logging.py   2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_logging.py   2022-07-17 
21:43:48.000000000 +0200
@@ -113,7 +113,7 @@
     resp = requests.get(
         'http://%s:%s/as_string' % (host, port),
         headers={
-            'Referer': 'http://www.cherrypy.org/',
+            'Referer': 'http://www.cherrypy.dev/',
             'User-Agent': 'Mozilla/5.0',
         },
     )
@@ -135,7 +135,7 @@
     log_tracker.assertLog(
         -1,
         '] "GET /as_string HTTP/1.1" 200 %s '
-        '"http://www.cherrypy.org/"; "Mozilla/5.0"'
+        '"http://www.cherrypy.dev/"; "Mozilla/5.0"'
         % content_length,
     )
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_request_obj.py 
new/CherryPy-18.8.0/cherrypy/test/test_request_obj.py
--- old/CherryPy-18.6.1/cherrypy/test/test_request_obj.py       2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_request_obj.py       2022-07-17 
22:36:36.000000000 +0200
@@ -342,7 +342,7 @@
         self.assertBody('/pathinfo/foo/bar')
 
     def testAbsoluteURIPathInfo(self):
-        # http://cherrypy.org/ticket/1061
+        # http://cherrypy.dev/ticket/1061
         self.getPage('http://localhost/pathinfo/foo/bar')
         self.assertBody('/pathinfo/foo/bar')
 
@@ -375,10 +375,10 @@
 
         # Make sure that encoded = and & get parsed correctly
         self.getPage(
-            '/params/code?url=http%3A//cherrypy.org/index%3Fa%3D1%26b%3D2')
+            '/params/code?url=http%3A//cherrypy.dev/index%3Fa%3D1%26b%3D2')
         self.assertBody('args: %s kwargs: %s' %
                         (('code',),
-                         [('url', ntou('http://cherrypy.org/index?a=1&b=2'))]))
+                         [('url', ntou('http://cherrypy.dev/index?a=1&b=2'))]))
 
         # Test coordinates sent by <img ismap>
         self.getPage('/params/ismap?223,114')
@@ -756,6 +756,16 @@
                      headers=[('Content-type', 'application/json')])
         self.assertBody('application/json')
 
+    def test_dangerous_host(self):
+        """
+        Dangerous characters like newlines should be elided.
+        Ref #1974.
+        """
+        # foo\nbar
+        encoded = '=?iso-8859-1?q?foo=0Abar?='
+        self.getPage('/headers/Host', headers=[('Host', encoded)])
+        self.assertBody('foobar')
+
     def test_basic_HTTPMethods(self):
         helper.webtest.methods_with_bodies = ('POST', 'PUT', 'PROPFIND',
                                               'PATCH')
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_states.py 
new/CherryPy-18.8.0/cherrypy/test/test_states.py
--- old/CherryPy-18.6.1/cherrypy/test/test_states.py    2021-03-23 
01:12:07.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_states.py    2022-07-17 
21:43:48.000000000 +0200
@@ -424,11 +424,12 @@
         p.join()
 
         # Assert the old handler ran.
-        log_lines = list(open(p.error_log, 'rb'))
-        assert any(
-            line.endswith(b'I am an old SIGTERM handler.\n')
-            for line in log_lines
-        )
+        with open(p.error_log, 'rb') as f:
+            log_lines = list(f)
+            assert any(
+                line.endswith(b'I am an old SIGTERM handler.\n')
+                for line in log_lines
+            )
 
 
 def test_safe_wait_INADDR_ANY():  # pylint: disable=invalid-name
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/cherrypy/test/test_tutorials.py 
new/CherryPy-18.8.0/cherrypy/test/test_tutorials.py
--- old/CherryPy-18.6.1/cherrypy/test/test_tutorials.py 2019-11-28 
17:56:28.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/test/test_tutorials.py 2022-07-17 
21:43:48.000000000 +0200
@@ -78,7 +78,7 @@
 
             <ul>
                 <li><a href="http://del.icio.us";>del.icio.us</a></li>
-                <li><a href="http://www.cherrypy.org";>CherryPy</a></li>
+                <li><a href="http://www.cherrypy.dev";>CherryPy</a></li>
             </ul>
 
             <p>[<a href="../">Return to links page</a>]</p>'''
@@ -166,7 +166,7 @@
         self.assertHeader('Content-Disposition',
                           # Make sure the filename is quoted.
                           'attachment; filename="pdf_file.pdf"')
-        self.assertEqual(len(self.body), 85698)
+        self.assertEqual(len(self.body), 11961)
 
     def test10HTTPErrors(self):
         self.setup_tutorial('tut10_http_errors', 'HTTPErrorDemo')
Binary files old/CherryPy-18.6.1/cherrypy/tutorial/pdf_file.pdf and 
new/CherryPy-18.8.0/cherrypy/tutorial/pdf_file.pdf differ
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/CherryPy-18.6.1/cherrypy/tutorial/tut04_complex_site.py 
new/CherryPy-18.8.0/cherrypy/tutorial/tut04_complex_site.py
--- old/CherryPy-18.6.1/cherrypy/tutorial/tut04_complex_site.py 2019-02-28 
17:09:17.000000000 +0100
+++ new/CherryPy-18.8.0/cherrypy/tutorial/tut04_complex_site.py 2022-07-17 
21:43:48.000000000 +0200
@@ -53,7 +53,7 @@
 
             <ul>
                 <li>
-                    <a href="http://www.cherrypy.org";>The CherryPy Homepage</a>
+                    <a href="http://www.cherrypy.dev";>The CherryPy Homepage</a>
                 </li>
                 <li>
                     <a href="http://www.python.org";>The Python Homepage</a>
@@ -77,7 +77,7 @@
 
             <ul>
                 <li><a href="http://del.icio.us";>del.icio.us</a></li>
-                <li><a href="http://www.cherrypy.org";>CherryPy</a></li>
+                <li><a href="http://www.cherrypy.dev";>CherryPy</a></li>
             </ul>
 
             <p>[<a href="../">Return to links page</a>]</p>'''
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/docs/conf.py 
new/CherryPy-18.8.0/docs/conf.py
--- old/CherryPy-18.6.1/docs/conf.py    2021-03-23 01:12:07.000000000 +0100
+++ new/CherryPy-18.8.0/docs/conf.py    2022-07-17 21:43:48.000000000 +0200
@@ -106,7 +106,7 @@
 
 intersphinx_mapping = {
     'python': ('https://docs.python.org/3', None),
-    'cheroot': ('https://cheroot.cherrypy.org/en/latest/', None),
+    'cheroot': ('https://cheroot.cherrypy.dev/en/latest/', None),
     'pytest-docs': ('https://docs.pytest.org/en/latest/', None),
 }
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/docs/contribute.rst 
new/CherryPy-18.8.0/docs/contribute.rst
--- old/CherryPy-18.6.1/docs/contribute.rst     2019-02-28 17:09:17.000000000 
+0100
+++ new/CherryPy-18.8.0/docs/contribute.rst     2022-06-22 02:20:54.000000000 
+0200
@@ -6,7 +6,7 @@
 in and add their best contribution to the project.
 
 How can you contribute? Well, first search the `docs
-<https://docs.cherrypy.org>`_ and the `project page
+<https://docs.cherrypy.dev>`_ and the `project page
 <https://github.com/cherrypy/cherrypy>`_ to see if someone
 has already reported your issue.
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/docs/index.rst 
new/CherryPy-18.8.0/docs/index.rst
--- old/CherryPy-18.6.1/docs/index.rst  2021-03-23 01:12:07.000000000 +0100
+++ new/CherryPy-18.8.0/docs/index.rst  2022-07-17 21:43:48.000000000 +0200
@@ -26,7 +26,7 @@
 
    pkg/modules
 
-`CherryPy <http://www.cherrypy.org>`_ is a pythonic, object-oriented web 
framework.
+`CherryPy <http://www.cherrypy.dev>`_ is a pythonic, object-oriented web 
framework.
 
 CherryPy allows developers to build web applications in much the
 same way they would build any other object-oriented Python program.
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/man/cherryd.1 
new/CherryPy-18.8.0/man/cherryd.1
--- old/CherryPy-18.6.1/man/cherryd.1   2019-02-28 17:09:17.000000000 +0100
+++ new/CherryPy-18.8.0/man/cherryd.1   2022-06-22 02:20:54.000000000 +0200
@@ -253,7 +253,7 @@
 fumanchu
 
 .nf
-cherrypy.org
+cherrypy.dev
 .fi
 
 .SH COPYRIGHT
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/pytest.ini 
new/CherryPy-18.8.0/pytest.ini
--- old/CherryPy-18.6.1/pytest.ini      2021-03-23 01:12:07.000000000 +0100
+++ new/CherryPy-18.8.0/pytest.ini      2022-07-17 21:43:48.000000000 +0200
@@ -1,64 +1,83 @@
 [pytest]
 addopts =
-    # `pytest-xdist`:
-    #--numprocesses=auto
+  # FIXME: Enable this once the test suite has no race conditions
+  # `pytest-xdist`:
+  # --numprocesses=auto
+
+  # `pytest-mon`:
+  # Useful for live testing with `pytest-watch` during development:
+  #--testmon
+
+  # Show 10 slowest invocations:
+  --durations=10
+
+  # A bit of verbosity doesn't hurt:
+  -v
+
+  # Report all the things == -rxXs:
+  -ra
+
+  # Show values of the local vars in errors:
+  --showlocals
+
+  # Autocollect and invoke the doctests from all modules:
+  # https://docs.pytest.org/en/stable/doctest.html
+  --doctest-modules
+
+  # Dump the test results in junit format:
+  --junitxml=.test-results/pytest/results.xml
+
+  # `pytest-cov`:
+  # `pytest-cov`, "-p" preloads the module early:
+  -p pytest_cov
+  --no-cov-on-fail
+  --cov=cherrypy
+  --cov-branch
+  --cov-report=term-missing:skip-covered
+  --cov-report=html:.tox/tmp/test-results/pytest/cov/
+  --cov-report=xml
+  # --cov-report xml:.test-results/pytest/cov.xml  # alternatively move it here
+  --cov-context=test
+  --cov-config=.coveragerc
 
-    # `pytest-mon`:
-    # useful for live testing with `pytest-watch` during development:
-    #--testmon
-
-    # show 10 slowest invocations:
-    --durations=10
-
-    # a bit of verbosity doesn't hurt:
-    -v
-
-    # report all the things == -rxXs:
-    -ra
-
-    # show values of the local vars in errors:
-    --showlocals
-
-    # autocollect and invoke the doctests from all modules:
-    --doctest-modules
-
-    # dump the test results in junit format:
-    --junitxml=.test-results/pytest/results.xml
-
-    # `pytest-cov`:
-    --cov=cherrypy
-    --cov-report term-missing:skip-covered
-    --cov-report xml
-    # --cov-report xml:.test-results/pytest/cov.xml  # alternatively move it 
here
 doctest_optionflags = ALLOW_UNICODE ELLIPSIS
+
 filterwarnings =
-    error
+  error
+
+  # pytest>=6.2.0 under Python 3.8:
+  # Ref: https://docs.pytest.org/en/stable/usage.html#unraisable
+  # Ref: https://github.com/pytest-dev/pytest/issues/5299
+  ignore:Exception ignored in. <socket.socket fd=-1, 
family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, 
proto=6>:pytest.PytestUnraisableExceptionWarning:_pytest.unraisableexception
+  ignore:Exception ignored in. <_io.FileIO 
.closed.>:pytest.PytestUnraisableExceptionWarning:_pytest.unraisableexception
+
+  ignore:Use cheroot.test.webtest:DeprecationWarning
+  ignore:This method will be removed in future versions.*:DeprecationWarning
+  ignore:Unable to verify that the server is bound on:UserWarning
+  ignore:Not importing directory 
.*.tox/py35/lib/python3.5/site-packages/(zc|repoze).* missing 
__init__:ImportWarning
+  # ref: 
https://github.com/mhammond/pywin32/issues/1256#issuecomment-527972824 :
+  ignore:the imp module is deprecated in favour of importlib; see the module's 
documentation for alternative uses:DeprecationWarning
+  ignore:the imp module is deprecated in favour of importlib; see the module's 
documentation for alternative uses:PendingDeprecationWarning
 
-    # pytest>=6.2.0 under Python 3.8:
-    # Ref: https://docs.pytest.org/en/stable/usage.html#unraisable
-    # Ref: https://github.com/pytest-dev/pytest/issues/5299
-    ignore:Exception ignored in. <socket.socket fd=-1, 
family=AddressFamily.AF_INET, type=SocketKind.SOCK_STREAM, 
proto=6>:pytest.PytestUnraisableExceptionWarning:_pytest.unraisableexception
-    ignore:Exception ignored in. <_io.FileIO 
.closed.>:pytest.PytestUnraisableExceptionWarning:_pytest.unraisableexception
-
-    ignore:Use cheroot.test.webtest:DeprecationWarning
-    ignore:This method will be removed in future versions.*:DeprecationWarning
-    ignore:Unable to verify that the server is bound on:UserWarning
-    ignore:Not importing directory 
.*.tox/py35/lib/python3.5/site-packages/(zc|repoze).* missing 
__init__:ImportWarning
-    # ref: 
https://github.com/mhammond/pywin32/issues/1256#issuecomment-527972824 :
-    ignore:the imp module is deprecated in favour of importlib; see the 
module's documentation for alternative uses:DeprecationWarning
-    ignore:the imp module is deprecated in favour of importlib; see the 
module's documentation for alternative uses:PendingDeprecationWarning
 junit_duration_report = call
 junit_family = xunit2
 junit_suite_name = cherrypy_test_suite
+
+# A mapping of markers to their descriptions allowed in strict mode:
+markers =
+
 minversion = 5.3.5
+
+# Optimize pytest's lookup by restricting potentially deep dir tree scan:
 norecursedirs =
-    build
-    cherrypy.egg-info
-    dist
-    docs
-    .cache
-    .eggs
-    .git
-    .github
-    .tox
+  build
+  cherrypy.egg-info
+  dist
+  docs
+  .cache
+  .eggs
+  .git
+  .github
+  .tox
+
 testpaths = cherrypy/test/
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/CherryPy-18.6.1/setup.py new/CherryPy-18.8.0/setup.py
--- old/CherryPy-18.6.1/setup.py        2021-07-04 00:28:41.000000000 +0200
+++ new/CherryPy-18.8.0/setup.py        2022-07-17 21:59:36.000000000 +0200
@@ -14,7 +14,7 @@
     use_scm_version=True,
     description='Object-Oriented HTTP framework',
     author='CherryPy Team',
-    author_email='t...@cherrypy.org',
+    author_email='t...@cherrypy.dev',
     classifiers=[
         'Development Status :: 5 - Production/Stable',
         'Environment :: Web Environment',
@@ -25,10 +25,6 @@
         'License :: OSI Approved :: BSD License',
         'Programming Language :: Python',
         'Programming Language :: Python :: 3',
-        'Programming Language :: Python :: 3.5',
-        'Programming Language :: Python :: 3.6',
-        'Programming Language :: Python :: 3.7',
-        'Programming Language :: Python :: 3.8',
         'Programming Language :: Python :: Implementation',
         'Programming Language :: Python :: Implementation :: CPython',
         'Programming Language :: Python :: Implementation :: Jython',
@@ -41,12 +37,12 @@
         'Topic :: Internet :: WWW/HTTP :: WSGI :: Server',
         'Topic :: Software Development :: Libraries :: Application Frameworks',
     ],
-    url='https://www.cherrypy.org',
+    url='https://www.cherrypy.dev',
     project_urls={
         'CI: AppVeyor': 'https://ci.appveyor.com/project/{}'.format(repo_slug),
         'CI: Travis': 'https://travis-ci.org/{}'.format(repo_slug),
         'CI: Circle': 'https://circleci.com/gh/{}'.format(repo_slug),
-        'Docs: RTD': 'https://docs.cherrypy.org',
+        'Docs: RTD': 'https://docs.cherrypy.dev',
         'GitHub: issues': '{}/issues'.format(repo_url),
         'GitHub: repo': repo_url,
         'Tidelift: funding':
@@ -101,7 +97,7 @@
         'memcached_session': ['python-memcached>=1.58'],
         'xcgi': ['flup'],
 
-        # 
https://docs.cherrypy.org/en/latest/advanced.html?highlight=windows#windows-console-events
+        # 
https://docs.cherrypy.dev/en/latest/advanced.html?highlight=windows#windows-console-events
         ':sys_platform == "win32" and implementation_name == "cpython"'
         # pywin32 disabled while a build is unavailable. Ref #1920.
         ' and python_version < "3.10"': [
@@ -111,7 +107,7 @@
     setup_requires=[
         'setuptools_scm',
     ],
-    python_requires='>=3.5',
+    python_requires='>=3.6',
 )
 
 

Reply via email to