chiark
/
gitweb
/
~mdw
/
chopwood
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
backend.py: Make FlatFileRecord._format include the trailing newline.
[chopwood]
/
cgi.py
diff --git
a/cgi.py
b/cgi.py
index 0ecdfe20fc7485ef2b9e040571753097184f6789..69b90386b36ae99638697643e737cc98eb8e11b6 100644
(file)
--- a/
cgi.py
+++ b/
cgi.py
@@
-115,7
+115,7
@@
class HTTPOutput (O.FileOutput):
"""
Print a header, if none has yet been printed.
"""
Print a header, if none has yet been printed.
- Keyword arguments can be passed to emit HTTP headers: see `http_header'
+ Keyword arguments can be passed to emit HTTP headers: see `http_header
s
'
for the formatting rules.
"""
if me.headerp: return
for the formatting rules.
"""
if me.headerp: return
@@
-123,6
+123,8
@@
class HTTPOutput (O.FileOutput):
for h in O.http_headers(content_type = content_type, **kw):
me.writeln(h)
me.writeln('')
for h in O.http_headers(content_type = content_type, **kw):
me.writeln(h)
me.writeln('')
+ if METHOD == 'HEAD':
+ HEADER_DONE()
def cookie(name, value, **kw):
"""
def cookie(name, value, **kw):
"""
@@
-311,12
+313,14
@@
def cgi_errors(hook = None):
### CGI input.
## Lots of global variables to be filled in by `cgiparse'.
### CGI input.
## Lots of global variables to be filled in by `cgiparse'.
+METHOD = None
COOKIE = {}
SPECIAL = {}
PARAM = []
PARAMDICT = {}
PATH = []
SSLP = False
COOKIE = {}
SPECIAL = {}
PARAM = []
PARAMDICT = {}
PATH = []
SSLP = False
+HEADER_DONE = lambda: None
## Regular expressions for splitting apart query and cookie strings.
R_QSPLIT = RX.compile('[;&]')
## Regular expressions for splitting apart query and cookie strings.
R_QSPLIT = RX.compile('[;&]')
@@
-377,34
+381,35
@@
def cgiparse():
True if the client connection is carried over SSL or TLS.
"""
True if the client connection is carried over SSL or TLS.
"""
- global SSLP
+ global
METHOD,
SSLP
def getenv(var):
try: return ENV[var]
except KeyError: raise U.ExpectedError, (500, "No `%s' supplied" % var)
## Yes, we want the request method.
def getenv(var):
try: return ENV[var]
except KeyError: raise U.ExpectedError, (500, "No `%s' supplied" % var)
## Yes, we want the request method.
-
method
= getenv('REQUEST_METHOD')
+
METHOD
= getenv('REQUEST_METHOD')
## Acquire the query string.
## Acquire the query string.
- if
method == 'GET'
:
+ if
METHOD in ['GET', 'HEAD']
:
q = getenv('QUERY_STRING')
q = getenv('QUERY_STRING')
- elif
method
== 'POST':
+ elif
METHOD
== 'POST':
## We must read the query string from stdin.
n = getenv('CONTENT_LENGTH')
if not n.isdigit():
raise U.ExpectedError, (500, "Invalid CONTENT_LENGTH")
n = int(n, 10)
## We must read the query string from stdin.
n = getenv('CONTENT_LENGTH')
if not n.isdigit():
raise U.ExpectedError, (500, "Invalid CONTENT_LENGTH")
n = int(n, 10)
- if getenv('CONTENT_TYPE') != 'application/x-www-form-urlencoded':
+ ct = getenv('CONTENT_TYPE')
+ if ct != 'application/x-www-form-urlencoded':
raise U.ExpectedError, (500, "Unexpected content type `%s'" % ct)
q = SYS.stdin.read(n)
if len(q) != n:
raise U.ExpectedError, (500, "Failed to read correct length")
else:
raise U.ExpectedError, (500, "Unexpected content type `%s'" % ct)
q = SYS.stdin.read(n)
if len(q) != n:
raise U.ExpectedError, (500, "Failed to read correct length")
else:
- raise U.ExpectedError, (500, "Unexpected request method `%s'" %
method
)
+ raise U.ExpectedError, (500, "Unexpected request method `%s'" %
METHOD
)
## Populate the `SPECIAL', `PARAM' and `PARAMDICT' tables.
seen = set()
## Populate the `SPECIAL', `PARAM' and `PARAMDICT' tables.
seen = set()
@@
-414,7
+419,8
@@
def cgiparse():
else:
PARAM.append((k, v))
if k in seen:
else:
PARAM.append((k, v))
if k in seen:
- del PARAMDICT[k]
+ try: del PARAMDICT[k]
+ except KeyError: pass
else:
PARAMDICT[k] = v
seen.add(k)
else:
PARAMDICT[k] = v
seen.add(k)
@@
-448,6
+454,11
@@
class Subcommand (SC.Subcommand):
CGI parameters.
"""
CGI parameters.
"""
+ def __init__(me, name, contexts, desc, func,
+ methods = ['GET', 'POST'], *args, **kw):
+ super(Subcommand, me).__init__(name, contexts, desc, func, *args, **kw)
+ me.methods = set(methods)
+
def cgi(me, param, path):
"""
Invoke the subcommand given a collection of CGI parameters.
def cgi(me, param, path):
"""
Invoke the subcommand given a collection of CGI parameters.
@@
-464,6
+475,8
@@
class Subcommand (SC.Subcommand):
the list of path elements is non-empty.
"""
the list of path elements is non-empty.
"""
+ global HEADER_DONE
+
## We're going to make a pass over the supplied parameters, and we'll
## check them off against the formal parameters as we go; so we'll need
## to be able to look them up. We'll also keep track of the ones we've
## We're going to make a pass over the supplied parameters, and we'll
## check them off against the formal parameters as we go; so we'll need
## to be able to look them up. We'll also keep track of the ones we've
@@
-477,6
+490,12
@@
class Subcommand (SC.Subcommand):
want = {}
kw = {}
want = {}
kw = {}
+ ## Check the request method against the permitted list.
+ meth = METHOD
+ if meth == 'HEAD': meth = 'GET'
+ if meth not in me.methods:
+ raise U.ExpectedError, (500, "Unexpected request method `%s'" % METHOD)
+
def set_value(k, v):
"""Set a simple value: we shouldn't see multiple values."""
if k in kw:
def set_value(k, v):
"""Set a simple value: we shouldn't see multiple values."""
if k in kw: