import Module from '../Module.ts' import Kernel from '../Kernel.ts' import PrepareRequest from './PrepareRequest.ts' import Routing from '../../../unit/Routing.ts' import {Logging} from '../../../service/logging/Logging.ts' import {Request} from '../../Request.ts' import Config from '../../../unit/Config.ts' import ActivatedRoute from '../../routing/ActivatedRoute.ts' import {Injectable} from '../../../../../di/src/decorator/Injection.ts' /** * HTTP kernel middleware to resolve and mount the registered route onto the request. * @extends Module */ @Injectable() export default class MountActivatedRoute extends Module { public static register(kernel: Kernel) { kernel.register(this).after(PrepareRequest) } constructor( protected readonly routing: Routing, protected readonly config: Config, protected readonly logger: Logging, ) { super() } /** * Parse and resolve the route and mount it into the request object. * @param {Request} request */ public async apply(request: Request): Promise { let incoming = this.routing.resolve([request.path]) this.logger.info(`${request.method} ${incoming}`) const prefix: string | undefined = this.config.get('server.prefix') const allow_mount_without_prefix: boolean = this.config.get('server.allow_mount_without_prefix') if ( prefix && this.routing.resolve([prefix]) !== '/' ) { if ( incoming.startsWith(prefix) ) { incoming = this.routing.resolve([incoming.replace(prefix, '')]) this.logger.verbose(`Resolved prefix: ${incoming}`) } else if ( !allow_mount_without_prefix ) { this.logger.warn(`Will not attempt to mount route with missing prefix: ${incoming}`) this.logger.debug('To allow this, set the config server.allow_mount_without_prefix = true.') return request } } const activated_route: ActivatedRoute | undefined = this.routing.build(incoming, request.method.toLowerCase()) if ( activated_route ) { this.logger.verbose(`Resolved activated route: ${activated_route.route.route}`) request.route = activated_route } else { this.logger.verbose(`Unable to resolve route to activated route. No matching route was found.`) } return request } }