perf: omit search for immutable static requests (#13265)
* perf: omit search for immutable static requests * perf: also applies to /files * fix: exclude /proxy * /files/:key/*を301 redirectに --------- Co-authored-by: tamaina <tamaina@hotmail.co.jp>
This commit is contained in:
		
							parent
							
								
									50817df59c
								
							
						
					
					
						commit
						309a943528
					
				
					 3 changed files with 47 additions and 23 deletions
				
			
		
							
								
								
									
										9
									
								
								packages/backend/src/misc/fastify-hook-handlers.ts
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								packages/backend/src/misc/fastify-hook-handlers.ts
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
				
			
			@ -0,0 +1,9 @@
 | 
			
		|||
import type { onRequestHookHandler } from 'fastify';
 | 
			
		||||
 | 
			
		||||
export const handleRequestRedirectToOmitSearch: onRequestHookHandler = (request, reply, done) => {
 | 
			
		||||
	const index = request.url.indexOf('?');
 | 
			
		||||
	if (~index) {
 | 
			
		||||
		reply.redirect(301, request.url.slice(0, index));
 | 
			
		||||
	}
 | 
			
		||||
	done();
 | 
			
		||||
};
 | 
			
		||||
| 
						 | 
				
			
			@ -27,6 +27,7 @@ import { LoggerService } from '@/core/LoggerService.js';
 | 
			
		|||
import { bindThis } from '@/decorators.js';
 | 
			
		||||
import { isMimeImage } from '@/misc/is-mime-image.js';
 | 
			
		||||
import { correctFilename } from '@/misc/correct-filename.js';
 | 
			
		||||
import { handleRequestRedirectToOmitSearch } from '@/misc/fastify-hook-handlers.js';
 | 
			
		||||
import type { FastifyInstance, FastifyRequest, FastifyReply, FastifyPluginOptions } from 'fastify';
 | 
			
		||||
 | 
			
		||||
const _filename = fileURLToPath(import.meta.url);
 | 
			
		||||
| 
						 | 
				
			
			@ -67,20 +68,23 @@ export class FileServerService {
 | 
			
		|||
			done();
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		fastify.get('/files/app-default.jpg', (request, reply) => {
 | 
			
		||||
			const file = fs.createReadStream(`${_dirname}/assets/dummy.png`);
 | 
			
		||||
			reply.header('Content-Type', 'image/jpeg');
 | 
			
		||||
			reply.header('Cache-Control', 'max-age=31536000, immutable');
 | 
			
		||||
			return reply.send(file);
 | 
			
		||||
		});
 | 
			
		||||
		fastify.register((fastify, options, done) => {
 | 
			
		||||
			fastify.addHook('onRequest', handleRequestRedirectToOmitSearch);
 | 
			
		||||
			fastify.get('/files/app-default.jpg', (request, reply) => {
 | 
			
		||||
				const file = fs.createReadStream(`${_dirname}/assets/dummy.png`);
 | 
			
		||||
				reply.header('Content-Type', 'image/jpeg');
 | 
			
		||||
				reply.header('Cache-Control', 'max-age=31536000, immutable');
 | 
			
		||||
				return reply.send(file);
 | 
			
		||||
			});
 | 
			
		||||
 | 
			
		||||
		fastify.get<{ Params: { key: string; } }>('/files/:key', async (request, reply) => {
 | 
			
		||||
			return await this.sendDriveFile(request, reply)
 | 
			
		||||
				.catch(err => this.errorHandler(request, reply, err));
 | 
			
		||||
		});
 | 
			
		||||
		fastify.get<{ Params: { key: string; } }>('/files/:key/*', async (request, reply) => {
 | 
			
		||||
			return await this.sendDriveFile(request, reply)
 | 
			
		||||
				.catch(err => this.errorHandler(request, reply, err));
 | 
			
		||||
			fastify.get<{ Params: { key: string; } }>('/files/:key', async (request, reply) => {
 | 
			
		||||
				return await this.sendDriveFile(request, reply)
 | 
			
		||||
					.catch(err => this.errorHandler(request, reply, err));
 | 
			
		||||
			});
 | 
			
		||||
			fastify.get<{ Params: { key: string; } }>('/files/:key/*', async (request, reply) => {
 | 
			
		||||
				return await reply.redirect(301, `${this.config.url}/files/${request.params.key}`);
 | 
			
		||||
			});
 | 
			
		||||
			done();
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		fastify.get<{
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -34,6 +34,7 @@ import { ChannelEntityService } from '@/core/entities/ChannelEntityService.js';
 | 
			
		|||
import type { ChannelsRepository, ClipsRepository, FlashsRepository, GalleryPostsRepository, MiMeta, NotesRepository, PagesRepository, ReversiGamesRepository, UserProfilesRepository, UsersRepository } from '@/models/_.js';
 | 
			
		||||
import type Logger from '@/logger.js';
 | 
			
		||||
import { deepClone } from '@/misc/clone.js';
 | 
			
		||||
import { handleRequestRedirectToOmitSearch } from '@/misc/fastify-hook-handlers.js';
 | 
			
		||||
import { bindThis } from '@/decorators.js';
 | 
			
		||||
import { FlashEntityService } from '@/core/entities/FlashEntityService.js';
 | 
			
		||||
import { RoleService } from '@/core/RoleService.js';
 | 
			
		||||
| 
						 | 
				
			
			@ -253,11 +254,16 @@ export class ClientServerService {
 | 
			
		|||
 | 
			
		||||
		//#region vite assets
 | 
			
		||||
		if (this.config.clientManifestExists) {
 | 
			
		||||
			fastify.register(fastifyStatic, {
 | 
			
		||||
				root: viteOut,
 | 
			
		||||
				prefix: '/vite/',
 | 
			
		||||
				maxAge: ms('30 days'),
 | 
			
		||||
				decorateReply: false,
 | 
			
		||||
			fastify.register((fastify, options, done) => {
 | 
			
		||||
				fastify.register(fastifyStatic, {
 | 
			
		||||
					root: viteOut,
 | 
			
		||||
					prefix: '/vite/',
 | 
			
		||||
					maxAge: ms('30 days'),
 | 
			
		||||
					immutable: true,
 | 
			
		||||
					decorateReply: false,
 | 
			
		||||
				});
 | 
			
		||||
				fastify.addHook('onRequest', handleRequestRedirectToOmitSearch);
 | 
			
		||||
				done();
 | 
			
		||||
			});
 | 
			
		||||
		} else {
 | 
			
		||||
			const port = (process.env.VITE_PORT ?? '5173');
 | 
			
		||||
| 
						 | 
				
			
			@ -292,11 +298,16 @@ export class ClientServerService {
 | 
			
		|||
			decorateReply: false,
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		fastify.register(fastifyStatic, {
 | 
			
		||||
			root: tarball,
 | 
			
		||||
			prefix: '/tarball/',
 | 
			
		||||
			immutable: true,
 | 
			
		||||
			decorateReply: false,
 | 
			
		||||
		fastify.register((fastify, options, done) => {
 | 
			
		||||
			fastify.register(fastifyStatic, {
 | 
			
		||||
				root: tarball,
 | 
			
		||||
				prefix: '/tarball/',
 | 
			
		||||
				maxAge: ms('30 days'),
 | 
			
		||||
				immutable: true,
 | 
			
		||||
				decorateReply: false,
 | 
			
		||||
			});
 | 
			
		||||
			fastify.addHook('onRequest', handleRequestRedirectToOmitSearch);
 | 
			
		||||
			done();
 | 
			
		||||
		});
 | 
			
		||||
 | 
			
		||||
		fastify.get('/favicon.ico', async (request, reply) => {
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue