Почему скрипт python не может получить параметры записи из hunchentoot-cgi? - PullRequest
0 голосов
/ 07 января 2012

hunchentoot-cgi в основном работает с hunchentoot-1.2.2, теперь с некоторыми изменениями:

  1. В #'handle-cgi-script, заменяя :external-format tbnl::+latin-1+ на :external-format tbnl::+utf-8+
  2. Как предложил WhiteCat, используйте #'make-pathname, как показано ниже:

    (pushnew (hunchentoot-cgi::create-cgi-dispatcher-and-handler
              "/cgi-bin/"
              (make-pathname :directory '(:absolute "media" "E"
                                                    "myapp" "cgi-bin")))
             dispatch-table :test #'equal)
    

Однако я не понимаю, почему скрипт python не может получить параметр POSTed, т. Е. При посещении http://127.0.0:8000/cgi-bin/login.py?cmd=view, login.py может получить значение параметра cmd успешно, но при регистрации в следующей форме login.py не может получить все опубликованные значения (независимо от того, скрыты они или нет):

<html><body>
  <form method='POST' action='cgi-bin/login.py'>
    <input type='text' name='userid'>
    <input type='password' name='userpwd'>
    <input type='submit' value='Login'>
    <input type='hidden' name='cmd' value='view'>
  </form>
</body></html>

Я полагаю, что hunchentoot-cgi не передает опубликованные параметры в скрипт python в соответствии со средой:

  • GET http://127.0.0.1:8000/cgi-bin/nav.py?userid=xyz&cmd=view
    Среда, переданная скрипту python,:

    (SERVER_SOFTWARE=hunchentoot/1.2.2
     SERVER_NAME=127.0.0.1 GATEWAY_INTERFACE=CGI/1.1
     SERVER_PROTOCOL=HTTP/1.1 SERVER_PORT=8000 REQUEST_METHOD=GET
     CONTENT_TYPE=text/html CONTENT_LENGTH=NIL
     SCRIPT_NAME=/cgi-bin/nav.py QUERY_STRING=userid=xyz&cmd=view
     REMOTE_ADDR=127.0.0.1 HTTP_HOST=NIL
     REQUEST_URI=/cgi-bin/nav.py?userid=xyz&cmd=view SERVER_ADDR=NIL
     HTTP_USER_AGENT=Mozilla/5.0 (X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
     HTTP_REFERER=http://127.0.0.1:8000/)
    
  • POST для /cgi-bin/nav.py

    (SERVER_SOFTWARE=hunchentoot/1.2.2
     SERVER_NAME=127.0.0.1 GATEWAY_INTERFACE=CGI/1.1
     SERVER_PROTOCOL=HTTP/1.1 SERVER_PORT=8000 REQUEST_METHOD=POST
     CONTENT_TYPE=text/html CONTENT_LENGTH=NIL
     POST_PARAMETERS=((userid . xyz) (userpwd . 123) (cmd . view))
     SCRIPT_NAME=/cgi-bin/nav.py QUERY_STRING=NIL REMOTE_ADDR=127.0.0.1     
     HTTP_HOST=NIL REQUEST_URI=/cgi-bin/nav.py SERVER_ADDR=NIL
     HTTP_USER_AGENT=Mozilla/5.0 (X11; Linux i686; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
    

Я думаю, что "CONTENT_LENGTH = NIL" не так, не так ли?

Пожалуйста, пролите свет на меня, спасибо!

Ответы [ 2 ]

0 голосов
/ 16 января 2014

старые версии hunchentoot-cgi вообще не поддерживали данные CGI.попробуйте 0.3 или более позднюю версию и сообщите о проблеме на github, если это все еще не решено для вас.

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

После грязного взлома hunchentoot-cgi.lisp, он теперь работает.Тем не менее, хотелось бы, чтобы Сайрус Хармон (http://cyrusharmon.org/blog)) выпустил следующую каноническую версию.

>diff cgi.lisp /media/E/RnD/clisp/hunchentoot-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,83d76
< (if (member (request-method *request*) *methods-for-post-parameters* :test #'eq)
<     (progn
<         (setq query-string (format nil "~{~A~^&~}" (mapcar (lambda (x) (format nil "~A=~A" (car x) (tbnl:url-encode (cdr x)))) (tbnl:post-parameters*))))
<         (setq content-length (parse-integer (header-in :content-length *request*)))
<     )
<     (setq query-string (tbnl:query-string*)))
< 
87c80,81
<                       . ,(format nil "hunchentoot/~A" hunchentoot-asd:*hunchentoot version*))
---
>                       . (format nil "hunchentoot/~A"
>                                 hunchentoot-asd:*hunchentoot-version*))
97c91,92
<                     #+nil ("REMOTE_HOST" . "FIXME!")
---
>                      ("QUERY_STRING" . ,(tbnl:query-string*))
>                      #+nil ("REMOTE_HOST" . "FIXME!")
101,106c96
<                      ("PATH" . ,(sb-unix::posix-getenv "PATH"))
<                      ("QUERY_STRING" . ,query-string)
<                      ("CONTENT_TYPE" . ,(header-in :content-type *request*))
<                      ("CONTENT_LENGTH" . ,content-length)
<                      ;("HTTP_COOKIE" . ,(tbnl:cookies-out*))
<                      ("HTTP_COOKIE" . "userid=xxx")
---
>                          
112,113c102,103
<                      ("HTTP_REFERER" . ,(tbnl:referer))))))
< (format t "ENV is ~A~%" env)
---
>                      ("HTTP_REFERER" . ,(tbnl:referer))))))      
>       
125c115
<           :external-format tbnl::+utf-8+)))
---
>           :external-format tbnl::+latin-1+)))                   
128d117
< (format t "ERROR: ~A~%" error)                   ("HTTP_REFERER" . (tbnl:referer))))))
< (format t "ENV is ~A~%" env)

С уважением!

...