从Java

时间:2015-08-12 14:51:03

标签: java mercurial jetty cgi hgweb

我有Jetty Web服务器,我想从中运行hgweb.cgi:

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

然后我创建Process process = builder.start();并将请求的输入流提供给进程形成服务器响应。但是有一个问题:我无法理解的某种python错误

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

这在命令行中也不起作用。我尝试添加标题(SCRIPT_NAME,“”)以形成对hgweb.cgi的请求,但继续看到该消息。

在每个使用hgweb的例子中,人们使用 apache / lighttpd / nginx 服务器来运行 hgweb.cgi ,我无法理解为什么nodody会做我想做的事情

如果有人可以帮我配置 hgweb.cgi 或告诉我从java调用 .cgi 脚本的正确方法,我会非常高兴的!

2 个答案:

答案 0 :(得分:1)

我认为你找不到任何例子的原因是从每个请求调用Java的python可执行文件并不是任何人都推荐的。这是缓慢而不安全的。考虑通过管道与Command Server进行通信,该管道重用单个python进程,并且专门针对这类事情而设计。甚至还有Java客户端库。

如果你真的想尝试将mercurial作为一个独立的进程从java调用,你不需要调用.cgi(或wsgi,它看起来像你得到的)。只需直接调用主python可执行文件,提供命令行参数和stdin。

答案 1 :(得分:0)

要从java调用cgi,你不需要调用hgweb.cgi(还有一件事我想通了:.cgi只不过是一个告诉你程序目的的标志。没有特殊的语言对于cgi或函数签名,你必须照顾)。我制作了一个脚本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)

几行代码调用该脚本:

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)
 */

我认为这正是我所需要的。如果我发现任何问题 - 我会在这里写下来。 感谢Ry4an提供帮助。