使用hunchentoot-cgi有感

来源:互联网 发布:朱棣有多残暴 知乎 编辑:程序博客网 时间:2024/05/29 10:10

最近需要用hunchentoot跑一个以前用python开发的CGI程序,使用QuickLisp装好hunchentoot-cgi后发现hunchentoot-cgi在hunchentoot-1.2.2下不能正常运行! 在联系其作者Cyrus Harmon无结果的情况下,决定自己HACK(开放源码就是好哈)。

虽然不熟悉hunchentoot, 但其代码量不大,而且weitz.de写的代码文档易读,代码工整。所以修改hunchentoot-cgi也没花太多时间。大致看了下hunchentoot的输出函数,再参照YAWS的CGI模块,发现了hunchentoot-cgi的主要问题:

  1. 未将PATH环境变量传给CGI程序,导致以#!/usr/bin/env python开头的脚本文件不能运行
  2. 未将POST的参数传给CGI程序
  3. 未将Cookie传给CGI程序

于是对hunchentoot-cgi.lisp中的代码做了如下修改:


71c71<   (let ((time (or (file-write-date path) (get-universal-time))) (query-string) (content-length nil))--->   (let ((time (or (file-write-date path) (get-universal-time))))77,81d76< (if (member (request-method *request*) *methods-for-post-parameters* :test #'eq)<     (setf query-string (format nil "~{~A~^&~}" (mapcar (lambda (x) (format nil "~A=~A" (car x) (tbnl:url-encode (cdr x)))) (tbnl:post-parameters*)))<           content-length (parse-integer (header-in :content-length *request*)))<     (setf query-string (tbnl:query-string*)))< 85c80,81<                       . ,(format nil "hunchentoot/~A" hunchentoot-asd:*hunchentoot-version*))--->                       . (format nil "hunchentoot/~A">                                 hunchentoot-asd:*hunchentoot-version*))95c91,92<                     #+nil ("REMOTE_HOST" . "FIXME!")--->                      ("QUERY_STRING" . ,(tbnl:query-string*))>                      #+nil ("REMOTE_HOST" . "FIXME!")99,104c96<                      ("PATH" . ,(sb-unix::posix-getenv "PATH"))<                      ("QUERY_STRING" . ,query-string)<                      ("CONTENT_TYPE" . ,(header-in :content-type *request*))<                      ("CONTENT_LENGTH" . ,content-length)<                      ("HTTP_COOKIE_IN" . ,(tbnl:cookies-in*))<                      ("HTTP_COOKIE" . "userid=XXX")--->                          110,111c102,103<                      ("HTTP_REFERER" . ,(tbnl:referer))))))< (format t "ENV is ~A~%" env)--->                      ("HTTP_REFERER" . ,(tbnl:referer))))))      >       123c115< :external-format tbnl::+utf-8+)))---> :external-format tbnl::+latin-1+)))                   126d117< (format t "ERROR: ~A~%" error)

当然这不是权威的方法,其中的Cookie及字符编码还是硬编码的(留待以后有时间再改),经过这样简单修改后,此CGI程序已经能正常运行。 使用方法如下:

...

(setf chunga:*accept-bogus-eols* t)

(pushnew (hunchentoot-cgi::create-cgi-dispatcher-and-handler "/cgi-bin/"

    (make-pathname :directory '(:absolute "media" "E" "www" "qachina" "cgi-bin")))

    *dispatch-table* :test #'equal)
(setf
*web-server* (start (make-instance 'hunchentoot:easy-acceptor :port 8000 :document-root #P"/media/E/www/qachina/")))

...

Cliki看看,发现有一些项目似乎也已经没人维护了:

  • Elephant 的最后发布日期是“January 15th, 2008”
  • hunchentoot-cgi的最后发布日期是“June 12, 2009”
  • ...

试着加入一些项目的邮件列表,谈论也是非常不活跃,很久才能收到一封邮件! 个人感觉CL社区有点青黄不接了,难道热衷CL的都是一些像偶一样的“程序老人”微笑 已没精力与时间去维护这些不错的项目?!


国内能像冰河一样能靠CL赚钱谋生的程序员可谓凤毛麟角,但学习CL还是非常有价值的,这一点需要你通过学习去深入体会。如果遇到问题,你可以去如下论坛看看:

comp.lang.lisp 不知道为何不能注册了

stackoverflow  只要你问题表述清楚,一般都能得到答案

LispForum      适合新手


有感而发,衷心希望有更多新人加入CL社区。

原创粉丝点击