Обработка фрагментированных HTTP-запросов POST в python (или универсальный CGI под apache) - PullRequest
5 голосов
/ 12 ноября 2008

У меня есть клиент j2me, который будет публиковать некоторые закодированные данные на веб-сервере. Я хотел бы обработать данные в Python. Сценарий выполняется как CGI, но, очевидно, apache откажется от фрагментированного закодированного почтового запроса к CGI-сценарию. Насколько я мог видеть mod_python, WSGI и FastCGI тоже не годятся.

Я хотел бы знать, есть ли способ заставить скрипт Python обрабатывать этот тип ввода. Я открыт для любых предложений (например, настройка конфогурации в apache2, которая собирает куски, автономный сервер Python, который будет делать то же самое, и т. Д.). Я немного погуглил и не нашел ничего полезного, что довольно странно.

Я знаю, что использование java на стороне сервера было бы решением, но я просто не могу представить, что это не может быть решено с помощью apache + python.

Ответы [ 5 ]

6 голосов
/ 27 июля 2009

Год назад у меня была точно такая же проблема с клиентом J2ME, разговаривающим с бэкэндом Python / Ruby. Единственное найденное мной решение, которое не требует изменения уровня приложения или инфраструктуры, - это использование относительно неизвестной функции mod_proxy.

Mod_proxy имеет возможность буферизовать входящие (чанкованные) запросы, а затем перезаписывать их как один запрос с заголовком Content-Length перед передачей их прокси-серверу. Уловка в том, что вы можете создать крошечную конфигурацию прокси, которая передает запрос обратно на тот же сервер Apache. Т.е. принять входящий запрос на порцию 80, «разгрузить» его, а затем передать на сервер, не совместимый с HTTP 1.1, на порт 81.

Я использовал эту конфигурацию в производстве чуть более года без проблем. Это выглядит примерно так:

ProxyRequests Off

<Proxy http://example.com:81>
  Order deny,allow
  Allow from all
</Proxy>

<VirtualHost *:80>
  SetEnv proxy-sendcl 1
  ProxyPass / http://example.com:81/
  ProxyPassReverse / http://example.com:81/
  ProxyPreserveHost On
  ProxyVia Full

  <Directory proxy:*>
    Order deny,allow
    Allow from all
  </Directory>

</VirtualHost>

Listen 81

<VirtualHost *:81>
  ServerName example.com
  # Your Python application configuration goes here
</VirtualHost>

Я также получил полное описание проблемы, и мое решение подробно описано в моем блоге .

2 голосов
/ 29 июля 2009

Вы не можете делать то, что вы хотите с mod_python. Вы можете сделать это с помощью mod_wsgi, если вы используете версию 3.0. Однако вы должны выйти за пределы спецификации WSGI 1.0, так как WSGI эффективно запрещает содержимое фрагментированных запросов.

Поиск WSGIChunkedRequest в http://code.google.com/p/modwsgi/wiki/ChangesInVersion0300 для того, что требуется.

2 голосов
/ 12 ноября 2008

Apache 2.2 mod_cgi прекрасно работает для меня, Apache прозрачно отсоединяет запрос при его передаче в приложение CGI.

WSGI в настоящее время запрещает фрагментированные запросы, и mod_wsgi действительно блокирует их с ответом 411. Это на чертежной доске для WSGI 2.0. Но поздравляю с тем, что нашел что-то, что выполняет запросы чанка, я никогда не видел ни одного раньше!

2 голосов
/ 12 ноября 2008

Я бы сказал, используйте витую структуру для создания вашего http-слушателя. Twisted поддерживает чанкованное кодирование.

http://python.net/crew/mwh/apidocs/twisted.web.http._ChunkedTransferEncoding.html

Надеюсь, это поможет.

1 голос
/ 12 ноября 2008

Может быть, это проблема конфигурации? Django может работать с Apache через mod_python, WSGI и FastCGI, и он может принимать загрузки файлов.

...