Frage Chunked-codierte HTTP-POST-Anfragen in Python (oder generische CGI unter Apache) verarbeiten


Ich habe einen j2me Klienten, der einige chunked codierte Daten zu einem Webserver postte. Ich möchte die Daten in Python verarbeiten. Das Skript wird als ein CGI-Skript ausgeführt, aber anscheinend wird Apache eine chunked codierte Post-Anfrage an ein CGI-Skript ablehnen. Soweit ich Mod_python sehen konnte, sind WSGI und FastCGI auch nicht möglich.

Ich würde gerne wissen, ob es einen Weg gibt, wie ein Python-Skript diese Art von Eingabe verarbeiten kann. Ich bin offen für jeden Vorschlag (zB eine Konfogu- rationseinstellung in Apache2, die die Chunks zusammenstellen würde, einen eigenständigen Python-Server, der das Gleiche tun würde usw.). Ich habe ziemlich viel gegoogelt und nichts Brauchbares gefunden, was ist Recht seltsam.

Ich weiß, dass die Verwendung von Java auf der Serverseite eine Lösung wäre, aber ich kann mir einfach nicht vorstellen, dass dies nicht mit Apache + Python gelöst werden kann.


5
2017-11-12 17:50


Ursprung


Antworten:


Ich hatte genau das gleiche Problem vor einem Jahr mit einem J2ME-Client, der mit einem Python / Ruby-Backend sprach. Die einzige Lösung, die ich gefunden habe, welche nicht Eine Änderung der Anwendung oder der Infrastrukturebene erforderte die Verwendung einer relativ unbekannten Funktion von mod_proxy.

Mod_proxy kann eingehende (chunked) Anfragen zwischenspeichern und dann als einzelne Anfrage mit einem Content-Length-Header umschreiben, bevor sie an ein Proxy-Backend weitergeleitet werden. Der nette Trick ist, dass Sie eine kleine Proxy-Konfiguration erstellen können, die die Anfrage an den gleichen Apache-Server zurückgibt. d. h., nehmen Sie eine eingehende Chunked-Anforderung an Port 80, "dechunk", und geben Sie sie dann an Port 81 an Ihren nicht mit HTTP 1.1 kompatiblen Server weiter.

Ich habe diese Konfiguration für etwas mehr als ein Jahr ohne Probleme in der Produktion verwendet. Es sieht ein bisschen so aus:

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>

Ich habe auch eine vollständige Beschreibung des Problems und meiner Lösung detailliert auf meinem Blog.


6
2017-07-27 11:51



Ich würde sagen, verwenden Sie das verdrehte Framework für den Aufbau Ihres http-Hörers. Twisted unterstützt Chunked-Encoding.

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

Hoffe das hilft.


2
2017-11-12 17:56



Apache 2.2 mod_cgi funktioniert gut für mich, Apache entkoppelt transparent die Anfrage, wie es an die CGI-Anwendung übergeben wird.

WSGI erlaubt derzeit keine Chunked-Anfragen und mod_wsgi blockiert sie tatsächlich mit einer 411-Antwort. Es ist auf dem Zeichenbrett für WSGI 2.0. Aber herzlichen Glückwunsch, dass ich etwas gefunden habe, das Anfragen nach Chunks enthält, ich habe noch nie zuvor ein solches gesehen!


2
2017-11-12 18:32



Mit mod_python kannst du nicht machen, was du willst. Sie können es mit mod_wsgi tun, wenn Sie Version 3.0 verwenden. Sie müssen jedoch die WSGI 1.0-Spezifikation verlassen, da WSGI den Chunked-Request-Inhalt effektiv verbietet.

Suche nach WSGIChunkedRequest in http://code.google.com/p/modwsgi/wiki/ChangesInVersion0300 für was ist erforderlich.


2
2017-07-29 00:13



Vielleicht ist es ein Konfigurationsproblem? Django kann mit Apache von mod_python, WSGI und FastCGI unterstützt werden und kann Datei-Uploads akzeptieren.


1
2017-11-12 18:29