/usr/share/pyshared/kid/server.py is in python-kid 0.9.6-2.
This file is owned by root:root, with mode 0o644.
The actual contents of the file can be viewed below.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 | # -*- coding: utf-8 -*-
"""Kid-savvy HTTP Server.
Written by Christoph Zwerschke based on CGIHTTPServer 0.4.
This module builds on SimpleHTTPServer by implementing GET and POST
requests to Kid templates.
In all cases, the implementation is intentionally naive -- all
requests are executed by the same process and sychronously.
Code to create and run the server looks like this:
from kid.server import HTTPServer
host, port = 'localhost', 8000
HTTPServer((host, port)).serve_forever()
This serves files and kid templates from the current directory
and any of its subdirectories.
If you want the server to be accessible via the network,
use your local host name or an empty string as the host.
(Security warning: Don't do this unless you are inside a firewall.)
You can also call the test() function to run the server, or run this
module as a script, providing host and port as command line arguments.
The Kid templates have access to the following predefined objects:
FieldStorage (access to GET/POST variables)
environ (CGI environment)
request (the request handler object)
Here is a simple Kid template you can use to test the server:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:py="http://purl.org/kid/ns#">
<head><title>Python Expression Evaluator</title></head>
<body>
<h3 py:if="FieldStorage.has_key('expr')">
${FieldStorage.getvalue('expr')} =
${eval(FieldStorage.getvalue('expr'))}</h3>
<form action="${environ['SCRIPT_NAME']}" method="post">
<h3>Enter a Python expression:</h3>
<input name="expr" type="text" size="40" maxlength="40" />
<input type="submit" value="Submit" />
</form>
</body>
</html>
"""
__revision__ = "$Rev: 492 $"
__date__ = "$Date: 2007-07-06 21:38:45 -0400 (Fri, 06 Jul 2007) $"
__author__ = "Christoph Zwerschke (cito@online.de)"
__copyright__ = "Copyright 2005, Christoph Zwerschke"
__license__ = "MIT <http://www.opensource.org/licenses/mit-license.php>"
import os.path
from urllib import unquote
from BaseHTTPServer import HTTPServer as BaseHTTPServer
from SimpleHTTPServer import SimpleHTTPRequestHandler
from cgi import FieldStorage
from kid import load_template
__all__ = ["HTTPServer", "HTTPRequestHandler"]
default_host = 'localhost'
default_port = 8000
class HTTPRequestHandler(SimpleHTTPRequestHandler):
"""Complete HTTP server with GET, HEAD and POST commands.
GET and HEAD also support running Kid templates.
The POST command is *only* implemented for Kid templates."""
def do_POST(self):
"""Serve a POST request implemented for Kid templates."""
if self.is_kid():
self.run_kid()
else:
self.send_error(501, "Can only POST to Kid templates")
def send_head(self):
"""Version of send_head that supports Kid templates."""
if self.is_kid():
return self.run_kid()
else:
return SimpleHTTPRequestHandler.send_head(self)
def is_kid(self):
"""Test whether self.path corresponds to a Kid template.
The default implementation tests whether the path ends
with one of the strings in the list self.kid_extensions.
"""
path = self.path
i = path.rfind('?')
if i >= 0:
path, query = path[:i], path[i+1:]
else:
query = ''
for x in self.kid_extensions:
if path.endswith(x):
self.cgi_info = path, query
return True
return False
kid_extensions = ['.kid', '.kid.html']
def run_kid(self):
"""Execute a Kid template."""
scriptname, query = self.cgi_info
scriptfile = self.translate_path(scriptname)
if not os.path.exists(scriptfile):
self.send_error(404, "No such Kid template (%r)"
% scriptname)
return
if not os.path.isfile(scriptfile):
self.send_error(403, "Kid template is not a plain file (%r)"
% scriptname)
return
env = {}
env['SERVER_SOFTWARE'] = self.version_string()
env['SERVER_NAME'] = self.server.server_name
env['GATEWAY_INTERFACE'] = 'CGI/1.1'
env['SERVER_PROTOCOL'] = self.protocol_version
env['SERVER_PORT'] = str(self.server.server_port)
env['REQUEST_METHOD'] = self.command
uqpath = unquote(scriptname)
env['PATH_INFO'] = uqpath
env['PATH_TRANSLATED'] = self.translate_path(uqpath)
env['SCRIPT_NAME'] = scriptname
if query:
env['QUERY_STRING'] = query
host = self.address_string()
if host != self.client_address[0]:
env['REMOTE_HOST'] = host
env['REMOTE_ADDR'] = self.client_address[0]
authorization = self.headers.getheader("authorization")
if authorization:
authorization = authorization.split()
if len(authorization) == 2:
import base64, binascii
env['AUTH_TYPE'] = authorization[0]
if authorization[0].lower() == "basic":
try:
authorization = base64.decodestring(authorization[1])
except binascii.Error:
pass
else:
authorization = authorization.split(':')
if len(authorization) == 2:
env['REMOTE_USER'] = authorization[0]
if self.headers.typeheader is None:
env['CONTENT_TYPE'] = self.headers.type
else:
env['CONTENT_TYPE'] = self.headers.typeheader
length = self.headers.getheader('content-length')
if length:
env['CONTENT_LENGTH'] = length
accept = []
for line in self.headers.getallmatchingheaders('accept'):
if line[:1] in "\t\n\r ":
accept.append(line.strip())
else:
accept = accept + line[7:].split(',')
env['HTTP_ACCEPT'] = ','.join(accept)
ua = self.headers.getheader('user-agent')
if ua:
env['HTTP_USER_AGENT'] = ua
co = filter(None, self.headers.getheaders('cookie'))
if co:
env['HTTP_COOKIE'] = ', '.join(co)
self.send_response(200, "Script output follows")
# Execute template in this process
try:
template_module = load_template(scriptfile, cache=True)
template = template_module.Template(
request=self, environ=env,
FieldStorage=FieldStorage(self.rfile, environ=env))
s = str(template)
self.send_header("Content-type", "text/html")
self.send_header("Content-Length", str(len(s)))
self.end_headers()
self.wfile.write(s)
except Exception, e:
self.log_error("Kid template exception: %s", str(e))
else:
self.log_message("Kid template exited OK")
class HTTPServer(BaseHTTPServer):
def __init__(self,
server_address=None,
RequestHandlerClass=HTTPRequestHandler):
if server_address is None:
server_address = (default_host, default_port)
BaseHTTPServer.__init__(self,
server_address, HTTPRequestHandler)
def test(server_address=None,
HandlerClass=HTTPRequestHandler,
ServerClass=HTTPServer,
protocol="HTTP/1.0"):
"""Test the HTTP request handler class."""
HandlerClass.protocol_version = protocol
server = ServerClass(server_address, HandlerClass)
sa = server.socket.getsockname()
print "Serving HTTP on", sa[0], "port", sa[1], "..."
server.serve_forever()
def main():
"""This runs the Kid-savvy HTTP server.
Provide host and port as command line arguments.
The current directory serves as the root directory.
"""
from sys import argv, exit
if len(argv) > 3:
print "Usage:", argv[0], "[host]:[port]"
exit(2)
if len(argv) < 2:
server_address = (default_host, default_port)
else:
if len(argv) == 3:
host = argv[1]
port = argv[2]
else:
host = argv[1].split(':', 1)
if len(host) < 2:
host = host[0]
if host.isdigit():
port = host
host = ''
else:
port = None
else:
host, port = host
if port:
if port.isdigit():
port = int(port)
else:
print "Bad port number."
exit(1)
else:
port = default_port
server_address = (host, port)
test(server_address)
if __name__ == '__main__':
main()
|