Может ли hunchentoot принимать CGI-приложение? - PullRequest
1 голос
/ 30 сентября 2011

У нас есть CGI-приложение, разработанное с использованием python, которое можно легко разместить в Erlang YAWS:

>cat ~/yaws.conf
...
<server 192.168.1.2>
    port = 8000
    listen = 0.0.0.0
    docroot = /media/G/www/qachina/
    access_log = false
    appmods = <cgi-bin, yaws_appmod_cgi>
</server>
...

Теперь мы хотим разместить приложение на веб-сервере lisp.Может, hunchentoot может это сделать?

С уважением!

Ответы [ 3 ]

1 голос
/ 04 января 2012

Возможно что-то связанное с символами EOL.

Из Документов Chunga API вы можете увидеть, что функция read-line * ожидаетCR как маркер EOL, который не используется по умолчанию для * nixes.Следующее должно заставить это работать (это работает для меня):

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

РЕДАКТИРОВАТЬ: дальнейшее чтение описания * accept-bogus-eols * Я могуУзнайте, почему это нормальное поведение Chunga: сама библиотека соответствует RFC2616 (HTTP 1.1), в котором маркер EOL по умолчанию для протокола HTTP - CRLF.

0 голосов
/ 05 января 2012

Странное поведение с "путями слияния":

* (merge-pathnames  "nav.py" "/media/E/myapp/cgi-bin/")
#P"/media/E/myapp/cgi-bin/nav.py"

это нормально работает в SBCL REPL.Однако при взломе «create-cgi-dispatcher-and-handler» я добавляю следующие строки:

(defun create-cgi-dispatcher-and-handler (uri-prefix base-path &optional content-type)
;...
(format t "SName=~A SPath=~A BPath=~A~% the path is ~A~%" script-name script-path base-path (merge-pathnames script-path base-path))
;...

Вызывая его так:http://127.0.0.1:8000/cgi-bin/nav.py, сообщает:

SName=/cgi-bin/nav.py SPath=nav.py BPath=/media/E/myapp/cgi-bin/
the path is /media/E/myapp/nav.py

Коротким словом:

(пути слияния "nav.py" "/ media / E / myapp / cgi-bin /") возвращает#P "/media/E/myapp/cgi-bin/nav.py" в REPL.Но он возвращает "/media/E/myapp/nav.py" в hunchentoot-cgi.lisp.

С уважением!

0 голосов
/ 28 декабря 2011

Я установил hunchentoot-cgi и проверил его.Ниже приведен простой файл сценария Python:

>cat cgi-bin/nav.py
#!/usr/local/bin/python
# -*- coding: utf-8 -*- 

print "Content-type: text/html\n\n"
print """from Python"""

когда я посетил http://127.0.0.1:8000/cgi-bin/nav.py, hunchentoot сообщил:

11111111111111111
**End of file, but expected #\Newline.**
[2011-12-28 13:35:16 [ERROR]] error in handle-cgi-script from URL /cgi-bin/nav.py
127.0.0.1 - [2011-12-28 13:35:16] "GET /cgi-bin/nav.py HTTP/1.1" 200 - "-"    
"Opera/9.80 (X11; FreeBSD 8.2-RELEASE i386; U; zh-cn) Presto/2.10.229 Version/11.60"

Взломав hunchentoot-cgi.lisp, я нашелФункция «handle-cgi-script» сообщила об ошибке:

 (handler-case
  (with-input-from-program (in path nil env)
  (format t "11111111111111111~%")
  (chunga:with-character-stream-semantics
      (loop for line = (chunga:read-line* in)
       until (equal line "")
       do
         (format t "22222222222222222:~A~%" line)
         (destructuring-bind (key val)
              (ppcre:split ": " line :limit 2)
              (setf (hunchentoot:header-out key) val))
              (format t "22222222222222222~%")))
  (format t "33333333333333333~%")
  (let ((out (flexi-streams:make-flexi-stream
      (tbnl:send-headers)
      :external-format tbnl::+latin-1+)))
      (copy-stream in out 'character))
  (format t "33333333333333333~%"))
  (error (error)
      (format t "~A~%" error)
      (tbnl:log-message* :error "error in handle-cgi-script from URL ~A"
      (tbnl:request-uri*))))

Любое предложение приветствуется!

...