实验性双子座服务器
Jetforce的Python项目详细描述
喷射力
新的、正在开发的Gemini协议的实验性TCP服务器。 了解更多here。
功能
- 一个内置的静态文件服务器,支持gemini目录和 CGI脚本
- 具有零外部依赖性的轻量级单文件框架。
- 具有类型提示和黑色样式格式的现代python代码库。
- 支持使用异步事件循环的并发连接
- 松散实现WSGI的可扩展组件 服务器/应用程序模式
安装
需要python 3.7+
最新版本可以从PyPI:
安装$ pip install jetforce
或者,克隆存储库并直接运行脚本:
$ git clone https://github.com/michael-lazar/jetforce
$ cd jetforce
$ python3 jetforce.py
用法
使用--help
标志查看命令行选项:
$ jetforce --help usage: jetforce [-h][--host HOST][--port PORT][--hostname HOSTNAME][--tls-certfile FILE][--tls-keyfile FILE][--tls-cafile FILE][--tls-capath DIR][--dir DIR][--cgi-dir DIR][--index-file FILE] An Experimental Gemini Protocol Server optional arguments: -h, --help show this help message and exit --host HOST Server address to bind to (default: 127.0.0.1) --port PORT Server port to bind to (default: 1965) --hostname HOSTNAME Server hostname (default: localhost) --tls-certfile FILE Server TLS certificate file (default: None) --tls-keyfile FILE Server TLS private key file (default: None) --tls-cafile FILE A CA file to use for validating clients (default: None) --tls-capath DIR A directory containing CA files for validating clients (default: None) --dir DIR Root directory on the filesystem to serve (default: /var/gemini) --cgi-dir DIR CGI script directory, relative to the server's root directory (default: cgi-bin) --index-file FILE If a directory contains a file with this name, that file will be served instead of auto-generating an index page (default: index.gmi)
主机名
因为gemini协议发送请求中的整个URL,所以有必要
声明您的服务器期望在其下接收流量的主机名。
jetforce将拒绝任何与主机名和状态不匹配的请求
第Proxy Request Refused
页
TLS证书
gemini规范要求通过TLS发送所有连接
如果不使用--tls-certfile
标志提供TLS证书文件,
jetforce将自动生成一个临时证书供您使用。这是
很好地简化了开发,但是在您将服务器公开给
公共互联网你应该配置一些更永久的东西。你可以生成
您自己的自签名服务器证书,或从证书中获取一个
像Let's Encrypt这样的权威
下面是jetforce用来生成自签名证书的OpenSSL命令:
$ openssl req -newkey rsa:2048 -nodes -keyout {hostname}.key \
-nodes -x509 -out {hostname}.crt -subj "/CN={hostname}"
jetforce还支持已验证的客户端tls证书。您可以指定
带有--tls-cafile
或--tls-capath
标志的客户端CA已证实的
连接将在其环境中添加REMOTE_USER
变量,
它包含客户端证书的cn属性。关于如何
生成TLS客户端证书不在本自述文件的范围内,但是
你可以找到很多有用的教程
online
目前没有计划支持未经验证(临时)的客户
证书。这是由于python标准的技术限制
库的ssl
模块,将详细描述
here。
静态文件
Jetforce将为/var/gemini/
目录中的静态文件提供服务:
- 以.gmi结尾的文件将被解释为text/gemini类型
- 如果请求一个目录,jetforce将在该目录中查找一个文件
名称为index.gmi
如果存在,索引文件将返回 - 否则,jetforce将生成一个目录列表
CGI脚本
Jetforce实现了官方CGI的稍微修改的版本 规范。因为Gemini比HTTP复杂,所以CGI接口是 也更容易使用。
jetforce实现的主要区别在于cgi脚本 预期将整个gemini响应逐字写入stdout:
- 第一行的状态码和元
- 后续行中的可选响应正文
不允许脚本使用诸如Content-Type
之类的HTTP头响应,
或任何其他特殊的CGI头,如内部文件重定向。
某些特定于HTTP的环境变量(如REQUEST_METHOD
)不是
使用,因为它们在双子座的请求中没有意义。
许可证
这个项目是根据Floodgap Free Software License授权的。
The Floodgap Free Software License (FFSL) has one overriding mandate: that software using it, or derivative works based on software that uses it, must be free. By free we mean simply "free as in beer" -- you may put your work into open or closed source packages as you see fit, whether or not you choose to release your changes or updates publicly, but you must not ask any fee for it.