origin/packages/tus/src/handlers/OptionsHandler.ts

62 lines
2.3 KiB
TypeScript
Raw Normal View History

2025-01-06 08:45:23 +08:00
/**
* OptionsHandler
* TUS协议的OPTIONS请求TUS协议版本
* 使TUS文件上传协议中OPTIONS请求获取服务器支持的功能和配置
*/
import { ALLOWED_METHODS, HEADERS, MAX_AGE } from '../utils'
import { BaseHandler } from './BaseHandler'
import type http from 'node:http'
/**
* OptionsHandler类
* TUS协议的OPTIONS请求
* BaseHandler
* 使
* const handler = new OptionsHandler(store, options)
* handler.send(req, res)
*/
export class OptionsHandler extends BaseHandler {
/**
* OPTIONS请求并发送响应
* @param req - HTTP请求对象
* @param res - HTTP响应对象
* @returns Promise<void>
*
* 1.
* 2. TUS协议版本
* 3. CORS相关头信息
* 4. 204 No Content状态码
* BaseHandler的异常处理机制
*/
async send(req: http.IncomingMessage, res: http.ServerResponse) {
// 获取服务器配置的最大文件大小
const maxSize = await this.getConfiguredMaxSize(req, null)
// 设置TUS协议版本头固定为1.0.0
res.setHeader('Tus-Version', '1.0.0')
// 如果存储模块支持扩展功能设置TUS扩展头
if (this.store.extensions.length > 0) {
res.setHeader('Tus-Extension', this.store.extensions.join(','))
}
// 如果配置了最大文件大小设置TUS最大文件大小头
if (maxSize) {
res.setHeader('Tus-Max-Size', maxSize)
}
// 合并默认和自定义的允许头信息
const allowedHeaders = [...HEADERS, ...(this.options.allowedHeaders ?? [])]
// 设置CORS相关头信息
res.setHeader('Access-Control-Allow-Methods', ALLOWED_METHODS)
res.setHeader('Access-Control-Allow-Headers', allowedHeaders.join(', '))
res.setHeader('Access-Control-Max-Age', MAX_AGE)
// 返回204 No Content状态码表示请求成功但无内容返回
return this.write(res, 204)
}
}