cgi.py: Implement the `HEAD' request method.
authorMark Wooding <mdw@distorted.org.uk>
Sat, 13 Jul 2013 15:34:40 +0000 (16:34 +0100)
committerMark Wooding <mdw@distorted.org.uk>
Sun, 6 Apr 2014 11:22:39 +0000 (12:22 +0100)
A simple hack in the HTTP output driver to escape after writing the
header.

cgi.py
chpwd

diff --git a/cgi.py b/cgi.py
index 1aa2917..01fb868 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':
@@ -465,6 +468,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
diff --git a/chpwd b/chpwd
index 7190ddf..9f483de 100755 (executable)
--- a/chpwd
+++ b/chpwd
@@ -208,7 +208,9 @@ if __name__ == '__main__':
     ## over HTTP is done in `dispatch_cgi'.
 
     with OUT.redirect_to(CGI.HTTPOutput()):
-      with CGI.cgi_errors(cgi_setup): dispatch_cgi()
+      with U.Escape() as CGI.HEADER_DONE:
+        with CGI.cgi_errors(cgi_setup):
+          dispatch_cgi()
 
   elif 'USERV_SERVICE' in ENV:
     ## This is a Userv request.  The caller's user name is helpfully in the