将 DNSPOD 导出格式转为 CloudFlare 格式的工具

在线地址: https://wsd.pages.dev/tool/dnspod2cf/
github: github.com/mscststs/wsd-pages


前情提要

主要功能:将 DNSPOD 导出的 Zone 格式转为 CloudFlare 能识别的格式。

原因:在将域名从 DNSPOD 接入到 CloudFlare 时,如果域名下的记录较多,手动添加记录会非常痛苦,但是 DNSPOD 导出的格式又不能直接被 CloudFlare 识别,因此写了这个辅助工具来进行格式转换。

使用方式:

  1. 打开DNSPOD,选择域名进行批量导出,导出类型选择 ZONE
  2. 解压文件,将 .zone 文件拖到网页中
  3. 网页自动下载转换好的文件,将转换好的文件导入到 CloudFlare 即可

注意

受能力和知识限制,并没有详细的对 zone 按标准进行还原,也不能保证所有的记录的转换都是正确的。
请在导入之后自行核对相关记录,以免影响正常使用。

Telegram 切换到中文语言包

TG 在软件内默认没有内置中文语言包,如果需要切换到中文,可以在软件内打开这个链接:

tg://setlanguage?lang=zh-hans-raw

MacOS 设置快捷键关闭屏幕

关于 MACOS 使用快捷键关闭屏幕输出的设置方法。
适用: MacBook 2021+ 、MACOS Montery 12.6+

网上能找到的都是用 ctrl + shift + eject ,但是 MacBook 现在已经没有 Eject 键了,单独按电源键只能锁屏,无法立即关闭屏幕输出。

另外一些方法是使用触发角,设置其中一个为关闭屏幕,但是个人实在不愿意使用。

配置方式

配置自动操作

打开自动操作.app, 打开后选择 快速操作,在左侧找到 运行 shell 脚本,双击添加,设置脚本内容为 pmset displaysleepnow,并且将工作流程输入改为 无输入,如图:

Snipaste_2022-09-20_14-40-08.png

配置好之后使用 command + s 保存,并起一个名字,我这里设置为 关闭屏幕

配置快捷键

打开 系统偏好设置 -> 键盘 -> 快捷键
找到 服务 -> 通用 -> 关闭屏幕,在后面点击设置一个你喜欢的快捷键

Snipaste_2022-09-20_14-43-38.png

至此,你就可以方便地使用快捷键快速关闭屏幕了。

不只是关闭屏幕,所有可以使用shell脚本执行的操作都可以参考这种方式来使用。

Nodejs S3 SDK 上传文件大于 1MB 时超时的问题解决

问题来源:私有化的COS存储、基于S3协议进行读写使用。
问题表现:小于 1MB 的文件可以正常上传,大于1MB 必定超时

问题原因:
网关/Nginx 未对 SDK 发出的请求中携带的 expect:100-continue 请求头进行响应。
Nodejs 的 S3 SDK 在实现上需要等待服务端确认 100-continue 才会继续发送数据,服务端不响应 expect:100-continue 的情况下表现为连接超时。

详情可以看 S3 js SDK 源码:
https://github.com/aws/aws-sdk-js/blob/82d8972c3a9a859437dbf42d81b20f07cf86dd58/lib/services/s3.js#L400-L409

  /**
   * Adds Expect: 100-continue header if payload is greater-or-equal 1MB
   * @api private
   */
  addExpect100Continue: function addExpect100Continue(req) {
    var len = req.httpRequest.headers['Content-Length'];
    if (AWS.util.isNode() && (len >= 1024 * 1024 || req.params.Body instanceof AWS.util.stream.Stream)) {
      req.httpRequest.headers['Expect'] = '100-continue';
    }
  },

https://github.com/aws/aws-sdk-js/blob/649a91dd22044b17dc3719d2d5a79220cdc17f37/lib/http/node.js#L102-L110

    var expect = httpRequest.headers.Expect || httpRequest.headers.expect;
    if (expect === '100-continue') {
      stream.once('continue', function() {
        self.writeBody(stream, httpRequest);
      });
    } else {
      this.writeBody(stream, httpRequest);
    }

RFC 对 Expect:100-continue 的描述
https://www.rfc-editor.org/rfc/rfc2616#section-8.2.3
客户端其实不应该假定服务器一定会响应 100-continue,因为中间可以有若干代理服务不一定能正确完成该响应。

解决方法

  1. 服务端修复这个问题。
  2. SDK 屏蔽 expect Header,不向服务端发送该头部。

由于 S3 SDK 并未暴露该配置,因此无法在SDK端进行屏蔽,属于是底层机制了, 因此目前只能要求服务端进行适配解决。

aws-sdk-js-v3 也就是 @aws-sdk/client-s3 能否解决呢?
不行,v3 版本对于所有携带 Body 的请求都添加了 expect: 100-continue,没有判断 1MB 。
https://github.com/aws/aws-sdk-js-v3/blob/f4c8f09cb89fe34f5deabcdec3936df69a5edb60/packages/middleware-expect-continue/src/index.ts#L14-L31

关于 Nodejs 中对 Header : expect 的处理
https://nodejs.org/api/http.html#http_event_continue
当设置 Expect 请求头时,该请求头会被立即发送。

https://nodejs.org/api/http.html#http_event_continue
当服务器对 Expect 请求头确认时,会触发 continue 事件。