16 个版本
0.1.15 | 2022年12月4日 |
---|---|
0.1.14 | 2020年11月17日 |
0.1.13 | 2020年8月22日 |
0.1.12 | 2020年6月27日 |
0.1.3 | 2019年12月30日 |
#283 在 网络编程
36KB
780 行
phd
是一个小巧、易于使用的 Gopher 服务器。
将其指向一个目录,它将通过 Gopher 服务器提供所有文本文件、子目录和二进制文件。任何 .gph
文件都将作为 gophermaps 提供服务,并且可执行的 .gph
文件将作为程序运行,其输出将提供给客户端,就像过去的辉煌的 cgi-bin 时代一样!
~ 特殊文件 ~
header.gph
: 如果在目录中存在,其内容将显示在目录内容之上。在其中放置 ASCII 艺术作品。footer.gph
: 与之相同,但将在目录内容下方显示。index.gph
: 完全用此文件中的内容替换目录的内容。??.gph
: 访问gopher://yoursite/1/dog/
将尝试从磁盘渲染dog.gph
。访问/1/dog.gph
将渲染 .gph 文件的原始内容。.reverse
: 如果存在,将按逆字母数字顺序列出目录内容。如果您按日期排序帖子,则非常有用。
在 .gph
文件中的任何一行,如果不包含制表符 (\t
),将自动添加一个 i
前缀,将其转换为 Gopher 信息项。
为了您的方便,phd 支持 geomyidae 语法来创建链接
This is an info line.
[1|This is a link|/help|server|port]
[h|URL Link|URL:https://noogle.com]
server
和 port
将转换为活动运行服务器的服务器和端口,例如 localhost
和 7070
。
包含制表符(\t
)的任何行都将原样发送到客户端,这意味着您还可以编写并提供原始的Gophermap文件。
~ 动态内容 ~
任何标记为可执行的.gph
文件将作为独立程序运行,其输出将发送到客户端。它将传递三个参数:查询字符串(如果有)、服务器的主机名和当前端口。您可以根据需要进行处理。
例如
$ cat echo.gph
#!/bin/sh
echo "Hi, world! You said:" $1
echo "1Visit Gopherpedia / gopherpedia.com 70"
然后
$ gopher-client gopher://127.0.0.1/1/echo?something
[INFO] Hi, world! You said: something
[LINK] Visit Gopherpedia
或者更严重的是
$ cat figlet.gph
#!/bin/sh
figlet $1
然后
$ gopher-client gopher://127.0.0.1/1/figlet?hi gopher
[INFO] _ _ _
[INFO] | |__ (_) __ _ ___ _ __ | |__ ___ _ __
[INFO] | '_ \| | / _` |/ _ \| '_ \| '_ \ / _ \ '__|
[INFO] | | | | | | (_| | (_) | |_) | | | | __/ |
[INFO] |_| |_|_| \__, |\___/| .__/|_| |_|\___|_|
[INFO] |___/ |_|
~ Ruby on Rails ~
sh
很有趣,但对于严肃的工作,您需要使用像Ruby、PHP或Node.JS这样的严肃脚本语言。
$ cat sizes.gph
#!/usr/bin/env ruby
def filesize(file)
(size=File.size file) > (k=1024) ? "#{size/k}K" : "#{size}B"
end
puts "~ file sizes ~"
spaces = 20
Dir[__dir__ + "/*"].each do |entry|
name = File.basename entry
puts "#{name}#{' ' * (spaces - name.length)}#{filesize entry}"
end
现在您终于可以与世界分享目录的文件大小了!
$ phetch -r 0.0.0.0:7070/1/sizes
i~ file sizes ~ (null) 127.0.0.1 7070
iCargo.toml 731B (null) 127.0.0.1 7070
iLICENSE 1K (null) 127.0.0.1 7070
iMakefile 724B (null) 127.0.0.1 7070
itarget 288B (null) 127.0.0.1 7070
iphd 248K (null) 127.0.0.1 7070
iCargo.lock 2K (null) 127.0.0.1 7070
iREADME.md 4K (null) 127.0.0.1 7070
img 96B (null) 127.0.0.1 7070
isizes.gph 276B (null) 127.0.0.1 7070
isrc 224B (null) 127.0.0.1 7070
~ 使用方法 ~
Usage:
phd [options] <root directory>
Options:
-r, --render SELECTOR Render and print SELECTOR to stdout only.
-h, --host HOST Hostname for links. [Default: {host}]
-p, --port PORT Port for links. [Default: {port}]
-b, --bind ADDRESS Socket address to bind to. [Default: {bind}]
--no-color Don't show colors in log messages.
Other flags:
-h, --help Print this screen.
-v, --version Print phd version.
Examples:
phd ./path/to/site # Serve directory over port 7070.
phd -p 70 docs # Serve 'docs' directory on port 70
phd -h gopher.com # Serve current directory over port 7070
# using hostname 'gopher.com'
phd -r / ./site # Render local gopher site to stdout.
~ 安装 ~
在macOS上,您可以使用Homebrew进行安装。
brew install xvxx/code/phd
Linux、Mac和Raspberry Pi的二进制文件可在gopher://phkt.io/1/releases/phd和https://github.com/xvxx/phd/releases找到。
只需将phd
程序解压/解tar到您的$PATH
中,然后开始使用!
如果您有cargo,您可以直接安装该包。
cargo install phd --locked
~ 开发 ~
cargo run -- ./path/to/gopher/site
~ 资源 ~
- gopher://bitreich.org/1/scm/geomyidae/files.gph
- https://github.com/gophernicus/gophernicus/blob/master/README.Gophermap
- https://gopher.zone/posts/how-to-gophermap/
- rfc 1436
~ 待办事项 ~
- systemd配置,或者类似的东西
- TLS支持
- 用户输入清理测试
~ 状态 ~
phd不再处于积极开发状态,但最新版本运行良好。
依赖项
~225–420KB