chiark / gitweb /
cgi.py: Emit the error about `POST' content-type correctly.
[chopwood] / cgi.py
diff --git a/cgi.py b/cgi.py
index 1aa2917950ad99350c143c70bf6486119eccc338..6006062eddc5132ec5ba980b722ba2695f280007 100644 (file)
--- a/cgi.py
+++ b/cgi.py
@@ -123,6 +123,8 @@ class HTTPOutput (O.FileOutput):
     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):
   """
@@ -318,6 +320,7 @@ PARAM = []
 PARAMDICT = {}
 PATH = []
 SSLP = False
+HEADER_DONE = lambda: None
 
 ## Regular expressions for splitting apart query and cookie strings.
 R_QSPLIT = RX.compile('[;&]')
@@ -388,7 +391,7 @@ def cgiparse():
   METHOD = getenv('REQUEST_METHOD')
 
   ## Acquire the query string.
-  if METHOD == 'GET':
+  if METHOD in ['GET', 'HEAD']:
     q = getenv('QUERY_STRING')
 
   elif METHOD == 'POST':
@@ -398,7 +401,8 @@ def cgiparse():
     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:
@@ -465,6 +469,8 @@ class Subcommand (SC.Subcommand):
     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