2015-08-12 3 views
1

Je serveur web Jetty à partir de laquelle je veux courir hgweb.cgi:Exécuter hgweb.cgi de Java

ProcessBuilder builder = new ProcessBuilder("/MyPath/hgweb.cgi"); 

Puis-je créer Process process = builder.start(); et le courant d'alimentation d'entrée de la demande à la réponse du serveur formant processus. Mais il y a un problème: une sorte d'erreur de python Je ne peux pas comprendre

File "<stdin>", line 1, in <module> 
    File "mercurial/hgweb/wsgicgi.py", line 76, in launch 
    content = application(environ, start_response) 
    File "mercurial/hgweb/hgweb_mod.py", line 168, in __call__ 
    return self.run_wsgi(req) 
    File "mercurial/hgweb/hgweb_mod.py", line 177, in run_wsgi 
    req.url = req.env['SCRIPT_NAME'] 
KeyError: 'SCRIPT_NAME 

qui ne fonctionne pas de la ligne de commande non plus. J'ai essayé d'ajouter un en-tête (SCRIPT_NAME, "") pour former la requête pour hgweb.cgi mais continuer à voir ce message.

Dans chaque exemple d'utilisation de personnes utilisent hgweb apache/lighttpd/nginx serveurs pour exécuter hgweb.cgi et je ne peux pas comprendre pourquoi nodody fait ce que je veux faire.

Si quelqu'un pouvait me aider à la configuration hgweb.cgi ou m'a dit une bonne façon d'appeler Cgi script java je serais vraiment heureux!

Répondre

1

Je pense que la raison pour laquelle vous ne trouvez pas d'exemples est que l'appel d'un exécutable python Java pour chaque requête n'est pas quelque chose que quelqu'un recommande. C'est lent et non sécurisé. Envisager de communiquer via un tube avec le Command Server qui réutilise un seul processus python et a été conçu pour exactement ce genre de chose. Il existe même des bibliothèques client Java.

Si vous voulez vraiment essayer d'appeler jurgen en tant que processus séparé, vous n'avez pas besoin d'appeler le .cgi (ou le wsgi qui ressemble à ce que vous obtenez). Appelez simplement l'exécutable python principal en fournissant les arguments de la ligne de commande et stdin.

+0

J'ai déjà regardé la librairie Command Server et JavaHg et la seule raison pour laquelle je ne l'ai pas utilisée - c'est mort. Il y a aussi très peu d'exemples. Rien excepté les tests unitaires dans leur dépôt peut me montrer comment faire face à javahg. C'est pourquoi je regarde hgweb.cgi. Mais ta réponse m'a embrouillé! Je vais réfléchir une fois de plus à ces outils et prendre une décision finale. Mais tu m'as donné l'impression que mon travail n'était pas désespéré comme je le pensais. Je vais me reposer quelques jours et ensuite parler de ma décision. –

+0

Malgré votre réponse, j'ai décidé d'invoquer mercurial comme un processus séparé. Cela semble correct mais je ne l'ai pas testé avec beaucoup d'utilisateurs. –

+0

Bonne affaire, je suis content que vous l'ayez compris. Quelqu'un d'autre voudra probablement faire la même chose, donc c'est bien quand vous pouvez lier à la partie clé de votre solution. Si vous l'ajoutez en tant que 2ème réponse, je voterai pour cela. Rappelez-vous cependant, qu'appeler des exécutables est un moyen très simple de laisser couler l'injection du shell, alors assurez-vous de désinfecter ces entrées! –

0

Pour appeler cgi de Java, vous n'avez pas besoin d'appeler hgweb.cgi (il y a une chose de plus que j'ai compris: .cgi n'est rien de plus qu'un simple signe qui vous indique le but du programme. langue pour CGI ou la signature de la fonction, vous devez prendre soin de). J'ai fait un script hgweb.py:

import os 
from mercurial import demandimport 
from mercurial.hgweb import hgweb, wsgicgi 

repositoryPath = os.environ['REPOSITORY_PATH'] 

application = hgweb(repositoryPath) 
wsgicgi.launch(application) 

quelques lignes de code Invoke ce script:

ProcessBuilder process = new ProcessBuilder("python", "hgweb.py"); 

//pass all necessary environment variables 
Map<String, String> env = process.environment(); 
env.put("variable", "value"); 
.. 
//then pick a directory where your process will run 
process.directory(yourDirectory); 
process.start(); 
/* then set up 
* inputStream from request 
* outputStream for response 
* errorStream that is very useful if something went wrong 
* (you may forget to add an environment variable or something like that) 
*/ 

Je pense que c'est exactement ce que je avais besoin. Si je trouve des problèmes, j'écrirais à leur sujet ici. Merci à Ry4an pour aider.