diff --git a/TODO.txt b/TODO.txt index 757acb4..5bdecb9 100644 --- a/TODO.txt +++ b/TODO.txt @@ -24,6 +24,4 @@ documentation & docs site events and observables? no matching route handler request timeout -not handlers -> not implemented -method not allowed error response handler figure out json diff --git a/lib/src/http/kernel/module/ApplyRouteHandlers.ts b/lib/src/http/kernel/module/ApplyRouteHandlers.ts index 712e82d..3aa6365 100644 --- a/lib/src/http/kernel/module/ApplyRouteHandlers.ts +++ b/lib/src/http/kernel/module/ApplyRouteHandlers.ts @@ -4,7 +4,8 @@ import Kernel from '../Kernel.ts' import {Logging} from '../../../service/logging/Logging.ts' import {Request} from '../../Request.ts' import ResponseFactory from '../../response/ResponseFactory.ts' -import ErrorResponseFactory from "../../response/ErrorResponseFactory.ts"; +import {http, error} from '../../response/helpers.ts' +import {HTTPStatus} from '../../../const/http.ts' @Injectable() export default class ApplyRouteHandlers extends Module { @@ -19,12 +20,19 @@ export default class ApplyRouteHandlers extends Module { } public async apply(request: Request): Promise { - if ( - !request.route - || !request.route.handlers - || request.route.handlers.length < 1 - ) { - return request + if ( !request.route ) { // Route not found + const factory = http(HTTPStatus.NOT_FOUND) + return await factory.write(request) + } + + if ( !Array.isArray(request.route.handlers) ) { // Route found but invalid HTTP method + const factory = http(HTTPStatus.METHOD_NOT_ALLOWED) + return await factory.write(request) + } + + if ( request.route.handlers.length < 1 ) { // Route and method found, but no handlers + const factory = http(HTTPStatus.NOT_IMPLEMENTED) + return await factory.write(request) } let current_request: Request = request @@ -43,8 +51,8 @@ export default class ApplyRouteHandlers extends Module { this.logger.error(e) // TODO determine response type (html | json, &c.) - const error_response: ErrorResponseFactory = this.make(ErrorResponseFactory, e) - return await error_response.write(request) + const factory = error(e) + return await factory.write(request) } } diff --git a/lib/src/http/response/helpers.ts b/lib/src/http/response/helpers.ts index 50f93c8..b94ae21 100644 --- a/lib/src/http/response/helpers.ts +++ b/lib/src/http/response/helpers.ts @@ -5,9 +5,9 @@ import ErrorResponseFactory from './ErrorResponseFactory.ts' import {Rehydratable} from '../../support/Rehydratable.ts' import DehydratedStateResponseFactory from './DehydratedStateResponseFactory.ts' import TemporaryRedirectResponseFactory from './TemporaryRedirectResponseFactory.ts' -import {HTTPStatus} from "../../const/http.ts"; -import HTTPErrorResponseFactory from "./HTTPErrorResponseFactory.ts"; -import HTTPError from "../../error/HTTPError.ts"; +import {HTTPStatus} from '../../const/http.ts' +import HTTPErrorResponseFactory from './HTTPErrorResponseFactory.ts' +import HTTPError from '../../error/HTTPError.ts' export function json(value: any): JSONResponseFactory { return make(JSONResponseFactory, value) @@ -30,6 +30,6 @@ export function redirect(destination: string): TemporaryRedirectResponseFactory return make(TemporaryRedirectResponseFactory, destination) } -export function http(status: HTTPStatus, message?: string) { +export function http(status: HTTPStatus, message?: string): HTTPErrorResponseFactory { return make(HTTPErrorResponseFactory, new HTTPError(status, message)) }