2008-11-12 6 views
5

J'ai un client j2me qui envoie des données codées en bloc à un serveur Web. Je voudrais traiter les données en python. Le script est exécuté en tant que script CGI, mais Apache refusera apparemment une demande de message codé en segments dans un script CGI. Pour autant que je puisse voir mod_python, WSGI et FastCGI ne le sont pas non plus.Traitement de requêtes HTTP POST codées par blocs dans python (ou CGI générique sous Apache)

Je voudrais savoir s'il existe un moyen d'avoir un script python pour traiter ce type d'entrée. Je suis ouvert à toute suggestion (par exemple un paramètre de confoguration dans apache2 qui assemblerait les morceaux, un serveur python autonome qui ferait la même chose, etc.) J'ai fait beaucoup de googling et je n'ai rien trouvé d'utilisable, ce qui est assez étrange. Je sais que le recours à Java sur le serveur serait une solution, mais je ne peux pas imaginer que cela ne puisse être résolu avec apache + python.

+0

Je serais heureux de le résoudre avec la configuration, alors s'il vous plaît laissez-moi savoir si vous avez une idée de quoi et comment configurer dans Apache 2 (.2). –

+0

Il est en effet possible de le faire avec un changement de configuration mineur.Voir ma réponse pour plus de détails. –

Répondre

1

Peut-être que c'est un problème de configuration? Django peut être configuré avec Apache par mod_python, WSGI et FastCGI et il peut accepter les téléchargements de fichiers.

2

Apache 2.2 mod_cgi fonctionne très bien pour moi, Apache décoche de façon transparente la requête lorsqu'elle est transmise à l'application CGI. WSGI ne permet actuellement pas les requêtes groupées, et mod_wsgi les bloque en effet avec une réponse 411. C'est sur la planche à dessin pour WSGI 2.0. Mais félicitations pour trouver quelque chose qui fait des demandes de morceaux, je n'en ai jamais vu un auparavant!

6

J'ai eu exactement le même problème il y a un an avec un client J2ME parlant à un backend Python/Ruby. La seule solution que j'ai trouvé ne nécessite pas de modifications au niveau de l'application ou de l'infrastructure était d'utiliser une fonction relativement inconnue de mod_proxy. Mod_proxy a la capacité de mettre en tampon les requêtes entrantes (en bloc), puis de les réécrire en une seule requête avec un en-tête Content-Length avant de les transmettre à un backend proxy. L'astuce est que vous pouvez créer une configuration proxy minuscule qui transmet la demande au même serveur Apache. c'est-à-dire prendre une requête entrante en bloc sur le port 80, la "décoder" et la transmettre à votre serveur non compatible HTTP 1.1 sur le port 81.

J'ai utilisé cette configuration en production pendant un peu plus d'un an sans problèmes. Il semble un peu quelque chose comme ceci:

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> 

J'ai aussi un writeup du problème et ma solution détaillée on my blog.

+0

+1 belle trouvaille! Je ne savais pas que mod_proxy pouvait le faire. –

+0

J'ai utilisé la même configuration sur Ubuntu 8.04/apache 2.2.8 mais je reçois cette erreur dans le journal du proxy: [erreur] proxy: Chunked Transfer-Encoding n'est pas supporté – sharjeel

+0

le lien vers le blog est cassé – bubakazouba

2

Vous ne pouvez pas faire ce que vous voulez avec mod_python. Vous pouvez le faire avec mod_wsgi si vous utilisez la version 3.0. Vous devez cependant sortir de la spécification WSGI 1.0 car WSGI interdit efficacement le contenu des requêtes en blocs.

Recherchez WSGIChunkedRequest dans http://code.google.com/p/modwsgi/wiki/ChangesInVersion0300 pour ce qui est requis.

Questions connexes