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

62 lines
2.3 KiB
TypeScript
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/**
* 模块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)
}
}