62 lines
2.3 KiB
TypeScript
Executable File
62 lines
2.3 KiB
TypeScript
Executable File
/**
|
||
* 模块: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)
|
||
}
|
||
}
|