HTTP 引擎
JavaScript 脚本

JavaScript 脚本

用户可以通过 JavaScript 脚本修改流经 Stash 的 HTTP 请求、响应。

配置格式

http:
  script:
    - match: url-you-want-to-match
      name: your-fancy-script
      type: response # request / response
      require-body: true
      timeout: 20
      argument: ''
 
script-providers:
  your-fancy-script:
    url: https://your-fancy-script.com/your-fancy-script.js
    interval: 86400

参数:

  • match: 脚本匹配的 URL 正则表达式。
  • type: 脚本类型,可选值为 requestresponse
  • require-body: 是否需要请求体 / 响应体,在脚本中处理 body 需要消耗更多的内存空间,仅在必要时启用。
  • timeout: 脚本执行超时时间,单位为秒。
  • argument: 脚本执行时的参数,类型为 string

语法与接口

基础方法

  • $script.name:脚本名称
  • $script.type:脚本类型,如 request, responsetile
  • $script.startTime:脚本开始运行的时间
  • $environment["stash-build"]:Stash Build 编号
  • $environment["stash-version"]:Stash 版本号
  • $environment["language"]:Stash 运行语言
  • $argument:运行参数
  • $done(value):结束脚本运行,释放资源
  • $notification.post(title, subtitle, body):发送 iOS 通知
  • console.log(value):输出日志,脚本日志会输出到单独的文件
  • setTimeout(callback, delay):延迟执行回调函数

持久化存储

  • $persistentStore.write(value, key):写入持久化存储
  • $persistentStore.read(key):读取持久化存储

Request Object

  • $request.url:请求 URL
  • $request.method:请求方法
  • $request.headers:请求头
  • $request.body:请求体,仅在 requires-body: true 时有

Response Object

  • $request.url:请求 URL
  • $request.method:请求方法
  • $request.headers:请求头
  • $response.status:响应状态码
  • $response.headers:响应头
  • $response.body:响应体,仅在 requires-body: true 时有

HTTP Client

  • $httpClient.get(object)
  • $httpClient.put(object)
  • $httpClient.delete(object)
  • $httpClient.head(object)
  • $httpClient.options(object)
  • $httpClient.patch(object)

例子

$httpClient.get('http://www.example.com', (error, response, data) => {
  if (error) {
    console.log(error)
  } else {
    console.log(data)
  }
})
 
$httpClient.post(
  {
    url: 'http://www.example.com',
    headers: { headerKey: 'headerValue' },
    body: '{}', // can be object or string
  },
  (error, response, data) => {
    if (error) {
      console.log(error)
    } else {
      console.log(data)
    }
  }
)

$done(value)

⚠️

对于所有脚本,在结束时候必须调用 $done(value) 方法释放资源。

对于 request 类型的脚本,调用 $done(object) 可以改写 HTTP 请求,object 可以包含下述字段:

  • url:修改请求的 URL
  • headers:修改请求的 headers
  • body:修改请求的 body
  • response:替换 HTTP 响应,不再实际发出 HTTP 请求

你可以调用 $done() 来打断请求,或者 $done({}) 不修改请求的任何内容。

对于 response 类型的脚本,调用 $done(object) 可以改写 HTTP 响应,object 可以包含下述字段:

  • status:修改响应的状态码
  • headers:修改响应的 headers
  • body:修改响应的 body

你可以调用 $done() 来打断请求,或者 $done({}) 不修改响应的任何内容。