chiark / gitweb /
cgi.py: Emit the error about `POST' content-type correctly.
[chopwood] / cgi.py
diff --git a/cgi.py b/cgi.py
index d66bfc6a6b106b4b55c4626aa40d6073be8ec41b..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):
   """
@@ -311,12 +313,14 @@ def cgi_errors(hook = None):
 ### CGI input.
 
 ## Lots of global variables to be filled in by `cgiparse'.
+METHOD = None
 COOKIE = {}
 SPECIAL = {}
 PARAM = []
 PARAMDICT = {}
 PATH = []
 SSLP = False
+HEADER_DONE = lambda: None
 
 ## 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.
   """
 
-  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.
-  method = getenv('REQUEST_METHOD')
+  METHOD = getenv('REQUEST_METHOD')
 
   ## Acquire the query string.
-  if method == 'GET':
+  if METHOD in ['GET', 'HEAD']:
     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)
-    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 request method `%s'" % method)
+    raise U.ExpectedError, (500, "Unexpected request method `%s'" % METHOD)
 
   ## Populate the `SPECIAL', `PARAM' and `PARAMDICT' tables.
   seen = set()
@@ -464,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