From: Mark Wooding Date: Sat, 13 Jul 2013 15:34:40 +0000 (+0100) Subject: cgi.py: Implement the `HEAD' request method. X-Git-Tag: 1.0.3~3 X-Git-Url: http://www.chiark.greenend.org.uk/ucgi/~mdw/git/chopwood/commitdiff_plain/039df8645aa615ac5647becc3abe7189dfde288e?ds=sidebyside cgi.py: Implement the `HEAD' request method. A simple hack in the HTTP output driver to escape after writing the header. --- diff --git a/cgi.py b/cgi.py index 1aa2917..01fb868 100644 --- 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 --- 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