使用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的主要问题:
- 未将PATH环境变量传给CGI程序,导致以#!/usr/bin/env python开头的脚本文件不能运行
- 未将POST的参数传给CGI程序
- 未将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社区。
- 使用hunchentoot-cgi有感
- 使用hunchentoot搭建lispweb 服务器
- 使用hunchentoot搭建Lisp web 服务器。
- CGI使用
- 使用struts有感!
- Subversion使用有感
- 使用flashMX2004组件有感
- c#使用有感
- 使用windows系统还原有感
- flex使用有感
- echo使用有感
- 使用CEvent有感
- 5800xm使用有感
- Ylmf OS使用有感
- 学习使用DOTNETTEXTBOX有感
- VS2010RC使用有感
- 使用webQQ2有感
- jquery使用有感
- 产品经理要做真正的武林高手
- windows 8 metro app 实现div切换的做法
- 一位技术管理人员的20年工作经历和感悟
- 深入理解PHP中的变量
- Oracle 闪回
- 使用hunchentoot-cgi有感
- 在android中使用proguard混淆代码出现“Conversion to Dalvik format failed with error 1”错误的解决方法
- jQueryMobile的主题(theme)和调板(swatches)
- build boost on mac
- Hadoop Map/Reduce教程
- POI导出EXCEL经典实现
- 18 个 jQuery Mobile 开发贴士和教程
- jQuery.validate.js API
- 转 -- 说说REST