#pastebin #server #mongo-db #command-line #web #restful

app pastebind

一个简单的Pastebin服务器

2个版本

使用旧的Rust 2015

0.1.1 2018年6月3日
0.1.0 2018年6月3日

#31 in #pastebin

MIT/Apache

75KB
1.5K SLoC

Rust 1K SLoC Tera 208 SLoC // 0.0% comments JavaScript 51 SLoC // 0.0% comments

crates.io travis-ci

简单的Pastebin服务器

关于

一个简单的多用途RESTful存储服务器,用Rust编写。它使用MongoDB作为存储后端,使用Iron网络框架进行Web相关操作,并使用highlight.js进行语法高亮。

运行服务

构建(cargo buildcargo build --release)或安装二进制文件(cargo install pastebind)。然后只需使用--help标志启动可执行文件(只生成一个可执行文件)来查看选项。基本上您需要指定MongoDB连接选项,HTML(及sh)模板的路径(服务器仓库中的templates文件夹)和服务器外部地址。

目前不支持干净退出,所以当您想要停止时只需终止进程即可。

用户体验

服务可以通过两种方式使用:通过REST API(和实现它的命令行工具)或通过您的浏览器。

唯一的区别在于下载粘贴。如果您使用某些命令行工具下载,数据(粘贴)将原样传递。但对于浏览器来说,情况不同:如果粘贴被视为文本(纯文本、bash脚本、C++代码等),则会向您展示一个带有语法高亮的漂亮HTML5页面。

注意请注意,浏览器是通过其用户代理来检测的,所以如果您在浏览器中禁用了用户代理的报告,该服务将视为您是REST API用户,并且不会为您提供漂亮的输出(仅针对粘贴,提交表单无论如何都将按预期工作)。

REST API

要上传数据(无论是文本还是文件),只需使用POSTPUT请求发送到/即可。您还可以指定一个文件名作为URI段,例如/file.txt。该服务将以包含粘贴ID的链接回复。该地址应用于以后的粘贴操作。

要指定过期日期,请将查询参数expires添加到您的POSTPUT)请求中,值为您希望的数据过期日期(UTC)的Unix时间戳,例如:以下为2019年1月1日(UTC)的?expires=1546300800。如果您未指定日期,它将设置为服务器的默认值(默认过期时间作为命令行参数传递给服务应用程序)。要使粘贴无时间限制地存储,您必须传递特殊值never,如下所示:?expires=never

要下载数据,请发送一个GET请求到/id,其中id是在上一步获得的粘贴ID。实际上,您不必专门获取ID,只需使用从POSTPUT)返回的链接即可。如果粘贴包含有关文件名的信息,服务将重定向请求到/id/file-name,这样您就可以以正确的名称保存文件。顺便说一下,如果您想在使用wget时利用此功能,请将--content-disposition标志传递到您的命令中。

您还可以选择性地在GET请求中提供所需的文件名,如/id/file-name

要删除一个粘贴,请发送一个DELETE请求到/id,并且该粘贴将被删除(如果存在的话)。

命令行界面

可以通过使用一些简单的命令行工具,如curlwget来利用服务的REST API。服务提供了一个便利的脚本,要下载它,请向/paste.sh URL发送一个GET请求。或者您可以从Git仓库中获取它:[paste.sh](https://github.com/mexus/pastebin/blob/HEAD/bin/templates/paste.sh.tera),但不要忘记将{{prefix}}占位符替换为网站地址(如https://example.com)。

通过浏览器

主页—/—代表一个文本上传表单。为了上传整个文件,特别是二进制文件,我建议使用CLI文件上传器。

/readme处有一个readme页面(在/页面上也有链接)。

顺便说一下,浏览器和命令行客户端(通过用户代理检测)对GET请求的处理方式不同:如果您从命令行请求粘贴,粘贴将以二进制形式提供,即其二进制表示形式,而如果您从浏览器访问页面,则对于文本类型的粘贴将渲染一个漂亮的页面。

性能

待定。

限制

目前,任何传入数据的硬限制为15兆字节。这个限制来自一个BSON文档大小,并为额外数据预留了一部分。

虽然在技术上可以在MongoDB中使用GridFS存储更大的数据块,但在此项目中尚未实现。但它在计划中 :)

依赖项

~25MB
~472K SLoC